无法更改自定义帖子类型的URL重写的第一部分

时间:2019-11-19 作者:hmakein

我已成功创建了一个自定义帖子类型,并使用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);
不幸的是,创建第二个帖子类型不是一个选项。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

问题在于add_rewrite_tag(\'%keyterms%\', \'(.*)\'), 这会导致重写冲突,因为生成的重写规则将匹配http://example.com/(anything-here) 还有那个(anything-here) 可以是页面(帖子类型page) slug,因此http://example.com/page-slug 不起作用—你不会得到404 错误页面,但也不会显示正确的页面。

因此,请查看您的代码,而不是使用(.*) (匹配任何内容),您应该指定精确的值,在您的情况下,该值为apartments-for-renthomes-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;
}

相关推荐