web-dev-qa-db-fra.com

Comment créer une méta-boîte de taxonomie avec des suggestions de recherche mais aucune nouvelle saisie de termes?

Je me demandais comment je pourrais configurer une métabox de taxonomie sur une page de modification post ressemblant au type "tags" (avec champ de recherche et suggestions automatiques), mais sans le droit d'ajouter un nouveau terme.

Ainsi, par exemple, si je tape un mot, je reçois des suggestions de termes que je peux utiliser à partir de la liste des termes existants, mais si je tape un mot qui n'existe pas, il n'ajoute pas les termes à la liste.

MODIFIER

En fait, ce que je recherche, c’est exactement le comportement de la fonctionnalité "Rechercher" dans l’éditeur de menus:

enter image description here

S'agissant d'un comportement fondamental WP, existe-t-il un moyen de l'utiliser également sur les pages de publication? Je me demande, car ces blocs ont exactement la même apparence, ils comportent tous les deux les onglets "Tout afficher" et "Les plus récents", mais l'option "Rechercher" n'est présente que dans l'éditeur de menus.

8
mike23

J'ai trouvé une solution à votre première question. c’est-à-dire la metabox taxe qui ne suggère que les termes de la liste des termes existants mais ne vous permet pas d’ajouter de nouveaux termes. La solution est basée sur jQuery et modifie le comportement par défaut des balises méta (c'est-à-dire des taxonomies non hiérarchiques).

Limitation: Actuellement, il ne permet d'ajouter qu'un terme à la fois, c'est-à-dire que vous ne pouvez pas ajouter plusieurs termes existants sous forme de valeurs séparées par des virgules.

Le code est également disponible sous la forme github's Gist .

Je pourrais faire un éditeur de menu comme metabox pour la taxonomie le week-end prochain. ;)

la solution ci-dessous peut être utilisée comme plugin, comme dans votre fichier function.php.

<?php
/*
Plugin Name: No new terms taxonomy meta box
Plugin URI: https://Gist.github.com/1074801
Description: Modifies the behavior of the taxonomy box, forbids user from selecting terms that don't belong to taxonomy.
Author: Hameedullah Khan
Author URI: http://hameedullah.com
Version: 0.1
License: Do what ever you like, but don't publish it under your name without improving it.
 */

/*
 * For more information: http://wordpress.stackexchange.com/questions/20921/
 */

// currently works only with single taxonomy which should be defined here
// default is the built-in post_tag
define('CTM_TAXONOMY_NAME', 'post_tag');

function ctm_custom_tax_js() {

    // taxonomy name not defined or set to empty value
    if ( !defined('CTM_TAXONOMY_NAME') || !CTM_TAXONOMY_NAME ) {
        return;
    }
?>
<script type="text/javascript">


    function ctm_custom_termadd_handler(event){
            var tax = '<?php echo CTM_TAXONOMY_NAME; ?>';
            var input = jQuery('#tagsdiv-<?php echo CTM_TAXONOMY_NAME; ?> input.newtag');

            var q = input.val().split(',');

            // if there are more then two values, just add the first one
            // NOTE: because this solution does not support inserting multiple terms
            if (q.length > 1) {
                q = jQuery.trim(q[0]);

                // as we don't support multiple terms
                // set the value of input box to the first term
                input.val(q);
            }

            jQuery.get( ajaxurl + '?action=ajax-tag-search&tax=' + tax + '&q=' + q, function(results) {
                var tokens = results.split('\n');
                for (var i=0; i < tokens.length; i++) {
                    token = jQuery.trim(tokens[i]);
                    if ( token && token == q ) {
                        (function($){
                            tagBox.flushTags( $('#tagsdiv-<?php echo CTM_TAXONOMY_NAME; ?>') );
                        })(jQuery);

                        return true;
                    }
                }

            } );
            event.stopImmediatePropagation();
            return false;
    }

    function ctm_custom_key_handler(event) {
        if (13 == event.which) {
            ctm_custom_termadd_handler(event);
            return false;
        }
        return true;
    }

    jQuery(document).ready(function() {
        // unbiind the click event from the taxonomy box
        jQuery('#tagsdiv-<?php echo CTM_TAXONOMY_NAME; ?> input.tagadd').unbind('click');
        jQuery('#tagsdiv-<?php echo CTM_TAXONOMY_NAME; ?> input.newtag').unbind('keyup');

        // hide the howto text for inserting multiple terms
        // NOTE: because this solution does not support inserting multiple terms
        jQuery('#tagsdiv-<?php echo CTM_TAXONOMY_NAME; ?> p.howto').hide();

        // bind our custom handler
        jQuery('#tagsdiv-<?php echo CTM_TAXONOMY_NAME; ?> input.tagadd').click(ctm_custom_termadd_handler);
        jQuery('#tagsdiv-<?php echo CTM_TAXONOMY_NAME; ?> input.newtag').keyup(ctm_custom_key_handler);
    });

</script>

<?php
}
add_action('admin_footer-post-new.php', 'ctm_custom_tax_js');
add_action('admin_footer-post.php', 'ctm_custom_tax_js');
?>

UPDATE: code mis à jour pour gérer la clé de retour conformément au commentaire de @ mike.

3
Hameedullah Khan

Cette question est un peu ancienne, mais comme je l’ai trouvée, d’autres personnes peuvent venir chercher les mêmes choses. Ce plugin était utile https://wordpress.org/plugins/admin-category-filter/#developers Et vous pouvez ajouter manuellement du code à celui-ci ou à functions.php de votre thème personnalisé pour masquer la section de la catégorie parente ou le bouton 'ajouter une nouvelle catégorie' du tout Un affichage css: aucun attribut à l'identifiant div ne fonctionnera parfaitement.

0
leorospo