Init钩子上的flush_rules()有多糟糕?

时间:2015-02-04 作者:Erick Martim

根据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 变量实际上会传递给重写规则。如果我把它取出来,重写只会转到索引页,值应该为空的地方。如果你想知道,我在自定义帖子类型上创建了过滤器,它们通过使用自定义字段与每个帖子相关,因为它们类似于四个或五个,并且在这个项目的每个类别上都存在。正如你所看到的,我已经有了一个类别/子类别结构,我觉得在每个主要类别内手动再次创建这些过滤器并不明智。

1 个回复
SO网友:Mark Kaplun

听起来您误解了如何添加重写规则,因为您的结构比较常见,不应该在每次加载页面时刷新规则。

影响取决于您的重写规则集,而codex有些过时,我认为它不像以前的几个版本那么糟糕,但它仍在更新选项,可能会写入DB。事实上,你的网站可能在每次页面加载时都能保存到数据库中(一些统计插件可以这样做),但它是完全不可伸缩的,一旦你的网站获得流量,它就会崩溃。

结束

相关推荐

Performance on WPMS

我的WPMS站点托管在8核/32mb RAM服务器上,但响应时间非常长。我们有大约1000个博客(单个db上有35000多个表)和70000个页面浏览量。我认为我可以缩短响应时间,将具有更多页面浏览量的博客移动到单独的DB中,并使用hyper DB插件将所有博客拆分为每个DB 100个博客。你觉得怎么样?