Como posso criar uma caixa de meta taxonomia com sugestões de pesquisa, mas sem entrada de novos termos?

8

Eu queria saber como eu poderia configurar uma metabox taxonomia em uma página de pós-edição que seria semelhante ao tipo "tags" (com campo de pesquisa e sugestões automáticas), mas sem o direito de adicionar um novo termo.

Por exemplo, se eu digitar uma palavra, recebo sugestões de termos que posso usar na lista de termos existentes, mas se eu digitar uma palavra que não existe, ela não adicionará os termos à lista.

EDITAR

Na verdade, o que estou procurando é exatamente o comportamento da funcionalidade "Pesquisar" no Editor de menus:

insira a descrição da imagem aqui

Como esse é um comportamento básico do WP, também existe uma maneira de usá-lo nas páginas pós-edição? Gostaria de saber porque esses blocos têm a mesma aparência, ambos têm as guias "exibir tudo" e "mais recente", mas a opção "pesquisar" está presente apenas no Editor de menus.

mike23
fonte
A metabox taxonomia é codificada com guias definidas e não possui nenhum filtro no qual se possa conectar. Qualquer coisa assim exigiria a criação de um patch ou a metabox personalizada completa.
Azizur Rahman

Respostas:

3

Eu vim com uma solução para sua primeira pergunta. ou seja, a metabox fiscal que sugere apenas termos da lista de termos existentes, mas não permite adicionar novos termos. A solução é baseada em jQuery e modifica o comportamento padrão das meta-caixas de tags (ou seja, taxonomias não-hierárquicas).

Limitação: atualmente, permite adicionar apenas 1 termo por vez, ou seja, não é possível adicionar vários termos existentes como valores separados por vírgula.

O código também está disponível como essência do github .

Eu poderia fazer editor de menu como metabox para taxonomia no próximo fim de semana. ;)

a solução abaixo pode ser usada como plug-in e também no seu arquivo 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: código atualizado para manipular a chave de retorno conforme o comentário de @ mike.

Hameedullah Khan
fonte
11
obrigado, é um ótimo começo. Ele impede que novas palavras-chave sejam inseridas ao pressionar o botão "adicionar", mas você ainda pode adicionar novas pressionando a Entertecla. Eu tentei retornar falseem keyCode == 13, mas isso não parece fazer o truque, você tem alguma ideia?. Além disso, seria melhor se o script foi chamado apenas em post.phpe post-new.phppáginas de administração.
mike23
Eu atualizei o código, verifique agora.
Hameedullah Khan
Está ótimo, muito obrigado! Agora, o mais interessante seria fazê-lo funcionar para múltiplas taxonomias. Vou aceitar a aswer, deixe-nos saber também se você conseguir implementar editor menu como METABOX para taxonomias :)
mike23
0

Essa pergunta é um pouco antiga, mas, como eu a achei, outras pessoas podem procurar as mesmas coisas. Este PLugin foi útil https://wordpress.org/plugins/admin-category-filter/#developers E você pode adicionar manualmente código a ele ou às funções do seu tema custumizado.php para ocultar a seção da categoria pai ou a opção 'add new botão de categoria 'de todo Um display css: nenhum atributo para o div id funcionará perfeitamente.

leorospo
fonte