如何让WordPress识别产品URL之后的定制URL段并使用定制模板?

时间:2021-11-13 作者:Timothy Fisher

基本上,我尝试允许这样的URL:

https://example.com/products/my-product/test

我在使用WooCommerce,我的产品基础是/products, 产品名称为My Product 在这里我想允许URL段/test 然后检测并重定向到自定义模板。

我就快到了,但我不能template_include 筛选以正确使用自定义模板。

add_filter( \'query_vars\', function ( $vars ) {
    $vars[] = \'test\';
    return $vars;
} );

add_action( \'init\', function () {
    flush_rewrite_rules(); // for testing only
    $product_base = ltrim( get_option( \'woocommerce_permalinks\' )[ \'product_base\' ], \'/\' );
    add_rewrite_rule( "{$product_base}/([^/]+)/test", \'index.php?product=$matches[1]&test=1\', \'top\' );
} );

add_filter( \'template_include\', function( $template ) {
    if ( get_query_var( \'test\' ) ) {
        $template = get_stylesheet_directory() . \'/templates/test.php\';
    }
 
    return $template;
}, 1, PHP_INT_MAX );
Thetemplate_include 函数正在正确返回要使用的模板,但当我转到https://example.com/products/my-product/test 它只返回产品页面。

1 个回复
SO网友:Timothy Fisher

看来我要做的就是template_include 过滤器内部init 行动资料来源:https://stackoverflow.com/a/50037707/5749974

add_action( \'init\', function () {
    $product_base = ltrim( get_option( \'woocommerce_permalinks\' )[ \'product_base\' ], \'/\' );
    add_rewrite_rule( "{$product_base}/([^/]+)/test", \'index.php?product=$matches[1]&test=1\', \'top\' );

    add_filter( \'template_include\', function( $template ) {
        if ( get_query_var( \'test\' ) ) {
            $template = get_stylesheet_directory() . \'/templates/test.php\';
        }
     
        return $template;
    } );
} );
现在https://example.com/products/my-producthttps://example.com/products/my-product/test 两个负载均正确!