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

18

J'utilise register_taxonomy_for_object_type()pour ajouter le champ Taxonomie des catégories aux téléchargements de médias (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 lui faire afficher la métabox des catégories réelles afin que je puisse choisir les catégories que je veux utiliser plutôt que de simplement les taper dans le champ clair. J'ai également constaté que le fait de placer le slug d'une catégorie dans ce champ de texte, par exemple, my-category-namefinit par s'afficher en tant que nom de catégorie réel, comme My Category Namelorsqu'il est enregistré, ce qui rend le champ de texte simple encore moins une option utile.

J'ai regardé la add_post_type_support()fonction pour ajouter des métaboxes et je l'ai vue utilisée pour les types de publication personnalisés, je ne vois tout simplement pas s'il est possible d'ajouter la même chose pour les pièces jointes.

Rick Curran
la source
Si vous attendez un jour ou deux avant de choisir la meilleure réponse, je vous écrirai un plugin ... (Je viens de recevoir les délais des clients et un Meetup WordPress pour présenter les réponses WordPress à ce soir ...)
MikeSchinkel
@Mike: Merci, je suis impatient de voir quelles sont les solutions à ce problème. Il semble que ce que je recherche soit à 90% là-bas dans WordPress tel qu'il est, il reste juste à voir à propos de ces 10% derniers!
Rick Curran
J'ai fait quelque chose de très similaire avec une métabox de poste personnalisée; c'est-à-dire incorporer une liste de catégories (de base) (c'est-à-dire sans les onglets pour tous / les plus populaires). Cela dépend simplement de la façon dont 'attachment_fields_to_edit' implémente son POST. De toute façon, je ne peux pas faire ce soir. J'ai besoin de dormir.
MikeSchinkel
Oups, comme vous y avez déjà répondu vous-même, je vais retirer ma liste de tâches.
MikeSchinkel
@Mike: Merci pour votre aide, j'aimerais avoir des commentaires sur ma solution. Je suis content d'avoir trouvé un moyen de le faire fonctionner. Ce serait formidable de voir l'ajout de catégories aux pièces jointes via la métabox de catégorie réelle, mais ma solution fonctionne assez bien.
Rick Curran

Réponses:

14

Edit: 12/09/2017 Voir cette réponse pour une solution plus à jour: 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 arrivé à 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_typeet 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:

texte alternatif

C'est juste un champ de texte brut mais ce que j'ai trouvé, c'est que vous pouvez taper le nom d'une catégorie existante là-dedans et il serait ensuite enregistré avec succès lorsque la pièce jointe a été mise à jour (Le seul comportement étrange est qu'il restituait la version normale au lieu de la limace après avoir sauvé).

Une fois que j'ai réalisé que je pouvais enregistrer des catégories de cette façon, j'ai pensé que je pourrais obtenir une liste de toutes les catégories disponibles sous forme de cases à cocher et vérifier celles qui avaient été sélectionnées. J'ai ensuite utilisé un peu de jQuery pour saisir les valeurs des catégories vérifiées et mettre tous les slugs des catégories dans le champ Catégorie. Pour que cela semble encore plus transparent, j'ai ensuite utilisé un peu de CSS pour masquer la ligne du tableau qui contenait le champ Catégorie, de sorte que tout ce que vous voyez est les cases à cocher, comme ceci:

texte alternatif

Maintenant que je peux ajouter des catégories aux pièces jointes des images, 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 heureux d'avoir réussi à comprendre quelque chose.

Je l'ai transformé en un plugin appelé WOS Media Categoriesque j'ai mis à disposition pour téléchargement à partir de mon site Web, Suburbia.org.uk , j'espère qu'il peut être utile à quelqu'un d'autre! Merci encore à ceux qui ont commenté cela et d'autres questions que j'ai posées ici qui ont aidé à le comprendre!

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

Rick Curran
la source
Je suis un peu gêné par l'utilisation de jQuery à partir de quelque chose qui nécessite l'intégrité des données. Je suis presque sûr que tout cela peut être fait sur le serveur. Je vais essayer de le regarder bientôt.
MikeSchinkel
1
@Mike: Ouais, ça m'inquiète un peu aussi. Cependant, il y a de nombreux cas où JavaScript est impliqué, j'ai donc décidé que j'étais assez satisfait de cette solution. Certainement heureux d'obtenir des commentaires sur les méthodes alternatives. Lorsque j'en aurai l'occasion, j'aimerais soumettre cela dans le référentiel WordPress bien que je puisse attendre et voir ce que vous revenez. Merci!
Rick Curran
@Mike ou @Rick - Pourriez-vous éventuellement fournir un autre exemple qui pourrait attribuer automatiquement une publication à une catégorie spécifique lorsque des médias sont ajoutés? L'association de catégorie serait basée sur le type de poste auquel il se trouve ou définie manuellement via le code?
NetConstructor.com
@ NetConstructor.com - Cela ressemble à une autre question pour moi ...
MikeSchinkel
@ netconstructor.com: Oui, ça me semble être une autre grande question!
Rick Curran
4

vient de créer ceci, qui est une solution complète au lien javascript de herky-jerk avec le champ de formulaire. Étant donné que les valeurs de vos cases à cocher sont transmises avec $ _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 termes de l'objet de publication.

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 vous utilisez lorsque vous configurez vos cases à cocher)

Shabam, shabozzle. Prendre plaisir.

Drew Gourley
la source
Votre fonction add_image_attachment_fields_to_save doit renvoyer $ post à la fin. wp_set_object_terms( $post['ID'], $terms, 'image-format' ); return $post;. Et le script que vous avez publié n'exécute pas register_custom_taxonomies. Mais bon script quand même. Je vais certainement l'utiliser à l'avenir!
Rob Vermeer
Oh oups, je l'ai bricolé en pensant que j'étais pratique. Je vais le réparer ici dans une seconde. Bon point sur le retour, cependant, je n'ai eu aucun problème avec ça.
Drew Gourley
1

C'est difficile / compliqué si vous souhaitez utiliser la boîte de catégorie par défaut de WordPress. D'une part, la métabox ne renvoie pas la sortie, elle la fait simplement écho. En plus de cela, il ne vous donnerait pas le nom de champ de saisie correct, il ne serait donc pas enregistré. Une idée pourrait être d'utiliser une saisie semi-automatique d'interface utilisateur jQuery pour répliquer la fonctionnalité de la zone de balises.

Cependant, si vous souhaitez jouer avec les champs de l'éditeur multimédia, vous pouvez vous connecter 'attachment_fields_to_edit'et modifier le tableau de champs. Le filtre transmet deux arguments au rappel: le premier argument est le tableau de champs, le second est l'objet de publication de pièce jointe. Voir ici pour plus de détails:

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

John P Bloch
la source
Merci, je vais regarder attachment_fields_to_editet voir comment ça se passe.
Rick Curran
1

J'ai créé un plugin en utilisant les catégories de médias WOS de @ RickCurran comme point de départ. Cependant, les catégories de médias WOS, comme d'autres plugins qui ajoutent un support de catégorie aux médias, n'ajoutent pas réellement de métabox, je l'ai fait.

vue d'ensemble

Sa forme nécessairement simplifiée des métaboxes sur les publications et les pages, mais j'ai inclus une capacité de filtrage qui le rend facile à utiliser.

catégories filtrables

Je génère en fait la métabox de catégorie entière que vous voyez sur les pages et les publications, mais en cachant les bits qui ne fonctionnent pas sur la page multimédia en raison à la fois d'un manque de style et du javascript manquant.

Je me réjouis de toutes les idées que n'importe qui pourrait avoir sur la façon de rendre la métabox entièrement fonctionnelle - quelque chose que j'ai l'intention de faire dans une version ultérieure.

eddiemoya
la source
0

Super 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 groupé Flash. Avec la version actuelle, Flash se charge après l'événement de chargement jQuery, de sorte 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);
}

ajoutez onclick pour entrer dans le fichier php:

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

ajouter un identifiant de formulaire de téléchargement groupé au fichier css:

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

}


la source
Merci djbokka! J'ai ajouté ce correctif à la base de code maintenant, j'ai mis à jour les fichiers du plugin qui peuvent être téléchargés depuis mon site Web à suburbia.org.uk/page/projects.html#wos_media_categories
Rick Curran