如何创建带有搜索建议但不输入新术语的分类法元框?


8

我想知道如何在后编辑页面上设置一个类似于“标签”类型(带有搜索字段和自动建议)的分类法元框,但没有添加新术语的权利。

因此,例如,如果我输入一个单词,则会从现有术语列表中获得可以使用的术语建议,但是如果我键入一个不存在的单词,则不会将这些术语添加到列表中。

编辑

实际上,我正在寻找的正是菜单编辑器中“搜索”功能的行为:

在此处输入图片说明

由于这是WP的核心行为,有没有办法在后期编辑页面上使用它?我想知道,因为这些块看起来完全一样,都具有“查看全部”和“最新”选项卡,但是“搜索”仅出现在菜单编辑器中。


分类标准元框使用设置选项卡进行硬编码,并且没有任何可以挂接到的过滤器。诸如此类的任何操作都需要创建补丁或完整的自定义metabox。
Azizur Ra​​hman

Answers:


3

我为您的第一个问题提出了解决方案。也就是说,tax metabox仅建议现有术语列表中的术语,但不允许您添加新术语。该解决方案基于jQuery,并修改了标签(即非分层分类法)元框的默认行为。

限制:当前,它一次只能添加1个字词,也就是说,您不能将多个现有字词添加为逗号分隔的值。

该代码也可以作为github的gist获得

我可能在下周末进行菜单编辑器(如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关键字。我试图返回falsekeyCode == 13,但是这似乎并没有这样的伎俩,你有什么想法?另外,最好只在post.phppost-new.php管理页面上调用脚本。
mike23 2011年

我已经更新了代码,请立即检查。
Hameedullah Khan 2011年

很棒,非常感谢!现在,整洁的事情是让它适用于多种分类法。我接受询问,如果您能够实现菜单编辑器(例如,用于分类法的metabox),也请告知我们:)
mike23 2011年

0

这个问题有点老了,但是当我发现它时,可能会有其他人来找同样的东西。这个插件对您很有帮助 https://wordpress.org/plugins/admin-category-filter/#developers 并且您可以手动向其中添加代码,也可以向您的自定义主题的functions.php中添加代码以隐藏父类别部分或“添加新内容”全部显示为“类别”按钮。div ID的css display:none属性将完美工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.