web-dev-qa-db-ja.com

親カテゴリを選択不可にする

子カテゴリを持つ自分のカテゴリは、記事の投稿ページで選択できないようにしてください。

私がやりたいことは、ラベルの前のチェックボックスを外すことです。

私はフィルタのドキュメントを見ましたが、私は自分のニーズに合ったフィルタを見つけることができませんでした。

2
koskoz

私はこれがフィルタ可能であることを本当に疑っています、それでjQueryは救いに来ます:)

コード

add_action( 'admin_footer-post.php', 'wpse_22836_remove_top_categories_checkbox' );
add_action( 'admin_footer-post-new.php', 'wpse_22836_remove_top_categories_checkbox' );

function wpse_22836_remove_top_categories_checkbox()
{
    global $post_type;

    if ( 'post' != $post_type )
        return;
    ?>
        <script type="text/javascript">
            jQuery("#categorychecklist>li>label input").each(function(){
                jQuery(this).remove();
            });
        </script>
    <?php
}

結果

no parent categories


高度な

警告があります:サブカテゴリを選択するたびに、それは階層から抜け出す...

それで、以下はScribuによる優れたプラグインからのコード、 Category Checklist Tree 、そして前のコードとの組み合わせです。

投稿編集画面で、投稿を保存すると、チェックしたカテゴリが一番上に表示され、カテゴリ階層が壊れていることがわかります。このプラグインはその「機能」を削除します。

前のコードを使用してプラグインをインストールするか、またはこれをあなたのテーマのfunctions.phpまたは カスタムプラグイン にドロップするだけです(すべての調整はテーマに依存しないので好ましい)。

/*
Based on Category Checklist Tree, by scribu
Preserves the category hierarchy on the post editing screen
Removes parent categories checkbox selection
*/
class Category_Checklist {

    function init() {
        add_filter( 'wp_terms_checklist_args', array( __CLASS__, 'checklist_args' ) );
    }

    function checklist_args( $args ) {
        add_action( 'admin_footer', array( __CLASS__, 'script' ) );

        $args['checked_ontop'] = false;

        return $args;
    }

    // Scrolls to first checked category
    function script() {
?>
<script type="text/javascript">
    jQuery(function(){
        jQuery('[id$="-all"] > ul.categorychecklist').each(function() {
            var $list = jQuery(this);
            var $firstChecked = $list.find(':checked').first();

            if ( !$firstChecked.length )
                return;

            var pos_first = $list.find(':checkbox').position().top;
            var pos_checked = $firstChecked.position().top;

            $list.closest('.tabs-panel').scrollTop(pos_checked - pos_first + 5);
        });

        jQuery("#categorychecklist>li>label input").each(function(){
            jQuery(this).remove();
        });

    });
</script>
<?php
    }
}

Category_Checklist::init();
3
brasofilo

Brasofiloとほぼ同じですが、以下の私のコードでもさまざまな分類法を考慮し、最上位レベルの親カテゴリのチェックボックスを外します。これにより、子供のいない他のトップレベルのカテゴリを選択可能にすることができます。この単純なコードを私のテーマのfunctions.phpファイルに入れます。

class Category_Checklist {

function init() {
    add_filter( 'wp_terms_checklist_args', array( __CLASS__, 'checklist_args' ) );
}

function checklist_args( $args ) {
    add_action( 'admin_footer', array( __CLASS__, 'script' ) );

    $args['checked_ontop'] = false;

    return $args;
}

// Scrolls to first checked category
function script() {
?>
<script type="text/javascript">
(function($){
    $('[id$="-all"] > ul.categorychecklist').each(function() {
        var list = $(this);
        var firstChecked = list.find(':checked').first();

        if ( !firstChecked.length )
            return;

        var pos_first = list.find(':checkbox').position().top;
        var pos_checked = firstChecked.position().top;

        list.closest('.tabs-panel').scrollTop(pos_checked - pos_first + 5);
    });

    $(".categorychecklist>li>label input").each(function(){
        if ($(this).parent().next('ul').hasClass('children')) {
            $(this).remove();
        }
    });

})(jQuery);
</script>
<?php
    }
}

Category_Checklist::init();
3
Mike Kormendy

Brasofiloが言うように分類階層を維持するために "Category Checklist Tree"プラグインといくつかのCSSで行うこともできます。

#categorychecklist > li > label.selectit > input { display: none !important; }

