注意:此问题也出现在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类别的挂钩)。
SO网友:Tom J Nowell
自定义分类法和post类型不是这样工作的
这就是你要做的:
在init
钩子,呼叫register_custom_taxonomy
或register_post_type
如果您将通话改为register_custom_taxonomy
或register_post_type
, 或者在代码中添加新的永久链接,通过访问永久链接设置页面并单击保存来重新生成永久链接,完成了colour
, 我不需要刷新永久链接来创建red
或blue
条款。如果我创建了一个名为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是一个“昂贵”的函数,但它只会在导航菜单更新时调用,而导航菜单不会经常更新。