寻找在短码内执行多个类似WP查询的最有效方法

时间:2022-02-22 作者:Alex Smooth Websites

我有一个非常数据驱动的网站,每个页面都包含几个(5-10)短代码,每个短代码执行WP查询并显示结果。

这些查询通常非常相似-我在这个代码共享中添加了3个WP query$args的var\\u转储示例:https://codeshare.io/3AvRgv

我正在寻找一种提高性能的方法,并想知道是否有比每次都使用新的WP\\u查询更好的方法。

例如,我是否可以在自定义字段中设置一些查询参数,在页面加载时运行查询,将post\\u id数组保存到一个变量中,然后修改它们以适应?那会有帮助吗?

欢迎有任何想法!

1 个回复
SO网友:Jascha

我认为,在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();
    } 

相关推荐

在EDIT-TAGS.php?分类页面中列出定制查询的术语

这是我第一次在这里发帖。我有一个问题,我觉得我很快就要解决了,但却无法解决。我有一个自定义的分类法,叫做;应用程序“;还有一个叫做;“段”;。每一个“;应用程序“;术语有一个;“段”;与之关联的术语将显示一个自定义字段(ACF)。我想做的是对;应用程序“;按字母顺序排列的术语;“段”;编辑标记中的术语?分类法=应用页面。我设法添加了可排序的“;“段”;通过以下代码将列插入页面:// Add the "segment" column to the list of "aplica