1。在运行WP\\u query之前设置查询这似乎是在尽量减少数据库查询时要记住的最重要的事情,因为更改查询的唯一机会当然是在SQL数据库中运行之前。
Normal Queries
对于普通查询,WordPress使用wp()
函数,该函数依次调用$wp->main( $query_vars )
. 条件标记中的“is\\uvariables”在传递给之前进行设置WP_Query->get_posts()
, 它将其转换为MySQL数据库查询,并最终将其存储在$wp\\u查询对象中。可以在中实际运行查询之前对其进行筛选SQL database.
这个pre_get_posts
操作挂钩到此流程中,允许您在将查询传递给之前更改查询WP_Query->get_posts()
.
例如,如果要筛选“特色”类别中帖子的查询,可以使用add_action( \'pre_get_posts\', \'your_function_name\' );
并包括in_category
内的条件标记your_function_name
.
function your_function_name( $query ) {
if ( $query->in_category( \'featured\' ) && $query->is_main_query() ) {
// Replace 123 with the category ID of the featured category.
$query->set( \'cat\', \'123\' );
}
}
add_action( \'pre_get_posts\', \'your_function_name\' );
请参见
Plugin API/Action Reference/pre get posts « WordPress Codex Page Requests
对于页面模板,例如“特色”类别的存档页面,条件标记在pre_get_posts
滤器例如,您不能使用is_category
检查存档页,因为WP\\U查询尚未运行。
相反,您必须使用new WP_Query
看起来像是$query = new WP_Query( \'cat=123\' );
. 这将从一开始就使用适当的参数集运行查询。
看见Class Reference/WP Query « WordPress Codex
2。保存到数据库
您可以使用过滤器
wp_insert_post_data
确保仅将与自定义帖子类型相关的$数据返回到
wp_insert_post
. 请确保包含条件语句以检查自定义帖子类型
Plugin API/Filter Reference/wp insert post data « WordPress Codex 此挂钩由wp_insert_post
函数,该函数由调用wp_update_post 更新自定义帖子类型时,通常通过保存草稿或发布帖子。
不过,您必须自己进行基准测试,因为我个人无法谈论减少数据库中更新的数据的优化意义。
3。自定义帖子类型是否会影响性能
根据我的经验,自定义帖子类型是管理内容的强大工具。我不知道还有什么其他方法可以以它允许的所有方式来管理帖子,从而使用更少的资源。我个人将集中精力寻找尽可能减少查询数量的方法。
以前,permalink结构存在一个性能问题,导致它在以文本而不是数字开头时受到攻击。3 这对于承载大量页面的站点来说尤其麻烦,但自WordPress版本3.3以来就已经解决了。
我在这里只提到permalinks,因为slug通常是permalink结构的第一部分,它可能会也可能不会影响3.3版之前的性能。除此之外,我不知道使用自定义帖子类型会产生任何性能问题。
其他性能选项
Transients这并不能替代将查询保持在代码中的最小值,但您可以使用
set_transient 将查询存储一段时间,以便不需要新查询。以下是中使用的示例
Dave Clements\' post. 此外,请注意,他建议添加
save_post
在更新给定post类型时删除瞬态的操作。
<?php // IN THE SPOTLIGHT QUERY
if( false === ( $its_query = get_transient( \'its_query\' ) ) ) {
$pttimestamp = time() + get_option(\'gmt_offset\') * 60*60;
$its_query = new WP_Query( array(
\'post_type\' => \'spotlight\',
\'posts_per_page\' => 1,
\'post__not_in\' => $do_not_duplicate,
\'meta_query\' => array(
array(
\'key\' => \'_hpc_spotlight_end_time\',
\'value\' => $pttimestamp,
\'compare\' => \'>\'
)
)
) );
set_transient( \'its_query\', $its_query, 60*60*4 );
}
if( have_posts() ) { // HIDE SECTION IF NO CURRENT ITS FEATURE ?>
// LOOP GOES HERE: NOT IMPORTANT TO EXAMPLE
<?php } ?>
More query optimization<托马斯·格里芬有一些好的建议
Optimize WordPress Queries 辅导的以下是他的建议列表:
设置\'cache_results\' => false
在一次性查询中,如果您的服务器未使用持久缓存(如Memcached)。一次性查询被描述为“用于显示少量数据的查询。可能是您只想显示与当前帖子相关的链接帖子标题,或者您可能想显示帖子下拉列表以选择特定选项设置。”
他的例子:$query = get_posts( array( \'posts_per_page\' => 1,
\'cache_results\' => false ) );
设置\'no_found_rows\' => true
不需要分页的位置。这将“绕过MySQL计算结果,看看是否需要分页”
他的例子:$query = new WP_Query( array( \'posts_per_page\' => 1,
\'no_found_rows\' => true ) );
仅当您只需要这些信息时,才查询帖子ID\'fields\' => \'ids\'
在里面get_posts
. 这将大大减少返回的数据量,如果您查看Database Description « WordPress
Codex
他的例子:$query = get_posts( array( \'posts_per_page\' => 1,
\'fields\' => \'ids\' ) );
除了最后一条提示,当您只需要一个或几个post字段时,可以使用get_post_field.
对查询的工作方式有一个坚实的理解是至关重要的。查询越具体,对SQL数据库的要求就越少。这意味着管理数据库查询的可能性很大。在自定义查询运行的地方一定要小心(是管理页面吗?),正确使用sanitization 在直接查询中,尝试使用本机WordPress函数,这样可以实现相同的性能。