it-swarm-es.com

¿Puedo agregar una categoría al archivo adjunto?

Estoy usando register_taxonomy_for_object_type() para agregar el campo de taxonomía de categoría a las cargas de medios (archivos adjuntos). Estoy usando este código para hacerlo:

add_action('init', 'reg_tax');
function reg_tax() {
   register_taxonomy_for_object_type('category', 'attachment');
}

Esto funciona y agrega un campo de texto simple para Categoría a la página de Medios cuando se ve una imagen. Lo que realmente quiero es hacer que muestre las Categorías de Metabox reales para poder elegir las Categorías que quiero usar en lugar de simplemente escribirlas en el campo llano. También descubrí que colocar el slug para una categoría en este campo de texto como my-category-name termina mostrándose como el nombre real de la categoría como My Category Name cuando se guarda, lo que hace que el campo de texto simple sea una opción aún menos útil.

He estado buscando en la función add_post_type_support() para agregar Metaboxes y he visto que se usa para los tipos de publicaciones personalizadas, simplemente no puedo ver si es posible agregar lo mismo para los archivos adjuntos.

18
Rick Curran

Edición: 12/09/2017 Consulte esta respuesta para obtener una solución más actualizada a esto: ¿Cómo usar las taxonomías en los archivos adjuntos con la nueva biblioteca multimedia?

Voy a responder mi propia pregunta aquí, ya que he logrado encontrar una solución a lo que he estado tratando de hacer. Llegué a la conclusión de que no era posible habilitar la Categoría Metabox para los archivos adjuntos. Sin embargo, descubrí que era bastante fácil obtener un campo básico para Categorías agregadas a la página de archivos adjuntos utilizando register_taxonomy_for_object_type y add_post_type_support:

add_action('admin_init', 'reg_tax');
function reg_tax() {
   register_taxonomy_for_object_type('category', 'attachment');
   add_post_type_support('attachment', 'category');
}

El campo añadido se mostró así:

alt text

Es solo un campo de texto simple, pero lo que encontré fue que podría escribir el nombre de una categoría existente allí y se guardaría con éxito cuando se actualizase el archivo adjunto (el único comportamiento extraño es que volvió a mostrar la versión normal en lugar de la bala después de guardar).

Una vez que me di cuenta de que podía guardar categorías de esta manera, entonces me di cuenta de que podía obtener una lista de todas las categorías disponibles como casillas de verificación y marcar las que se habían seleccionado. Luego usé un poco de jQuery para capturar los valores de las categorías marcadas y poner todas las barras de las categorías en el campo Categoría. Para hacer que esto parezca aún más transparente, luego utilicé un poco de CSS para ocultar la fila de la tabla que contenía el campo Categoría, de modo que todo lo que ves son las casillas de verificación, así:

alt text

Ahora que puedo agregar categorías a los archivos adjuntos de imágenes, puedo usar algo como:

get_posts('post_type=attachment&category_name=timber-fixed-windows')

¡Y jala las imágenes categorizadas en una página! Exactamente lo que esperaba hacer, no pensé que iba a haber una manera de hacerlo, pero me alegro de haber logrado resolver algo.

He convertido esto en un complemento llamado WOS Media Categories que he puesto a disposición para descargar desde mi sitio web, Suburbia.org.uk , ¡espero que sea de utilidad para otra persona! Gracias de nuevo a los que hicieron comentarios sobre esta y otras preguntas que he hecho aquí, ¡que me ayudaron a resolverlo!

Actualización: he agregado una solución para permitir que se agreguen categorías mientras las imágenes se cargan utilizando el cargador masivo de Flash.

13
Rick Curran

acabo de crear esto, que es una solución completa para el enlace javascript de herky-jerk al campo de formulario. Dado que los valores de sus casillas de verificación se pasan junto con el $ _POST en el envío, solo puede capturarlos durante el filtro add_image_attachment_fields_to_save y establecer los términos de la publicación del objeto.

