我认为,在PHP方面很难做到这一点,因为执行WP\\U查询的方式没有什么好处,因为它仍然会导致相同的WP\\U查询在后台执行相同的逻辑。
然而,有;“简单”;任何一方获得的业绩;不使用WP\\u Query,例如通过使用(例如:$wpdb)编写更具体的SQL查询(根据我的经验,这还不能完成很多工作,当然取决于有多少meta\\u查询正在添加连接和使用额外的表等),但最大的好处是通过缓存其结果来减少查询本身的执行量。
但这只是一个好主意,这取决于数据变化的速度。
自从php7版本问世以来,尤其是现在有了php8,php本身的执行就不会像过去那样成为瓶颈。尽管如此,WordPress本身并不是建立在;“现代”;无论是ideas还是php,最大的性能损失在于它的简单,但不是非常性能友好的数据库结构。
最后,如果不能缓存数据或使用$wpdb,关键在于使查询尽可能简单,并尽量避免meta\\u查询。
哦,还有,避免随意排列你的帖子。
我将在下面添加一个小片段,我曾经写信解释为什么不这样做,对一些同事来说,这可能很有用:
此外,如果您真的只能尝试加快php代码本身的速度,请尝试使用尽可能多的type-hinting, 而严格的类型比较(====而不是==)通常会被忽略,因为WordPress文档中通常不会对其进行升级(因为它们希望尽可能向后兼容),但这会减少编译器的工作量。
你可以尝试的另一件事是尽可能直接。我的意思是,WordPress为您提供了许多包装函数,这些函数只包装其他代码,这些代码可能更难理解,或者执行额外的检查。如果你看看get_posts() function 它检查了许多条件,最终导致创建一个新的WP_Query
例如,如果您自己创建,您可以跳过一系列检查(如果您使用的是wp函数,请尝试查看它们的功能,以及您是否可以以更简单的方式复制它们)。
但再一次,我认为编写更快的代码所带来的性能提升不够一致和实质性。
如果要将函数设置为;生成(&Q);类似的WP\\u查询速度更快,请考虑创建WP\\u查询的代码可能是针对php的,而不是WP\\u查询类本身触发的90%的工作,因此我认为关键在于缓存和重用检索到的数据,并尽可能保持查询的简单性。
片段(请注意,这些结果并不真正一致或实质性):
/**
* Get a random post ID from wpdb or, when passed, a random ID of a post which meets the requirements.
*
*/
function sb_get_random_post_id(string $post_type = null, string $post_status = \'publish\'): int
{
global $wpdb;
$query = "SELECT ID FROM {$wpdb->prefix}posts WHERE post_status = \'%s\' ";
$query_arguments = [$post_status];
if ($post_type) {
$query .= "AND post_type = \'%s\' ";
$query_arguments[] = $post_type;
}
$prepared_statement = $wpdb->prepare($query, ...$query_arguments);
$postID = $wpdb->get_var($prepared_statement);
return (int) $postID;
}
/**
* Get a random post or, a random post within the defined parameters.
*/
function sb_get_random_post(string $post_type = null, string $post_status = \'publish\'): ?\\WP_Post
{
$random_id = sb_get_random_post_id($post_type, $post_status);
return \\get_post($random_id);
}
/**
* Random post
*/
$random_post = sb_get_random_post();
/**
* Random Woocommerce Order, shop_order uses defferent statusses so one with status \'publish\' wouldn\'t exist.
*/
$random_completed_wc_order = sb_get_random_post(\'shop_order\', \'wc-completed\');
/**
* Why would you go this length?
* Here\'s a function using WP_Query
*
* When timing sb_get_random_post() vs get_random_query_post() the results are:
* sb_get_random_post: 0.004508972167968
* get_random_query_post: 0.011613130569458
* random_query_post executes one db query and takes almost three times as long as our function which executes two
* queries because it first queries our ID and effectively has to run a second query when get_post($random_id) is called.
* Just imagine that a wordpress page load does up till 100+ queries on average, which will cause every page load to
* take seconds.
*/
function get_random_query_post(string $post_type = null, string $post_status = \'publish\')
{
$args = [
\'post_status\' => $post_status,
\'posts_per_page\' => 1,
\'order\' => \'rand\',
\'orderby\' => \'ID\',
];
$query = new \\WP_Query($args);
return $query->get_posts();
}