Как создать мета-поле таксономии с предложениями поиска, но без ввода новых терминов?

8

Мне было интересно, как я могу настроить метабокс таксономии на странице редактирования поста, который будет похож на вид «тегов» (с полем поиска и автоматическими предложениями), но без права добавления нового термина.

Так, например, если я набираю слово, я получаю предложения о терминах, которые я могу использовать, из существующего списка терминов, но если я набираю слово, которое не существует, оно не добавляет термины в список.

РЕДАКТИРОВАТЬ

На самом деле, что я ищу, так это поведение функции «Поиск» в редакторе меню:

введите описание изображения здесь

Поскольку это основное поведение WP, есть ли способ использовать его и на страницах редактирования сообщений? Мне интересно, потому что эти блоки выглядят совершенно одинаково, оба имеют вкладки «просмотреть все» и «самые последние», но «поиск» присутствует только в редакторе меню.

mike23
источник
Метабокс таксономии жестко запрограммирован с помощью набора вкладок и не имеет фильтра, к которому можно подключиться. Что-нибудь подобное потребует создания патча или полного пользовательского метабокса.
Азизур Рахман

Ответы:

3

Я нашел решение для вашего первого вопроса. т. е. налоговый метабокс, который предлагает только термины из существующего списка терминов, но не позволяет добавлять новые термины. Решение основано на jQuery и изменяет стандартное поведение мета-блока тегов (то есть не-иерархических таксономий).

Ограничение: В настоящее время разрешено добавлять только 1 термин за раз, то есть нельзя добавлять несколько существующих терминов в виде значений, разделенных запятыми.

Код также доступен в GitHub по сути .

Я мог бы сделать редактор меню, как metabox для таксономии на следующих выходных. ;)

Приведенное ниже решение можно использовать как плагин, как и в файле 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');
?>

ОБНОВЛЕНИЕ: код обновлен для обработки ключа возврата согласно комментарию @ mike.

Хамидулла Хан
источник
1
спасибо, это отличное начало. Он блокирует ввод новых ключевых слов при нажатии кнопки «Добавить», но вы все равно можете добавить новые Enterключевые слова, нажав клавишу. Я попытался возвращение falseна keyCode == 13, но это , кажется, не делать трюк, у вас есть какие - либо идеи?. Кроме того , было бы лучше , если бы сценарий был вызван только post.phpи post-new.phpадминистратором страниц.
mike23
Я обновил код, проверьте сейчас.
Хамидулла Хан
Просыпается отлично, спасибо большое! Теперь было бы неплохо сделать так, чтобы это работало для нескольких таксономий. Я приму aswer, дайте нам знать, если вам удастся реализовать редактор меню, такой как metabox для таксономий :)
mike23
0

Этот вопрос немного старый, но, как я обнаружил, некоторые другие люди могут приходить и искать то же самое. Этот PLugin был полезен https://wordpress.org/plugins/admin-category-filter/#developers. И вы можете вручную добавить код в него или в файл functions.php вашей кастомизированной темы, чтобы скрыть раздел родительской категории или добавить новый кнопка category 'вообще не отображается css: ни один атрибут div id не будет работать идеально.

leorospo
источник