将新类别添加到自定义帖子类型分类时更新固定链接

时间:2017-05-22 作者:Ryan Coolwebs

注意:此问题也出现在https://stackoverflow.com/questions/44060613/update-permalinks-when-new-category-added-to-custom-post-type-taxonomy (但并没有得到太多的爱)。

为我正在处理的WordPress主题创建了一组自定义帖子类型(CPT)(以及它们自己的分类法和标记)。出于这个问题的目的,我将只关注“项目”CPT。

当添加新的项目类别,然后在导航菜单中链接到时,用户将看到404错误,直到永久链接被保存,清除WordPress的路由缓存。

我在想实现这一点的最佳方法是使用flush\\u rewrite\\u rules();

尽管如此,我并不轻视它,因为最佳实践强烈建议仅在激活/停用插件时使用此功能。https://codex.wordpress.org/Function_Reference/flush_rewrite_rules#Usage

我想做的是在创建新的CPT类别时(通过post或admin屏幕)挂接触发的操作,然后在该操作上运行刷新重写,以便WP管理员不必担心通过permalinks上的更新强制Wordpress路由缓存。

我看了这个Hook onto Add New Category 有关可能的解决方案,并尝试使用此代码:

function custom_created_term( $term_id, $tt_id, $taxonomy )
{
    $project_cpt = \'CPT_PROJECT\';  // Edit this to your needs
    $project_tax = \'TAX_PROJECT_CATS\';  // Edit this to your needs

    if( DOING_AJAX && $project_tax === $taxonomy )
    {
        // Try to get the post type from the post id in the referred page url
        // Example: /wp-admin/post.php?post=2122&action=edit&message=1

        parse_str( parse_url( wp_get_referer(), PHP_URL_QUERY ) , $params );

        if( isset( $params[\'post\'] ) )
        {
            $post_id = intval( $params[\'post\'] );
            if( $post_id > 0 && $project_cpt === get_post_type( $post_id ) )
            {
                flush_rewrite_rules(true);

            }
        }
    }
}
但这对我来说并不是真的奏效。不确定我是否在这里使用了正确的工具,或者我是否做错了什么。我已经搜索了很多解决方案,但在这里我还没有找到解决问题的好方法(找不到创建新CPT类别的挂钩)。

2 个回复
SO网友:Tom J Nowell

自定义分类法和post类型不是这样工作的

这就是你要做的:

init 钩子,呼叫register_custom_taxonomyregister_post_typeregister_custom_taxonomy 或register_post_type, 或者在代码中添加新的永久链接,通过访问永久链接设置页面并单击保存来重新生成永久链接,完成了colour, 我不需要刷新永久链接来创建redblue 条款。如果我创建了一个名为shape 我会冲洗permalinks,但只冲洗一次,这样我在访问前端的形状术语时不会得到404。自定义帖子类型也是如此

请记住flush_rewrite_rules 是一个非常昂贵的函数,您永远不需要调用它。可以在插件首次安装后的插件激活挂钩中调用它,或者在WP CLI命令中调用它。

如何避免404的使用register_activation_hook 刷新重写规则。当您的插件被激活时(仅当它被激活时,而不是每次页面加载时),会调用此函数。

https://codex.wordpress.org/Function_Reference/register_activation_hook

对每个术语的创建进行刷新既是不必要的,也是有害的

如果我在一个主题中注册了我的CPT/CT怎么办

您可以使用after_theme_switch 然而,在主题中注册帖子类型和分类法是一种糟糕的做法。它会导致数据可移植性问题,例如,如果用户更改主题,他们就会丢失数据。

主题决定网站的外观,功能,尤其是数据,应该在插件中定义。

SO网友:Ryan Coolwebs

好的,我想出了一个非常简单的解决方案。只需将下面的代码放入我的Includewithin函数中。php:

add_action(\'wp_update_nav_menu_item\', function ()
{
    flush_rewrite_rules(true);
}, 10, 2);
这只是挂接到nav菜单更新功能中,所以每次管理员用户更新菜单时,它都会触发。

我知道flush-rewrite是一个“昂贵”的函数,但它只会在导航菜单更新时调用,而导航菜单不会经常更新。

结束

相关推荐

Custom taxonomy Rewrite Rule

我希望我的分类url如下:site。com/page/taxonomy\\u术语我如何才能做到这一点?我在函数中编写了wordpress重写规则代码。php如下所示:function sphere_custom_rewrite_rules( $rules ){ $newrules[\'(.+?)/([^/]*)/?\'] = \'index.php?pagename=$matches[1]&positive_sphere=$matches[2]\'; $newrul