在这里,您需要考虑很多事情,似乎您正在提高查询的性能。你必须问自己的第一个也是最重要的问题是:
我需要自定义查询吗
我做了一个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\'=>true
到WP_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
);