是否可以重新声明/更改插件的现有自定义帖子类型的子标签(而无需简单地编辑插件)?

,也就是说,如果插件X创建了带有子标签/ uncookedtoast /的自定义帖子类型,是否可以向functions.php(或类似内容)添加过滤器,以将子弹更改为/ bread /?

评论

我刚刚通过将优先级为20的init挂接到init中,然后针对相同的帖子类型再次调用register_post_type来解决了这个问题。有人知道这是否会给我带来麻烦吗?

#1 楼

是的,这是可能的,但是如果插件正在使用rewrite => array('slug' => 'post_type')参数创建自定义帖子类型,则您不太可能替换掉子弹。

每当自定义帖子类型时创建后,URL重写规则将写入数据库。根据哪个操作触发自定义帖子类型的创建(例如init操作),WordPress将刷新重写规则并还原自定义帖子类型的标记,无论您尝试进行什么更改。

也就是说,您可以为自定义帖子类型提供自定义标签。下面的示例假设您具有movies的自定义帖子类型,并且您尝试将/movies/子弹更改为/films/。为完整起见,这是用于定义movies自定义帖子的基本功能类型。您要引用的插件应该执行以下操作:

function movies_register_post_type() {

    register_post_type(
        'movies',
        array(
            'labels' => array(
                'name' => __('Movies'),
                'singular_name' => __('Movie')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array(
                'slug' => 'movies'
            )
        )
    );

} // end example_register_post_type
add_action('init', 'movies_register_post_type');


您可以通过基于现有帖子类型提供自己的自定义规则来修改选项表。

基本上,我们将这样做:与自定义帖子类型的子句相比,新规则具有更高的优先级

这里是如何执行此操作的方法:观看电影的方法:


/movies/Back-To-The-Future
/films/Back-To-The-Future

请注意,我不建议将add_custom_rewrite_rule钩入init操作中,因为它会触发太频繁了。这只是一个例子。应用此功能的一个更好的地方是主题激活,插件激活,或者save_post操作等。根据您需要执行的操作,您可能只需要触发一次或仅几次。

此时,您可能需要考虑更新自定义帖子类型的永久链接以使用'/movies/子弹。例如,如果导航到/films/,将看到所有电影的列表,但将鼠标悬停在标题上将显示/movies/子弹仍在使用中。

要更进一步,您可以从技术上讲,状态为301重定向以捕获到/movies/的所有链接以重定向到其/films/的对应链接,但这全都取决于您要执行的操作。

评论


做工精美!您还能为我指出更新永久链接的正确方向吗?

–爱德伯里
2012年2月13日在20:23



根据您的主题,您可以在模板级别执行此操作。当看到对“ the_title()”的调用时,可以将其替换为$ title = get_the_title(),然后将$ title中的“ / movies /”替换为“ / films /”。

–汤姆
2012年2月14日下午13:16

如果您想更改的子弹是由当前帖子的元值动态创建的,该怎么办?我需要能够在add_custom_rewrite_rule()函数中使用$ post,但是它在WP Admin中抛出错误,提示“试图获取非对象的属性”。如何获取$ post以获得元值?

–李
18年1月17日在16:15



#2 楼

该代码对于我的孩子主题非常有效。需要将“程序”子弹更改为“位置”。

/*
CHANGE SLUGS OF CUSTOM POST TYPES
*/

function change_post_types_slug( $args, $post_type ) {

   /*item post type slug*/   
   if ( 'program' === $post_type ) {
      $args['rewrite']['slug'] = 'place';
   }

   return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );

/*
CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages
*/

function change_taxonomies_slug( $args, $taxonomy ) {

   /*item category*/
   if ( 'program-category' === $taxonomy ) {
      $args['rewrite']['slug'] = 'locations';
   }

   return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );


评论


它运行完美,我也将其用于添加相对规则的标签,有必要通过从设置页面>永久链接执行保存来更新永久链接。谢谢!

–洛伦佐·马贡(Lorenzo Magon)
18-10-19在18:17

也可以完美地更改其他args,我需要将$ args ['has_archive'] = false设置为有效。

–仅开发
19年2月8日在16:35

如果我想更改帖子永久链接而不是cpt slug,该怎么办,例如:themename / projects / ** slug-of-post ** ??

– Krys
20-10-15在9:05