function register_custom_taxonomies() {
    $labels = array(
        'name' => _x( 'Image Formats', 'taxonomy general name' ),
        'singular_name' => _x( 'Image Format', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Formats' ),
        'all_items' => __( 'All Formats' ),
        'parent_item' => __( 'Parent Format' ),
        'parent_item_colon' => __( 'Parent Format:' ),
        'edit_item' => __( 'Edit Format' ), 
        'update_item' => __( 'Update Format' ),
        'add_new_item' => __( 'Add New Format' ),
        'new_item_name' => __( 'New Format Name' ),
        'menu_name' => __( 'Image Format' )
    );
    $capabilities = array(
        'manage_terms' => 'nobody',
        'edit_terms' => 'nobody',
        'delete_terms' => 'nobody'
    );
    $args = array(
        'public' => false,
        'hierarchical' => true,
        'labels' => $labels,
        'capabilities' => $capabilities,
        'show_ui' => false,
        'query_var' => 'image-format',
        'rewrite' => false
    );
    register_taxonomy('image-format', array('attachment'), $args);
}
add_action( 'init', 'register_custom_taxonomies', 1);

function add_media_categories($fields, $post) {
    $categories = get_categories(array('taxonomy' => 'image-format', 'hide_empty' => 0));
    $post_categories = wp_get_object_terms($post->ID, 'image-format', array('fields' => 'ids'));
    $all_cats .= '<ul id="media-categories-list" style="width:500px;">'; 
    foreach ($categories as $category) {
        if (in_array($category->term_id, $post_categories)) {
            $checked = ' checked="checked"';
        } else {
            $checked = '';  
        }
        $option = '<li style="width:240px;float:left;"><input type="checkbox" value="'.$category->category_nicename.'" id="'.$post->ID.'-'.$category->category_nicename.'" name="'.$post->ID.'-'.$category->category_nicename.'"'.$checked.'> ';
        $option .= '<label for="'.$post->ID.'-'.$category->category_nicename.'">'.$category->cat_name.'</label>';
        $option .= '</li>';
        $all_cats .= $option;
    }
    $all_cats .= '</ul>';

    $categories = array('all_categories' => array (
            'label' => __('Image Formats'),
            'input' => 'html',
            'html' => $all_cats
    ));
    return array_merge($fields, $categories);
}
add_filter('attachment_fields_to_edit', 'add_media_categories', null, 2);

function add_image_attachment_fields_to_save($post, $attachment) {
    $categories = get_categories(array('taxonomy' => 'image-format', 'hide_empty' => 0));
    $terms = array();
    foreach($categories as $category) {
        if (isset($_POST[$post['ID'].'-'.$category->category_nicename])) {
            $terms[] = $_POST[$post['ID'].'-'.$category->category_nicename];        
        }
    }
    wp_set_object_terms( $post['ID'], $terms, 'image-format' );
    return $post;
}
add_filter('attachment_fields_to_save', 'add_image_attachment_fields_to_save', null , 2);

(tenga en cuenta que estoy usando una taxonomía personalizada, y no categorías, por lo que tendrá que cambiar la matriz de $ categorías para que coincida con la misma matriz que utiliza cuando configura sus casillas de verificación)

Shabam, shabozzle. Disfrutar.

4
Drew Gourley

He creado un complemento que utiliza las categorías de medios de WOS de @ RickCurran como punto de partida. Sin embargo, las categorías de medios de WOS, al igual que otros complementos que agregan soporte de categorías a los medios, en realidad no agregan un metabox, solo he hecho eso.

overall view

Su forma necesariamente simplificada forma los metaboxes en las publicaciones y las páginas, pero sí incluí una capacidad de filtrado que lo hace fácil de usar.

filterable categories

En realidad, estoy generando la categoría de metabox completa que ves en las páginas y las publicaciones, pero oculto los bits que no funcionan en la página de medios debido a la falta de estilo y al javascript que falta.

Agradezco cualquier idea que alguien pueda tener sobre cómo hacer que el metabox sea completamente funcional, algo que pretendo hacer en una versión posterior.

1
eddiemoya

Esto es difícil/complicado si desea usar el cuadro de categoría predeterminado de WordPress. Por un lado, el metabox no devuelve el resultado, simplemente lo repite. Además de eso, no le daría el nombre de campo de entrada correcto, por lo que no se guardaría. Una idea podría ser usar un jQuery UI Autocompletar para replicar la funcionalidad del cuadro de etiquetas.

Sin embargo, si desea jugar con los campos del editor de medios, puede enlazar con 'attachment_fields_to_edit' y editar la matriz de campos. El filtro pasa dos argumentos a la devolución de llamada: el primer argumento es la matriz de campos, el segundo es el objeto de publicación adjunta. Vea aquí para más detalles:

http://phpxref.ftwr.co.uk/wordpress/nav.html?wp-admin/includes/media.php.source.html#l1025

1
John P Bloch

Gran plugin Rick - muy útil.

Si mueve el activador onclick en línea en lugar de vincularlo a onload (y realiza algunos otros ajustes menores), también funcionará en el cargador masivo de Flash. Con la versión actual, Flash se carga después del evento de carga jQuery, por lo que los objetos aún no existen.

revisado js:

 function wos_category_click(cat){
    var container = jQuery(cat).closest("tbody");
    var cat_checked = jQuery(container).find("tr.all_categories input:checked");
    var cat_arr = jQuery(cat_checked).map(function() {
        return jQuery(this).val();
    }).get().join();
    jQuery(container).find("tr.category > td.field > input.text").val(cat_arr);
}

agregar onclick a la entrada en el archivo php:

<input type="checkbox" onclick="wos_category_click(this)" class="wos-categories-cb"....

añada una ID de formulario de carga masiva al archivo css:

form#media-single-form tr.category,form#file-form tr.category {
display:none; 

}

0
djbokka