WP_QUERY-筛选器还是直接?

时间:2016-01-02 作者:N00b

我的文件、模板、脚本、查询等越来越多,我需要一个好的系统来维护这一切。

我努力使一切井然有序:

<script> 模板中的标记内联CSS 只有在PHP 可以从管理选项动态更改的变量JSCSS 为了尽量减少请求等,现在是时候组织我的查询了,因为我至少有10个查询,而且数量还在不断增加。

第一个选项:使用自定义add_filter() 对于每个查询

我不必搜索查询,因为它们都在一个文件或目录中。如果需要更改,我只需在一个地方更改,而不需要在所有不同的模板中更改。第二种选择:像通常那样将所有查询写入模板

基本上,每一点都与第一个选项相反

Question:

对查询参数使用过滤器有什么缺点吗?表演还有别的吗?

<小时>

Example:

    通常:

    $args = array(
    
            \'post_type\'         => \'my-post\',
            \'posts_per_page\'    => 8,
            \'orderby\'           => \'rand\', 
        );
    
    }
    
    $results = new WP_Query( $args );
    
    过滤器:

    //In one file -> easy to find and change
    add_filter( \'some_args\', \'some_search_args\' );
    
    function some_search_args( $search_args ) {
    
        $search_args[\'post_type\'] = \'property\';
        $search_args[\'posts_per_page\'] = 8;
        $search_args[\'orderby\'] = \'rand\';
    
        //All kinds of logic and conditional code to here
    
        return $search_args;
    }
    
    
    //And
    
    
    //Just include like this to any template you want and as many as you want
    //To change the query, you\'ll just have to change to code above
    $search_args = array();
    $search_args = apply_filters( \'some_args\', $search_args );
    
    $results = new WP_Query( $search_args );
    

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

在这里,您需要考虑很多事情,似乎您正在提高查询的性能。你必须问自己的第一个也是最重要的问题是:

我需要自定义查询吗

我做了一个extensive post 关于这个问题,你应该看看。如果在阅读了我在链接中的帖子后,您对上述问题的回答是肯定的,那么在创建自定义查询时,您需要考虑以下几点

尽量避免复杂orderby 操作,如按元数据排序。SQL并不擅长排序,PHP有时速度更快。我倾向于usort() 用于复杂的排序以节省资源。随机排序对资源也很困难

避免(在您可以的地方)使用大量嵌套的meta和tax查询构建复杂查询,特别是使用大量OR 操作员。这些对资源来说是相当困难的。

使用LIKE 生成的SQL中的运算符。这些也很贵

使用transients和缓存)来存储昂贵的查询。对于随机查询,您不能这样做,因此需要研究其他方法来解决此问题

始终避免典型的foreach 循环获取术语列表,然后为每个术语运行自定义查询,这非常昂贵。而是查询所有帖子和一次,然后使用usort() to sort the results

根据需要创建查询。大多数时候,我们只需要查询帖子,就可以将它们的ID传递给另一个函数。在这样的情况下,只查询帖子ID。这确实节省了很多资源。只需添加\'fields\'=>\'ids\', 到您的查询参数

要加快非分页查询的速度,请使用get_posts() 或者直接通过\'no_found_rows\'=>trueWP_Query (“get\\u posts”就是这样做的)。这将跳过分页过程,并在大型数据库上节省大量资源

这只是一种加快查询速度的指南。还有其他一些事情需要加快查询速度。

对查询参数使用过滤器有什么缺点吗?表演还有别的吗?

我不明白为什么会有问题。如果你正在创建一个商业主题,那么你的做法肯定是正确的。让一些东西可以过滤,可以让儿童主题作者的生活更加轻松。它可能会花费1毫秒到1毫秒,但它肯定是时间利用得很好的。这就像卫生设施。卫生设施需要花费时间和资源(虽然它非常少),但在某些东西上多花费一毫秒可以使您的网站免受黑客攻击和破坏

恕我直言,您需要寻找其他方法来加快查询速度,同时不影响可用性和可维护性。选项2绝对是你应该为商业主题做的事情

想法(可能有点过火;-)

您也可以使用pre_get_posts 筛选自定义查询并使其可筛选。这很简单,只需在查询中设置自己的自定义参数,然后他们就可以使用该参数来确定查询的目标

在下面的示例中,我们将使用自定义参数query_no 我们将给出数值

The Queries

$q1 = new WP_Query( [\'query_no\' => 1] );    
$q2 = new WP_Query( [\'query_no\' => 2] );    
$q3 = new WP_Query( [\'query_no\' => 3] );    

pre_get_posts

add_action( \'pre_get_posts\', function( $q ) 
{
    if ( $q->get( \'query_no\' ) == 1 ) {
        $q->set( \'posts_per_page\', -1 );
        // Add any other extra arguments to set
    }

    if ( $q->get( \'query_no\' ) == 2 ) {
        $q->set( \'post_type\', [\'post\', \'page\'] );
        // Add any other extra arguments to set
    }

    if ( $q->get( \'query_no\' ) == 3 ) {
        $q->set( \'post_status\', \'trash\' );
        // Add any other extra arguments to set
    }
} );
用户现在可以添加其他参数或更改传递的参数

add_action( \'pre_get_posts\', function( $q ) 
{
    if ( $q->get( \'query_no\' ) == 2 ) {
        // Lets add another post type
        $post_types = $q->get( \'post_type\' );
        $post_types = array_merge( $post_types, [\'my_post_type\'] );

        $q->set( \'post_type\'     , $post_types );
        $q->set( \'posts_per_page\', -1          );
        // Add any other extra arguments to set
    }

}, 
11 // Make sure this runs after the default action
); 

相关推荐

绕过WP查询中的“supress_Filters”

显然,出于某种不合逻辑的原因,开发人员决定获取所有语言帖子的唯一方法是添加supress_filters=true 到WP\\u查询(而不是像这样language_code=all 选项)。无论如何,我的情况是,我需要获取所有语言的帖子,但也需要使用过滤器修改WP\\u查询。有没有办法强制将我的过滤器添加到查询中,即使supress_filters 设置为false?这是我需要添加的过滤器:add_filter( \'posts_where\', function($where, $wp_query) {