WordPress:为什么add_rewrite_rule不工作?

时间:2017-03-29 16:41:55

标签: wordpress url-rewriting

目标

可见的网址:

/products/building-automation/details/productSKU

应该指向真正的WordPress页面:

/products/details/?SKU=productSKU

代码

public function setup_frontend() {

    add_rewrite_rule(
        'products/(building-automation|lighting-controls)/details/([^/]*)',
        'products/details/?SKU=$matches[2]',
        'top'
    );

    // Other code logic...

}

据我所知,$matches指向()中正则表达式的部分,因此在示例中,$matches[1]将为building-automation,并且$matches[2]将是productSKU

我曾多次尝试过冲洗规则。这是从类内部调用的,但这似乎不是问题。我将该函数附加到init事件。

发生了什么

我正在获取404模板。我做错了什么?

修改

原来,参数HAS的第二部分为index.php。因为我试图指向products/...,所以它破了。所以我更新到了这个:

    add_rewrite_rule(
        'products/(building-automation|lighting-controls)/details/([^/]*)',
        '?pagename=products/details&SKU=$matches[2]',
        'top'
    );

它不起作用并指向正确的页面和模板。但是,$matches部分仍未通过。事实上,$_GET['SKU']正在'$matches[2]'

3 个答案:

答案 0 :(得分:2)

第一个问题是,它指的是不以index.php开头的东西。不幸的是,它必须指向index.php?stuff。但您仍然可以使用页面名称,如下所示。

add_rewrite_rule(
    'products/(building-automation|lighting-controls)/details/([^/]*)',
    'index.php?pagename=products/details&SKU=$matches[2]',
    'top'
);

其次,您需要注册查询字符串,即SKU。加上这个:

add_filter( 'query_vars', 'product_details_rewrite_filter' );

function product_details_rewrite_filter( $query_vars ){
    $query_vars[] = 'SKU';
    return $query_vars;
} 

你仍然会遇到问题。 $_GET['SKU']将是$matches[2],而不是RIBU1C。要解决此问题,请将$matches[2]更改为$2。然后它会工作:

add_rewrite_rule(
    'products/(building-automation|lighting-controls)/details/([^/]*)',
    'index.php?pagename=products/details&SKU=$2',
    'top'
);

答案 1 :(得分:1)

它没有以这种方式工作......你试图用这段代码实现不可能。使用index.php路由重写wordpress中的规则,但不使用外部路径。所以

products/(building-automation|lighting-controls)/details/([^/]*)

应该是"可翻译的" to" wordpress"语言(类似的东西)

index.php?post_type=products&category=$matches[1]&scu=$matches[1]

注意,scu也应定义为额外的var。

编辑1: 事情(我认为)你试图获得实际上看起来像一个htaccess规则模式,在这种情况下,您可以使用mod_rewrite_rules过滤器(它过滤到.htaccess的内容)来根据需要更改它。

编辑2: 广告 - 您还可以使用名为debug bar rewrite rules的调试栏插件来基本调试此数据。注意:(目前它不通过add_rewrite_rule支持规则列表,因此您只能直观地检查规则,看看它是否符合您的期望。)

答案 2 :(得分:0)

1)尝试更新永久链接。

转到信息中心 - >设置 - >永久链接 - >按钮"保存更改"

2)为你的功能添加动作

add_action('init', 'setup_frontend');
function setup_frontend() {

add_rewrite_rule(
    'products/(building-automation|lighting-controls)/details/([^/]*)',
    'products/details/?SKU=$matches[2]',
    'top'
);

// Other code logic...

}