根据the Codex:
[…]此功能在性能方面可能会非常昂贵。它应该尽可能少用,比如在插件或主题的激活或停用期间。应尽一切努力避免在每次页面加载时执行的挂钩中使用它,例如init.
好的,所以,我知道它不应该在每个页面加载中使用,我也不是,但我仍然需要一个非常有条件的重写规则。我有以下两种url结构:
- example.com/products/tables/fancy-computer-table //This is a product url, here I expect the normal behavior from wp.
- example.com/products/tables/office //This should be some kind of a filter, where the site gets all the tables related to the office department. Note how both URL structure matches.
为了让它工作,我使用一些正则表达式将其缩小到这些非常特定的URL。如果匹配,我将运行2个查询,以验证我所在的url是否用于我希望应用该规则的过滤器,或者它是否是产品url。在后者中,我希望wordpress表现正常。但我必须以任何一种方式刷新规则,无论是产品还是类别和过滤器,以便两个页面都能正常地、友好地工作。
我这么做是为了将这个函数的使用范围缩小到尽可能小的程度,但法典并没有真正告诉我它对性能的影响有多大,或者为什么。我将该函数的参数传递为false 顺便说一下,它不会重写我的htaccess文件,但我不确定重写规则选项存储在哪里,如果它在内存中的某个地方,或者在数据库中,我希望他们能对此做出一些澄清。
提前感谢您阅读此问题。即使您想给我指出其他方法,这里也很感谢您的指点
<小时>EDIT: 在这里发布一些代码,以便你们能够真正理解我的意思,并让我知道这是否真的是一个糟糕的做法。。。也许是关于如何做得更好的建议。
<?php function custom_rewrite_products()
{
// regex to match either "products/tables/fancy-computer-table" or "products/tables/office"
preg_match(\'#products\\/([^\\/]+)\\/([^\\/]+)\\/?#\', $_SERVER[\'REQUEST_URI\'], $url_matches);
if(is_array($url_matches)) {
$query_category = new WP_Query(\'category_name=\'.$url_matches[1]);
$query_category->get_posts();
$args = array(
\'post_type\' => \'filters\',
\'name\' => $url_matches[2]
);
$query_post = new WP_Query($args);
$query_post->get_posts();
if($query_category->have_posts() && $query_post->have_posts()) {
$category_ID = \'\';
$filter = \'\';
$category_ID = \'\' . $query_category->query_vars[\'cat\'] . \'\';
$filter = \'\' . $query_post->query_vars[\'name\'] . \'\';
$string = "index.php?cat={$category_ID}&filter={$filter}";
add_rewrite_rule(\'products/([^/]+)/([^/]+)/?$\', $string, \'top\');
}
global $wp_rewrite;
//Call flush_rules() as a method of the $wp_rewrite object
$wp_rewrite->flush_rules(false);
}
}
add_action(\'init\', \'custom_rewrite_products\');
我还是不明白为什么,但这里需要冲洗,所以
$category_ID
和
$filter
变量实际上会传递给重写规则。如果我把它取出来,重写只会转到索引页,值应该为空的地方。如果你想知道,我在自定义帖子类型上创建了过滤器,它们通过使用自定义字段与每个帖子相关,因为它们类似于四个或五个,并且在这个项目的每个类别上都存在。正如你所看到的,我已经有了一个类别/子类别结构,我觉得在每个主要类别内手动再次创建这些过滤器并不明智。