Puis-je ajouter un métabox de catégorie à une pièce jointe?

17

J'utilise register_taxonomy_for_object_type() pour ajouter le champ Taxonomie de 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');
}

Ceci 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 la voyais utiliser 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.

    
posée Rick Curran 18.08.2010 - 18:19
la source

5 réponses

13

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

Je vais répondre à ma propre question ici, car j'ai réussi à trouver une solution à ce que j'ai essayé de faire. Je suis parvenu à la conclusion qu'il était impossible 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é s’affiche comme suit:

Ils’agitsimplementd’unchampdetextebrut,maisj’aitrouvéquevouspouvieztaperlenomd’unecatégorieexistanteetqu’elleseraitsauvegardéeavecsuccèslorsdelamiseàjourdelapiècejointe(leseulcomportementétrangeestqu’ellerendelapiècenormale.versionàlaplaceduslugaprèslasauvegarde).

Unefoisquejemesuisrenducomptequejepouvaissauvegarderlescatégoriesdecettemanière,j’aialorspenséquejepouvaisobtenirunelistedetouteslescatégoriesdisponiblessousformedecasesàcocheretcochercellesquiavaientétésélectionnées.J'aiensuiteutiliséunpeudejQuerypoursaisirlesvaleursdescatégoriescochéesetmettrelesslugdetouteslescatégoriesdanslechampCatégorie.Pourquecelasembleencoreplustransparent,j'aiensuiteutiliséunsimplemorceaudeCSSpourmasquerlalignedutableaucontenantlechampCatégorie.Ainsi,vousnevoyezplusquelescasesàcocher,commececi:

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 et qui ont aidé à la résoudre!

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

    
réponse donnée Rick Curran 20.08.2010 - 19:44
la source
4

vient de créer ceci, qui constitue une solution de contournement complète du lien javascript Herky-Jerk avec le champ de formulaire. Comme les valeurs de vos cases à cocher sont passées avec le $ _POST lors de l'envoi, 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 afin qu'il corresponde au même tableau que celui que vous avez utilisé lors de la configuration de vos cases à cocher.)

Shabam, shabozzle. Profitez.

    
réponse donnée Drew Gourley 30.12.2011 - 17:53
la source
1

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 une Complétion automatique de l’interface utilisateur jQuery pour répliquer les fonctionnalités de la zone de balises.

Cependant, si vous voulez jouer avec les champs de l'éditeur de média, vous pouvez vous accrocher à '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:

enlace

    
réponse donnée John P Bloch 18.08.2010 - 19:07
la source
1

J'ai créé un plugin en utilisant les catégories de média WOS de @ RickCurran comme point de départ. Cependant, WOS Media Categories, à l'instar d'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.

C’estnécessairementsimplifiédanslesmétaboxesdesarticlesetdespages,maisj’aiinclusunecapacitédefiltragequilerendfacileàutiliser.

Je suis en train de générer 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 de mé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 métabox pleinement fonctionnel - ce que je compte faire dans une version ultérieure.

    
réponse donnée eddiemoya 17.01.2012 - 01:17
la source
0

Excellent plugin Rick - très utile.

Si vous déplacez le déclencheur onclick en ligne au lieu de le lier à onload (et apportez 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 un clic pour entrer dans un fichier php:

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

ajouter un identifiant de formulaire de téléchargement en vrac dans un fichier css:

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

}

    
réponse donnée djbokka 20.10.2010 - 17:23
la source

Lire d'autres questions sur les étiquettes