重新声明/更改插件的自定义发布类型的插件

时间:2012-02-11 作者:Edbury

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

也就是说,若插件X创建了一个带有slug/uncokedtoast/的自定义post类型,那个么是否可以向函数添加一个过滤器。将slug更改为/bread/?

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

是的,这是可能的,但是如果插件使用rewrite => array(\'slug\' => \'post_type\') 参数,则不太可能替换段塞。

每当创建自定义帖子类型时,URL重写规则都会写入数据库。取决于触发创建自定义帖子类型的操作(例如init 操作),WordPress将刷新重写规则并恢复自定义帖子类型的slug,而不管您尝试进行什么更改。

也就是说,您可以为自定义post类型提供自定义slug。以下示例假设您有一个自定义的post类型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\');
您可以通过基于现有帖子类型提供自己的自定义规则来修改选项表。

基本上,我们将这样做:

使用现有的规则集,然后使用我们自己的自定义slug编写我们自己的规则,赋予新规则比自定义post类型的slug更高的优先级,以下是您可以执行此操作的方法:

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-Futureadd_custom_rewrite_rule 进入init 动作,因为它会频繁开火。这只是一个例子。应用该功能的更好地方是主题激活、插件激活,可能是save\\u post操作等。根据需要执行的操作,您可能只需要启动一次或几次。

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

    更进一步,从技术上讲,您可以安装301重定向以捕获指向的所有链接/movies/ 重定向到其/films/ 但这一切都取决于你想做什么。

SO网友:Iggy

这段代码对我的孩子主题很有效。需要将“program”slug更改为“place”。

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

SO网友:call0fcode

在我的例子中,有一个插件(主题工作所需)注册了一个自定义的帖子类型,我想对其进行一些更改,比如slug等。

因此,我所做的是通过在我的子主题中添加以下内容来重新注册(某种程度上覆盖插件的注册函数)自定义帖子类型functions.php 像这样的文件:

function my-theme-name_post_type_my-custom-post-type-name()
{
   $labels = array(
      ...
   );

   $args = array(
      ...

      \'rewrite\' => array(
         \'slug\' => __(\'the-slug-of-your-choise\', \'the-textdomain-of-your-choise-for-translation-if-needed\'),
      ),
   );
   register_post_type(\'the-custom-post-type-name-registered-by-the-plugin\', $args);
}
add_action(\'init\', \'my-theme-name_post_type_my-custom-post-type-name\');
如您所见,只需将以下内容添加到$args 阵列:

\'rewrite\' => array(
    \'slug\' => __(\'the-slug-of-your-choise\', \'the-textdomain-of-your-choise-for-translation-if-needed\'),
)
有关此方面的更多信息,请访问:https://developer.wordpress.org/reference/functions/register_post_type/

VERY IMPORTANT

Remember to refresh you permalinks in order the changes to be applied 因此,您可以访问相关帖子。转到永久链接设置,只需按;保存;。。那么它应该会起作用!

结束

相关推荐

Must slugs be unique?

不管url的其余部分是什么,或者是否被不同的帖子类型或分类法使用,slug是否总是唯一的?例如,是否可以同时拥有这两个URL?mysite.com/industry/biotech/report/ mysite.com/industry/retail/report/ 谢谢,托德