我已成功创建了一个自定义帖子类型,并使用URL重写更改了URL:
domain.com/post-type/slug
收件人:
domain.com/some-string/custom-field-value-1/custom-field-value-2/slug
这是可行的,但对我的项目进行了一些更改,要求我改为这样做:
domain.com/some-string/custom-field-value-1/custom-field-value-2/slug
domain.com/some-other-string/custom-field-value-1/custom-field-value-2/slug
从本质上讲,路径的第一部分需要是动态的,以便“一些字符串”和“一些其他字符串”都有效。
我已经更新了重写规则以适应此更改,这些页面确实可以正常工作,但网站上的其他页面(除了首页)都无法正常工作。我看到了页眉和页脚,但没有内容。
以下是我的自定义帖子类型注册的相关部分:
\'rewrite\' => array(
\'slug\' => \'%keyterms%/%community%/%address%\',
\'with_front\' => false,
)
这是我的代码:
function inventory_rewrite_tags() {
add_rewrite_tag(\'%keyterms%\', \'(.*)\');
add_rewrite_tag(\'%community%\', \'(.*)\');
add_rewrite_tag(\'%address%\', \'(.*)\');
}
add_action(\'init\', \'inventory_rewrite_tags\');
function inventory_link_rewrite($link, $post) {
if($post->post_type === \'inventory\') {
$community = get_field(\'community\', $post->ID);
$address = get_field(\'address\', $post->ID);
$possession_terms = wp_get_post_terms($post->ID, \'possession\');
$build_type_terms = wp_get_post_terms($post->ID, \'build_type\');
$ownership_terms = wp_get_post_terms($post->ID, \'ownership\');
// Add keyterm
if($ownership_terms[0]->slug == \'rental\') {
$link = str_replace(\'%keyterms%/\', \'apartments-for-rent/\', $link);
} else {
$link = str_replace(\'%keyterms%/\', \'homes-for-sale/\', $link);
}
// Add community
if($community) {
$link = str_replace(\'%community%/\', $community[0]->post_name . \'/\', $link);
} else {
$link = $possession_terms ? str_replace(\'%community%/\', $possession_terms[0]->slug . \'/\', $link) : $link;
}
// Add address
if($address) {
$link = str_replace(\'%address%/\', sanitize_title($address) . \'/\', $link);
} else {
$link = $build_type_terms ? str_replace(\'%address%/\', $build_type_terms[0]->slug . \'/\', $link) : $link;
}
}
return $link;
}
add_filter(\'post_link\', \'inventory_link_rewrite\', 10, 2);
不幸的是,创建第二个帖子类型不是一个选项。
最合适的回答,由SO网友:Sally CJ 整理而成
问题在于add_rewrite_tag(\'%keyterms%\', \'(.*)\')
, 这会导致重写冲突,因为生成的重写规则将匹配http://example.com/(anything-here)
还有那个(anything-here)
可以是页面(帖子类型page
) slug,因此http://example.com/page-slug
不起作用—你不会得到404
错误页面,但也不会显示正确的页面。
因此,请查看您的代码,而不是使用(.*)
(匹配任何内容),您应该指定精确的值,在您的情况下,该值为apartments-for-rent
或homes-for-sale
:
add_rewrite_tag(\'%keyterms%\', \'(apartments-for-rent|homes-for-sale)\');
这应该可以,但一定要刷新重写规则—只需访问永久链接设置页面。
抱歉,我不知道WordPress没有保留所有重写规则的正则表达式,特别是对于WordPress所在的附件removes the brackets ((
和)
):
// Relevant code in WP_Rewrite::generate_rewrite_rules().
$submatchbase = str_replace( array( \'(\', \')\' ), \'\', $match );
我知道你把RegEx改成了
([aehomnprt]+s-for-[aelnrst]+)
虽然不如
(apartments-for-rent|homes-for-sale)
.
因此,除了备用正则表达式之外,您还可以(apartments-for-rent|homes-for-sale)
工作原理如下(此代码将放在主题函数文件中):
add_filter( \'rewrite_rules_array\', \'fix_inventory_rewrite_rules\' );
function fix_inventory_rewrite_rules( $rules ) {
$rules2 = [];
$values = \'apartments-for-rent|homes-for-sale\';
$_re = $values . \'/\';
$my_re = preg_quote( $_re, \'/\' );
foreach ( $rules as $regex => $query ) {
if ( preg_match( \'/^\' . $my_re . \'/\', $regex ) ) {
$regex = str_replace( $_re, \'(\' . $values . \')/\', $regex );
}
$rules2[ $regex ] = $query;
}
return $rules2;
}