(#categorychecklistを#yourcustomtaxonomychecklistに置き換えて、これを顧客の分類法に適用することができます)

これを追加し、他のcssをwordpress adminに追加するには、以下をfunctions.phpに追加します。

function my_admin_head() {
    echo '<link rel="stylesheet" type="text/css"
    href="'.get_bloginfo('stylesheet_directory').'/admin.css">';
}
add_action('admin_head', 'my_admin_head');

そして、スタイルシート "admin.css"をあなたのテーマディレクトリに追加して、上記のCSSを追加してください。

0
Peanut

私は私の解決策を得るために上記の組み合わせを使用しました。私は純粋なcssアプローチが好きでした、しかしそれが表示されていなくてもラベルクリックアクションはチェックボックスの "checked"属性を変更します。これが私の解決策です。カテゴリの最初の2つのレベルを隠すのはハードコーディングされていることに注意してください。

css:

#categorychecklist > li > label.selectit,
#categorychecklist > li > ul.children > li > label.selectit {cursor: text;}

#categorychecklist > li > label.selectit > input,
#categorychecklist > li > ul.children > li > label.selectit > input { display: none !important; }

js(チェックボックスが非表示の場合は、クリックイベントをキャンセルします。どのレベルでも機能します):

$('#categorychecklist > li label.selectit').on('click', function(event) {
        if (!$(this).children("input").is(':visible'))
            event.preventDefault();
    });

そして管理者に参照するには:

function add_admin_assets() {
    wp_enqueue_style( "admin-custom-css", get_bloginfo('template_url').'/assets/styles/custom/admin.css');
    wp_enqueue_script('admin-custom-js', get_bloginfo('template_url').'/inc/js/admin.js', array(), null, true);
}
add_action('admin_head', 'add_admin_assets');
0
Nathan Pond

これが私が親カテゴリを無効にし、投稿ごとに1つのカテゴリのみを許可するために使用したものです。このコードはクイック編集カテゴリも変更します。私は誰かがそれを片付けるのを歓迎します、私はJavaScriptに自信がありません。

私はここで最初の部分を手に入れました: https://wordpress.org/support/topic/making-category-selection-radio-buttons

    /* ONLY ALLOW ONE CATEGORY PER POST */
add_action( 'admin_footer', 'catlist2radio' );
function catlist2radio(){
    echo '<script type="text/javascript">';
    echo 'jQuery("#categorychecklist .children input, #categorychecklist-pop .children input, .cat-checklist .children input")';
    echo '.each(function(){this.type="radio"});</script>';
}

/* DISABLE PARENT CATEGORIES FOR POSTS */
/*
Based on Category Checklist Tree, by scribu
Preserves the category hierarchy on the post editing screen
Removes parent categories checkbox selection
*/
class Category_Checklist {
    function init() {
        add_filter( 'wp_terms_checklist_args', array( __CLASS__, 'checklist_args' ) );
    }
    function checklist_args( $args ) {
        add_action( 'admin_footer', array( __CLASS__, 'script' ) );
        $args['checked_ontop'] = false;
        return $args;
    }

    // Scrolls to first checked category
    function script() {
?>
<script type="text/javascript">
    jQuery(function(){
        jQuery('[id$="-all"] > ul.categorychecklist').each(function() {
            var $list = jQuery(this);
            var $firstChecked = $list.find(':checked').first();
            if ( !$firstChecked.length )
                return;
            var pos_first = $list.find(':checkbox').position().top;
            var pos_checked = $firstChecked.position().top;
            $list.closest('.tabs-panel').scrollTop(pos_checked - pos_first + 5);
        });
        jQuery("#categorychecklist>li>label input").each(function(){
            jQuery(this).remove();
        });
    });
        jQuery(function(){
        jQuery('[id$="-all"] > ul.cat-checklist').each(function() {
            var $list = jQuery(this);
            var $firstChecked = $list.find(':checked').first();
            if ( !$firstChecked.length )
                return;
            var pos_first = $list.find(':checkbox').position().top;
            var pos_checked = $firstChecked.position().top;
            $list.closest('.tabs-panel').scrollTop(pos_checked - pos_first + 5);
        });
        jQuery(".cat-checklist>li>label input").each(function(){
            jQuery(this).remove();
        });
    });
        jQuery('#category-tabs .hide-if-no-js').remove();
</script>
<?php
    }
}
Category_Checklist::init();
0
Carole Magouirk

次の解決策はチェックボックスが出力されるのを防ぎます。これは私の意見ではもっときれいに思われる。

Walker_Category_Checklist関数をオーバーライドするコアstart_elを拡張するカスタムウォーカーを作成して、$args['list_only']を条件付きでtrueに設定できるようにします。この場合、この関数は、下位語($category->parent == 0)を含む最上位語($args['has_children'])があるかどうかをチェックし、もちろん正しい分類法を使用しているかどうかをチェックします。これらの条件が満たされると、$args['list_only']がtrueに設定され、親メソッドが呼び出されます。この場合、この要素のチェックボックスは表示されません。

class Wpse22836_Walker_Category_Checklist extends Walker_Category_Checklist {
    public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
        if ( 'category' ==  $args['taxonomy'] 
                && $args['has_children'] 
                && 0 === $category->parent) {
            $args['list_only'] = true;
        }
        parent::start_el( $output, $category, $depth, $args, $id );
    }
}

WordPressに元のクラスの代わりにこのwalkerクラスを使用させるには、wp_terms_checklist()にフィルタwp_terms_checklist_argsを使用できます。

add_filter( 'wp_terms_checklist_args', function( $args, $post_id ) {
    $args['walker'] = new Wpse22836_Walker_Category_Checklist();
    return $args;
}, 10, 2 );

このソリューションには、コア関数wp_terms_checklist()を使用するすべての場所で自動的に機能するという利点があり、JavaScriptには依存しません。

0
JHoffmann