¿Puedo agregar un Metabox de categoría al archivo adjunto?

17

Estoy usando register_taxonomy_for_object_type() para agregar el campo de taxonomía de categoría a las subidas 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 de la categoría real 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 publicación personalizados, simplemente no puedo ver si es posible agregar lo mismo para los archivos adjuntos.

    
pregunta Rick Curran 18.08.2010 - 18:19

5 respuestas

13

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

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, encontré que era bastante fácil obtener un campo básico para Categorías agregadas a la página de 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 agregado se mostró así:

Essolouncampodetextosimple,peroloqueencontréfuequesepodíaescribirelnombredeunacategoríaexistenteallíyseguardaríaconéxitocuandoseactualizaseelarchivoadjunto(elúnicocomportamientoextrañoesquevolvióaserlonormal)versiónenlugardelababosadespuésdeguardar).

Unavezquemedicuentadequepodíaguardarlascategoríasdeestamanera,medicuentadequepodíaobtenerunalistadetodaslascategoríasdisponiblescomocasillasdeverificaciónymarcarlasquesehabíanseleccionado.LuegouséunpocodejQueryparacapturarlosvaloresdelascategoríasmarcadasyponertodaslasbarrasdelascategoríasenelcampoCategoría.Parahacerqueestoparezcaaúnmástransparente,utilicéunpocodeCSSparaocultarlafiladelatablaqueconteníaelcampoCategoría,demodoquetodoloquevessonlascasillasdeverificación,como:

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 jale 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 pueda ser 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: agregué una solución para permitir que se agreguen categorías mientras las imágenes se cargan utilizando el cargador masivo de Flash.

    
respondido por el Rick Curran 20.08.2010 - 19:44
4

acaba 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 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 las casillas de verificación)

Shabam, shabozzle. Disfrutar.

    
respondido por el Drew Gourley 30.12.2011 - 17:53
1

Esto es difícil / complicado si desea usar el cuadro de categoría por defecto de WordPress. Por un lado, el metabox no devuelve la salida, simplemente la 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 Autocomplete para replicar la funcionalidad del cuadro de etiquetas.

Sin embargo, si desea jugar con los campos del editor de medios, puede enlazar a '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:

enlace

    
respondido por el John P Bloch 18.08.2010 - 19:07
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ías a los medios, en realidad no agregan un metabox, solo he hecho eso.

Suformanecesariamentesimplificadaformalosmetaboxesenlaspublicacionesylaspáginas,peroincluíunacapacidaddefiltradoquelohacefácildeusar.

En realidad, estoy generando el metabox de la categoría 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 intento hacer en una versión posterior.

    
respondido por el eddiemoya 17.01.2012 - 01:17
0

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.

js revisados:

 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 a la entrada en el archivo php:

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

agregue el ID del formulario del cargador masivo al archivo css:

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

}

    
respondido por el djbokka 20.10.2010 - 17:23

Lea otras preguntas en las etiquetas