此代码生成正确的结构,但找不到帖子(404)
这是因为自定义重写标记(%filter_1%
和%filter_2%
) 在生成的重写规则(在数据库中)中按原样显示。因此,您需要注册标记,以便在WordPress(重新)生成规则时用适当的RegEx(正则表达式)模式替换它们。
您可以使用add_rewrite_tag()
像这样:
function register_work() {
// Register the custom rewrite tags.
add_rewrite_tag( \'%filter_1%\', \'([^/]+)\' );
add_rewrite_tag( \'%filter_2%\', \'([^/]+)\' );
// ... then register the post type.
}
这应该可以修复错误,但您应该知道,您的帖子类型的重写规则将导致页面(的帖子
page
键入)显示主页而不是正确的页面。
因此,您应该只使用一个唯一的重写基,例如。work
如中所示\'slug\' => \'work/%filter_1%/%filter_2%\'
避免与其他重写规则发生冲突,尤其是WordPress中的默认规则。
然而,如果您真的必须使用无重写基,那么有一种方法。
但每次创建或删除filter
您只需访问permalink设置页面,就可以手动刷新重写规则。
Note: 是的,有一种编程方式可以自动刷新重写规则,但手动执行非常简单,所以只需创建/编辑/删除filter
批量输入术语,然后手动刷新重写规则。:)
而且不应该有任何帖子(页面、帖子、CPT)或术语与您的filter
条款。一、 e.如果您有filter
slug术语foo
, 那你应该no 具有slug的帖子或术语(在其他分类法中)foo
.
但我真正的意思是,你可以使用相同的子弹,但不是在所有情况下都要小心。例如,如果work
CPT岗位有foo/bar/baz
作为永久链接,则不应该有带有该路径的页面,即带有slug的页面baz
那是一个bar
和foo
第页。
如果这些对您有好处,那么下面是您可以尝试的代码:
add_filter( \'rewrite_rules_array\', function ( $rules ) {
$terms = get_terms( [
\'taxonomy\' => \'filter\',
\'hide_empty\' => false,
\'fields\' => \'slugs\',
] );
if ( ! is_wp_error( $terms ) ) {
foreach ( $terms as $slug ) {
$match = "^{$slug}/(.*?)/([^/]+)(?:/(\\d+)|)/?$";
$query = \'index.php?post_type=work&work=$matches[2]&name=$matches[2]&page=$matches[3]\';
$rules[ $match ] = $query;
}
}
return $rules;
} );
And 除此之外:
英寸register_work()
, 使用work
作为基础:\'slug\' => \'work/%filter_1%/%filter_2%\',
然后在custom_permalinks()
功能:
// You need to replace this:
$find = array(\'%filter_1%\',\'%filter_2%\');
// with this:
$find = array(\'work/%filter_1%\',\'%filter_2%\');