¿Puedo agregar una categoría Metabox al archivo adjunto?

18

Estoy usando register_taxonomy_for_object_type()para agregar el campo de taxonomía de categoría a las cargas multimedia (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 al ver una imagen. Lo que realmente quiero es que muestre el Metabox real de Categorías para que pueda elegir las Categorías que quiero usar en lugar de simplemente escribirlas en el campo plano. También descubrí que poner la babosa de una categoría en este campo de texto, por ejemplo, my-category-nametermina mostrándose como el nombre real de la categoría, como My Category Namecuando se guarda, lo que hace que el campo de texto simple sea una opción menos útil.

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

Rick Curran
fuente
Si espera uno o dos días antes de elegir la mejor respuesta, le escribiré un complemento ... (Acabo de recibir los plazos del cliente y una reunión de WordPress para presentar las respuestas de WordPress a esta noche ...)
MikeSchinkel
@ Mike: Gracias, estoy ansioso por ver qué soluciones hay para este problema. Parece que lo que busco es alrededor del 90% en WordPress tal como está, ¡solo queda por ver ese último 10%!
Rick Curran
He hecho algo muy similar con una metabox de publicación personalizada; es decir, incrustar una lista de categorías (básica) (es decir, sin las pestañas para todos / más populares). Solo depende de cómo 'attach_fields_to_edit' implemente su POST. De todos modos, no puedo hacer esta noche. Necesito dormir.
MikeSchinkel
Vaya, como ya lo has respondido, me quitaré la lista de tareas.
MikeSchinkel
@ Mike: Gracias por su ayuda, me encantaría recibir comentarios sobre mi solución. Me alegro de haber encontrado una manera de hacerlo funcionar. Sería genial ver agregar categorías a los archivos adjuntos a través del metabox de categoría real, pero mi solución funciona lo suficientemente bien.
Rick Curran

Respuestas:

14

Edición: 09/12/2017 Vea esta respuesta para obtener una solución más actualizada: ¿Cómo usar las taxonomías en los archivos adjuntos con la nueva Biblioteca de medios?

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 archivos adjuntos. Sin embargo, descubrí que era bastante fácil obtener un campo básico para las Categorías agregadas a la página de archivos adjuntos usando register_taxonomy_for_object_typey 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 agregado se mostró así:

texto alternativo

Es solo un campo de texto sin formato, pero lo que encontré fue que podía escribir el nombre de una categoría existente allí y luego se guardaría con éxito cuando se actualizara el archivo adjunto (El único comportamiento extraño es que devolvió la versión normal en lugar de la babosa después de guardar).

Una vez que me di cuenta de que podía guardar categorías de esta manera, pensé que podría obtener una lista de todas las categorías disponibles como casillas de verificación y marcar las que habían sido seleccionadas. Luego usé un poco de jQuery para tomar los valores de las categorías marcadas y poner todas las babosas de las categorías en el campo Categoría. Para que esto parezca aún más perfecto, utilicé un poco de CSS para ocultar la fila de la tabla que contenía el campo Categoría, por lo que todo lo que ves son las casillas de verificación, así:

texto alternativo

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 arrastre las imágenes categorizadas a 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 Categoriesque he puesto a disposición para descargar desde mi sitio web, Suburbia.org.uk , ¡espero que pueda ser de utilidad para alguien más! Gracias de nuevo a quienes comentaron sobre esta y otras preguntas que he hecho aquí y que me ayudaron a resolverlo.

Actualización: agregué una solución para permitir que se agreguen categorías mientras se cargan las imágenes con el cargador masivo Flash.

Rick Curran
fuente
Me molesta un poco usar jQuery de algo que requiere integridad de datos. Estoy bastante seguro de que todo esto se puede hacer en el servidor. Intentaré verlo pronto.
MikeSchinkel
1
@ Mike: Sí, estoy un poco preocupado por eso también. Sin embargo, hay muchos casos en los que está involucrado JavaScript, así que decidí que estaba bastante contento con esa solución. Sin embargo, definitivamente estoy contento de recibir comentarios sobre métodos alternativos. Cuando tenga la oportunidad, me gustaría enviar esto al repositorio de WordPress, aunque puedo esperar y ver con qué regresas. ¡Gracias!
Rick Curran el
@Mike o @Rick: ¿podría proporcionar otro ejemplo que pueda asignar automáticamente una publicación a una categoría específica cuando se agreguen medios? ¿La asociación de categoría se basaría en el tipo de publicación en la que se encuentra o se establecerá manualmente a través del código?
NetConstructor.com
@ NetConstructor.com - Suena como otra pregunta para mí ...
MikeSchinkel
@ netconstructor.com: Sí, ¡suena como otra gran pregunta para mí!
Rick Curran
4

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

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 $ categories para que coincida con la misma matriz que usa cuando configura sus casillas de verificación)

Shabam, Shabozzle. Disfrutar.

Drew Gourley
fuente
Su función add_image_attachment_fields_to_save necesita devolver $ post al final. wp_set_object_terms( $post['ID'], $terms, 'image-format' ); return $post;. Y el script que publicó no ejecuta register_custom_taxonomies. Pero de todos modos buen guión. Definitivamente usará esto en el futuro!
Rob Vermeer
Oh, vaya, lo improvisé pensando que estaba siendo conveniente. Lo arreglaré aquí en un segundo. Buen punto en el regreso, sin embargo, no estaba teniendo ningún problema con eso.
Drew Gourley
1

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

Sin embargo, si desea jugar con los campos del editor de medios, puede conectar '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 del archivo adjunto. Ver aquí para más detalles:

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

John P Bloch
fuente
Gracias, echaré un vistazo attachment_fields_to_edity veré cómo va eso.
Rick Curran
1

He creado un complemento utilizando las categorías de medios 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ía a los medios, en realidad no agregan un metabox, lo he hecho.

vista general

Es necesariamente simplificado de los metaboxes en publicaciones y páginas, pero incluí una capacidad de filtrado que lo hace fácil de usar.

categorías filtrables

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

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

eddiemoya
fuente
0

Gran complemento Rick, muy útil.

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

js revisado:

 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);
}

agregue onclick para ingresar en el archivo php:

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

agregue la identificación del formulario del cargador masivo al archivo CSS

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

}


fuente
Gracias djbokka! He agregado esa solución a la base de código ahora, he actualizado los archivos de complemento que se pueden descargar desde mi sitio web en suburbia.org.uk/page/projects.html#wos_media_categories
Rick Curran el