创建行为类似于类别的非层级分类

时间:2018-08-12 作者:Brett

我创建了一个自定义的帖子类型和一个自定义的分类法,除了一件特殊的事情之外,一切都很好。

首先,我的用例:我需要它像分类系统一样运作not 保持层次结构(仅一个级别),因此我将两者都保留为默认设置false 对于hierarchical 背景

这很好,除了一个允许我在metabox中添加“子级别”的问题。

First, the code:

register_post_type( \'letter\',
                    array(
                        \'labels\' => array(
                            \'name\' => __( \'Letters\' ),
                            \'singular_name\' => __( \'Letter\' ),
                            //..........
                        ),
                        \'public\' => true,
                        \'taxonomies\' => array(\'letter\'),
                        //........
                    )
);

// Our args for the custom taxonomy below
$args = array(
    \'labels\' => array(
        \'name\' => __(\'Recipients\'),
        \'singular_name\' => __(\'Recipient\'),
        //.....
    ),
    \'meta_box_cb\' => \'post_categories_meta_box\',
);

// Register a custom taxonomy for our letter categories
register_taxonomy( \'recipient\', \'letter\', $args );

// Connect the post type and taxonomy together to be safe
register_taxonomy_for_object_type( \'recipient\', \'letter\' );
现在,正如你所看到的,我需要设置meta_box_cbpost_categories_meta_box 否则,它最终将具有tag metabox,现在看起来是这样的:

enter image description here

这很好,我得到了我喜欢的分类功能,但是我也得到了“添加新收件人”,当你打开它时,它允许你添加一个新的“收件人”,并选择一个parent 收件人<这是我的not 希望

是基于post_categories_meta_box 函数并删除相应的代码以摆脱父功能?

我并不特别想这样做,因为这样会破坏此函数的未来更新。

还有其他选择吗?

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

This blog post by "Gazchap" 准确处理您的情况,并在发布您的后续问题后进行更新:

幸运的是,WordPress的4.4版引入了一个过滤器,即post\\u edit\\u category\\u parent\\u dropdown\\u args,可以用来控制这些元框中显示的父项。它的设计目的是让开发人员更改列出的术语,例如排除某些类别,或者只显示“顶级”父术语,而不显示其后代。没有设计用来阻止菜单显示的控件,但有一个控件允许我们欺骗WordPress隐藏父下拉选择。

以下是您需要的过滤器:

add_filter( \'post_edit_category_parent_dropdown_args\', \'hide_parent_dropdown_select\' );

function hide_parent_dropdown_select( $args ) {
    if ( \'YOUR_TAXONOMY_SLUG\' == $args[\'taxonomy\'] ) {
        $args[\'echo\'] = false;
    }
    return $args;
}
为什么会这样?默认情况下,echo参数设置为true,并使WordPress echo下拉列表选择到元框中。通过将其设置为false,WordPress将返回HTML,因此不会呈现到浏览器中。

请注意,当然YOUR_TAXONOMY_SLUG 应替换为自定义分类法的slug。

任何试图进行此黑客攻击的人都应该阅读完整的博客文章,它还有一些其他有用的提示。

SO网友:benny-ben

考虑到这是一个肮脏的选项,您可以这样尝试:

function dirty_admin_customization() {

    // #newtaxonomy_parent
    $style = \'<style type="text/css">#newrecipient_parent { display: none !important; }</style>\';

    echo $style . "\\n";

}
add_action( \'admin_head-post.php\',     \'dirty_admin_customization\' );
add_action( \'admin_head-post-new.php\', \'dirty_admin_customization\' );

结束