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


8

「タグ」の種類(検索フィールドと自動提案を含む)に似ているが、新しい用語を追加する権限がない分類編集メタボックスをポスト編集ページに設定する方法を知りたいと思っていました。

たとえば、単語を打ち込んだ場合、既存の用語リストから使用できる用語の候補が表示されますが、存在しない単語を入力した場合、用語はリストに追加されません。

編集

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

ここに画像の説明を入力してください

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


タクソノミーメタボックスはセットタブでハードコードされており、フックできるフィルターはありません。このような場合は、パッチまたは完全なカスタムメタボックスを作成する必要があります。
Azizur Ra​​hman、2011

回答:


3

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

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

コードはgithubの要旨としても利用できます。

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

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.phppost-new.php管理ページでのみ呼び出された方がよいでしょう。
mike23

コードを更新しました。今すぐ確認してください。
ハメダラカーン2011

それは素晴らしく、本当にありがとう!さて、きちんとしたことは、それを複数の分類法で機能させることです。質問に同意します。分類用のメタボックスなどのメニューエディターを実装できた場合もお知らせください:)
mike23

0

この質問は少し古いですが、私が見つけたので、他の人が同じものを探しに来るかもしれません。このPLuginは役に立ちました https://wordpress.org/plugins/admin-category-filter/#developers そして、手動でコードを追加したり、カスタムテーマのfunctions.phpにコードを追加して、親カテゴリセクションを非表示にしたり、カテゴリのボタンはすべてa css display:none div idの属性は完全に機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.