$ wp_rewrite-> flush_rules()对' init'有多糟糕?动作挂钩?

时间:2015-02-04 12:50:41

标签: wordpress performance rewrite

根据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个查询以验证我所在的网址是否适用于我希望该规则应用的过滤器,或者它是否为产品网址。在后者中,我希望wordpress能够正常运行。但我必须以任何方式清除规则,无论是产品还是产品类别和过滤器,这样两个页面都能正常运行并且能够正常运行。

我这样做是为了尽可能地缩小这个功能的使用范围,但Codex并没有真正告诉我它对性能有多么糟糕,或者为什么。 我顺便将该函数的参数传递为 false ,因此它不会重写我的htaccess文件,但我不确定重写的位置存储规则选项,如果它存储在某个地方或数据库中,希望它们能对此作出一些澄清。

提前感谢您阅读此问题。任何指针都在这里受到赞赏,即使你想指出我这样做的其他方式。 :)


编辑:在这里发布一些代码,这样你们就可以真正理解我的意思,让我知道这可能是不好的做法......也许是关于如何做得更好的建议。

<?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 个答案:

答案 0 :(得分:1)

'wp_options'表中有一个'rewrite_rules'记录,其中包含所有重写规则。当调用flush_rules()时,WordPress将清除此记录并重新生成所有新规则,包括您未更改的规则。