重新声明/更改插件的自定义帖子类型


28

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

也就是说,如果Plugin X使用slug / uncookedtoast /创建了一个自定义帖子类型,是否可以在functions.php(或类似的东西)中添加一个将slug更改为/ bread /的过滤器?


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

Answers:


24

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

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

也就是说,您可以为自定义帖子类型提供自定义标签。以下示例假定您的自定义帖子类型为movies,并且您尝试将/movies/slug 更改为/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');

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

基本上,我们将这样做:

  • 采取现有的规则集,然后使用我们自己的自定义子句编写我们自己的规则
  • 为新规则赋予比自定义帖子类型的提示更高的优先级

这是您可以执行的操作:

function add_custom_rewrite_rule() {

    // First, try to load up the rewrite rules. We do this just in case
    // the default permalink structure is being used.
    if( ($current_rules = get_option('rewrite_rules')) ) {

        // Next, iterate through each custom rule adding a new rule
        // that replaces 'movies' with 'films' and give it a higher
        // priority than the existing rule.
        foreach($current_rules as $key => $val) {
            if(strpos($key, 'movies') !== false) {
                add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top');   
            } // end if
        } // end foreach

    } // end if/else

    // ...and we flush the rules
    flush_rewrite_rules();

} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');

现在,您将有两种访问电影的方式:

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

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

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

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


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

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

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

6

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

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

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

我也需要进行设置才能完美地更改其他arg,$args['has_archive'] = false但这确实可行。
仅开发
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.