问题描述

是否可以重新安装/更改插件现有的自定义帖子类型的插件 (不需要简单地编辑插件)?

也就是说,如果 Plugin X 创建了一个带有 slug /unokedtoast 的自定义帖子类型,那么是否可以将更改 slug 到/bread /?的 functions.php(或类似的东西) 添加一个过滤器?

最佳解决方案

是的,这是可能的,但是如果插件使用 rewrite => array('slug' => 'post_type')参数来创建自定义的帖子类型,那么你很可能无法替换这个插件。

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

也就是说,您可以为自定义帖子类型提供自定义插件。以下示例假定您具有 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');

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

基本上我们会这样做:

  • 采取现有的一套规则,然后用自己的习惯 s then 写自己的

  • 给予新的规则比自定义帖子类型的插件更高的优先级

您可以这样做:

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/对手,但这一切都取决于你正在尝试做什么。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。