如何覆盖核心分类中的特定参数?

时间:2015-12-13 作者:Fabien Quatravaux

The Codex page for register_taxonomy says that

此函数用于添加或覆盖分类法。

如何使用它覆盖核心分类法而不重新定义所有参数?

例如,让我们想象一下,我想让核心帖子类别对每个人都是只读的。我可以通过设置edit_terms 此分类法能够do_not_allow.

我的第一位客人是打电话给register_taxonomy 仅使用我要更改的参数:

add_action( \'init\', \'u16975_disable_category_creation\' );
function u16975_disable_category_creation(){
    register_taxonomy( \'category\', \'post\', array(
        \'capabilities\' => array(
            \'edit_terms\' => \'do_not_allow\',
        ),
    ) );
}
但这不起作用,因为它还会覆盖所有其他参数并将其设置为默认值(例如:hierarchical 设置回false).

我发现实现这一点的唯一方法是使用存储所有已注册分类的全局变量。

add_action( \'init\', \'u16975_use_global_var\' );
function u16975_use_global_var(){
    global $wp_taxonomies;
    $wp_taxonomies[\'category\']->cap->edit_terms = \'do_not_allow\';
}

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

我找到了另一种可靠的方法来覆盖分类法:我可以在之前获取已注册的分类法,然后只更改所需的参数。注册的分类可以通过以下方式检索get_taxonomy. 但有两个陷阱:

  1. get_taxonomy 返回一个对象,而register_taxonomy 请求关联数组,因此我们需要类型转换
  2. capabilities 参数存储为cap 内部,因此我们需要更改其名称
以下是代码:

add_action( \'init\', \'u16975_disable_category_creation\' );
function u16975_disable_category_creation(){
    $tax = get_taxonomy( \'category\' );
    $tax->capabilities = (array)$tax->cap;
    $tax->capabilities[\'edit_terms\'] = \'do_not_allow\';
    register_taxonomy( \'category\', \'post\', (array)$tax );
}

SO网友:Pieter Goosen

版本4.4引入了register_taxonomy_args 筛选输入register_taxonomy() 可用于筛选用于注册分类的参数

/**
 * Filter the arguments for registering a taxonomy.
 *
 * @since 4.4.0
 *
 * @param array  $args        Array of arguments for registering a taxonomy.
 * @param array  $object_type Array of names of object types for the taxonomy.
 * @param string $taxonomy    Taxonomy key.
 */
$args = apply_filters( \'register_taxonomy_args\', $args, $taxonomy, (array) $object_type );
因此,您可以执行以下操作:

add_filter( \'register_taxonomy_args\', function ( $args, $taxonomy, $object_type )
{
    // Only target the built-in taxonomy \'category\'
    if ( \'category\' !== $taxonomy )
        return $args;

    // Set our capability \'edit_terms\' to our value
    $args["capabilities"]["edit_terms"] = \'do_not_allow\';

    return $args;
}, 10, 3);
在所有旧版本上,您要么需要重新注册完整的“类别”分类法,要么使用您在问题中所使用的方法

编辑的Codex页面register_taxonomy 他说

此函数用于添加或覆盖分类法这正是它所做的,它要么创建自定义分类法,要么完全重写并注册核心分类法,它不向现有分类法添加任何额外参数

相关推荐

如何控制根据Taxonomy术语显示什么模板?

我正在建立一个商业目录,并将给出一些背景,然后在最后有2个问题。The development URL is: http://svcta.lainternet.biz/The website I am rebuilding is: https://www.visitsimivalley.com/当前网站要求每个分类法类型具有唯一的业务概要文件。例如,如果您是一家酒店,并且您也有会议室和婚礼场地,那么您最终会得到3个列表,一个用于酒店,一个用于会议,一个用于婚礼。我希望有一个主配置文件,其中包含我们将显示的