web-dev-qa-db-fra.com

Puis-je ajouter une catégorie Metabox à la pièce jointe?

J'utilise register_taxonomy_for_object_type() pour ajouter le champ Taxonomie de la catégorie aux téléchargements de supports (pièces jointes). J'utilise ce code pour le faire:

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

Cela fonctionne et ajoute un simple champ de texte pour Catégorie à la page Média lors de l'affichage d'une image. Ce que je veux vraiment, c’est d’afficher les catégories Metabox afin que je puisse choisir les catégories que je veux utiliser plutôt que de simplement les taper dans le champ brut. J'ai également constaté que le fait d'insérer le slug d'une catégorie dans ce champ de texte, tel que my-category-name, finissait par afficher le nom de la catégorie tel que My Category Name lors de son enregistrement, ce qui rend le champ de texte simple encore moins utile.

J'examinais la fonction add_post_type_support() pour l'ajout de Metabox et l'avais utilisée pour les types de publication personnalisés. Je ne vois pas s'il est possible d'ajouter la même chose pour les pièces jointes.

18
Rick Curran

Edit: 12/09/2017 Voir cette réponse pour une solution plus moderne: Comment utiliser les taxonomies sur les pièces jointes avec la nouvelle médiathèque?

Je vais répondre à ma propre question car j'ai réussi à trouver une solution à ce que j'ai essayé de faire. Je suis parvenu à la conclusion qu'il n'était pas possible d'activer la catégorie Metabox pour les pièces jointes. Cependant, j’ai trouvé qu’il était assez facile d’obtenir un champ de base pour les catégories ajoutées à la page des pièces jointes en utilisant register_taxonomy_for_object_type et 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');
}

Le champ ajouté a montré comme ceci:

alt text

C’est juste un champ de texte brut, mais j’ai trouvé que vous pouviez taper le nom d’une catégorie existante et qu’elle serait sauvegardée avec succès lorsque la pièce jointe serait mise à jour (le seul comportement étrange est qu’elle rende la version normale au lieu de la limace après la sauvegarde).

Une fois que je me suis rendu compte que je pouvais sauvegarder les catégories de cette façon, j'ai alors pensé que je pouvais obtenir une liste de toutes les catégories disponibles sous forme de cases à cocher et cocher celles qui avaient été sélectionnées. J'ai ensuite utilisé un peu de jQuery pour saisir les valeurs des catégories cochées et mettre les slug de toutes les catégories dans le champ Catégorie. Pour que cela semble encore plus transparent, j'ai ensuite utilisé un simple morceau de CSS pour masquer la ligne du tableau qui contenait le champ Catégorie. Ainsi, vous ne voyez plus que les cases à cocher, comme ceci:

alt text

Maintenant que je peux ajouter des catégories aux images jointes, je peux utiliser quelque chose comme:

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

Et tirez les images classées dans une page! Exactement ce que j'espérais faire, je ne pensais pas qu'il y aurait un moyen de le faire, mais je suis heureux d'avoir réussi à trouver une solution.

J'ai transformé cela en un plugin appelé WOS Media Categories que je peux télécharger à partir de mon site web, Suburbia.org.uk , j'espère que cela pourra être utile à quelqu'un d'autre! Merci encore à ceux qui ont commenté cette question et d’autres questions que j’ai posées ici qui ont aidé à comprendre cela!

Mise à jour: j'ai ajouté un correctif pour permettre l'ajout de catégories pendant le téléchargement des images à l'aide du programme de téléchargement en bloc de Flash.

13
Rick Curran

vient de créer ceci, qui constitue une solution complète au lien javascript herky-jerk avec le champ de formulaire. Comme les valeurs de vos cases à cocher sont passées avec le $ _POST lors de la soumission, vous pouvez simplement les récupérer pendant le filtre add_image_attachment_fields_to_save et définir les conditions de l'objet post.

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

(notez que j'utilise une taxonomie personnalisée, et non des catégories, vous devrez donc modifier le tableau $ categories pour qu'il corresponde au même tableau que celui que vous avez utilisé lors de la configuration de vos cases à cocher)

Shabam, shabozzle. Prendre plaisir.

4
Drew Gourley

J'ai créé un plugin en utilisant les catégories de médias WOS de @ RickCurran comme point de départ. Cependant, WOS Media Categories, à l'instar des autres plug-ins qui ajoutent un support de catégorie aux médias, n'ajoute pas réellement de metabox, c'est ce que j'ai fait.

overall view

Cela simplifie nécessairement les métaboxes des articles et des pages, mais j’ai inclus une capacité de filtrage qui le rend facile à utiliser.

filterable categories

En fait, je génère la totalité de la catégorie metabox que vous voyez sur les pages et les messages, mais je cache les éléments qui ne fonctionnent pas sur la page multimédia en raison d’un manque de style et du javascript manquant.

Je me réjouis de toute idée que quiconque pourrait avoir sur la manière de rendre le metabox pleinement fonctionnel - ce que je compte faire dans une version ultérieure.

1
eddiemoya

Ceci est difficile/compliqué si vous souhaitez utiliser la zone de catégorie par défaut de WordPress. D'une part, la metabox ne renvoie pas la sortie, elle la répète simplement. En plus de cela, il ne vous donnerait pas le nom du champ de saisie correct, donc il ne sauverait pas. Une idée pourrait être d’utiliser un jQuery UI Autocomplete pour répliquer les fonctionnalités de la boîte de balises.

Toutefois, si vous souhaitez jouer avec les champs de l'éditeur multimédia, vous pouvez vous connecter à 'attachment_fields_to_edit' et éditer le tableau de champs. Le filtre passe deux arguments au rappel: le premier argument est le tableau de champs, le second est l'objet post attaché. Voir ici pour plus de détails:

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

1
John P Bloch

Great plugin Rick - très utile.

Si vous déplacez le déclencheur onclick en ligne au lieu de le lier à onload (et effectuez quelques autres modifications mineures), cela fonctionnera également sur le programme de téléchargement en bloc de Flash. Avec la version actuelle, Flash se charge après l'événement de chargement jQuery afin que les objets n'existent pas encore.

js révisé:

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

ajouter onclick pour entrer dans le fichier php:

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

ajouter un identifiant de formulaire d'envoi en masse dans un fichier css:

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

}

0
djbokka