web-dev-qa-db-ja.com

検索候補を含むが新しい用語が入力されていない分類メタボックスを作成するにはどうすればよいですか。

「タグ」のようなもの(検索フィールドと自動提案付き)に似た分類編集メタボックスを編集後のページに設定する方法を考えていましたが、新しい用語を追加する権利はありませんでした。

たとえば、私がWordを類義語指定している場合、既存の用語リストから使用できる用語の候補が表示されますが、存在しないWordを入力してもリストに用語は追加されません。

_編集_

実際、私が探しているのは、メニューエディタの "検索"機能の動作です。

enter image description here

これはコアのWP動作なので、編集後のページでも使用する方法はありますか。これらのブロックはまったく同じように見え、どちらも[すべて表示]タブと[最新]タブがありますが、[検索]はメニューエディタにしか存在しないため、不思議に思います。

8
mike23

私はあなたの最初の質問に対する解決策を思いつきました。つまり、既存の用語リストからの用語のみを提案し、新しい用語を追加することを許可しない税メタボックス。このソリューションはjQueryベースで、タグ(つまり、非階層分類法)メタボックスのデフォルトの動作を変更します。

制限: 現時点では一度に1つの用語しか追加できません。つまり、既存の複数の用語をコンマ区切り値として追加することはできません。

コードはgithubの Gist としても利用可能です。

私は来週末に分類学のためのメタボックスのようなメニューエディタをするかもしれません。 ;)

下記の解決策はあなたの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: @マイクのコメントに従ってreturnキーを処理するようにコードを更新。

3

この質問は少し古いですが、私がそれを見つけたように他の何人かの人が来て同じことを探すかもし​​れません。このPLuginは役に立ちました https://wordpress.org/plugins/admin-category-filter/#developers そして手動で親カテゴリを隠すためにそれにあなたの 'カスタマイズされたテーマのfunctions.phpにコードを追加することができますsectionまたは 'new new category'ボタンがすべて表示されます。cssdisplay:div idにnone属性があれば、完全に機能します。

0
leorospo