使父类别不可选

时间:2011-07-13 作者:koskoz

我想让我的类别中有子类别在文章后页面上不可选择。

我想做的是删除标签前的复选框。

我查看了过滤器文档,但找不到任何适合我需要的过滤器。

6 个回复
最合适的回答,由SO网友:brasofilo 整理而成

我真的怀疑这是可过滤的,所以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 或在custom plugin 你的(更好,所以你所有的调整都是独立于主题的)。

/*
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();

SO网友:Mike Kormendy

与brasofilo几乎完全相同,我下面的代码还说明了不同的分类法,并删除了顶层父类别的复选框,前提是它们有子类别。这允许其他无子女的顶级类别仍然可以选择。我把这个简单的代码放在我的主题函数中。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();

SO网友:Peanut

也可以使用“类别清单树”插件来维护分类层次结构,正如brasofilo所说,还有一些CSS:

#categorychecklist > li > label.selectit > input { display: none !important; }
(#categorychecklist可以替换为#yourcustomtaxonomychecklist,以将其应用于客户分类法)

要将此和其他css添加到wordpress admin,可以将以下内容添加到函数中。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

SO网友:Carole Magouirk

下面是我用来禁用父类别,并且每个帖子只允许一个类别的内容。此代码也会更改快速编辑类别。我欢迎有人来清理它,我对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();

SO网友:Nathan Pond

我使用了以上的组合来获得我的解决方案。我喜欢纯css方法,但是标签点击操作仍然会更改复选框的“checked”属性,即使它没有显示出来。这是我的解决方案,请注意,它是硬编码的,用于隐藏前两个级别的类别。

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\');

SO网友:JHoffmann

以下解决方案阻止输出复选框。在我看来,这似乎要干净得多。

我做了一个扩展核心的定制助行器Walker_Category_Checklist 将覆盖start_el 函数,以便可以有条件地设置$args[\'list_only\'] 为真。在这种情况下,函数检查是否有顶级术语($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_args 在里面wp_terms_checklist():

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。

结束

相关推荐

调用Function_Exist()比调用Apply_Filters()快还是慢

调用函数\\u exists()时,应用\\u filters()的速度是快还是慢。。。还是差异太小,不应该考虑?我在Kaiser的基础上做了一些测试,结果表明,在同时存在函数和过滤器的情况下,function\\u exists()的速度大约是3倍。如果过滤器不存在,速度将提高约11倍。没想到会这样。function taco_party() { return true; } add_filter( \'taco-party\', \'taco_party\'