WP_Query->Get_Posts中的Split_the_Query的用途/逻辑是什么

时间:2014-01-31 作者:Ben

在WP\\u Query的get\\u posts方法中,有一个部分与split\\u查询相关

split\\u查询的逻辑是

$split_the_query = ( $old_request == $this->request && "$wpdb->posts.*" == $fields && !empty( $limits ) && $q[\'posts_per_page\'] < 500 );
可以总结为。

如果:

计算出的查询没有被修改($old\\u request==$this->request)

  • ,我们只是加载帖子($wpdb->posts.*=$字段)
  • ,我们设置了一个限制(!empty($limits))
  • ,该限制小于500行($q[\'posts\\u per\\u page\']<;500)
  • ,然后它触发了这种奇怪的加载内容的替代方式。

    *编辑:也许“奇异”是一个严厉的词,我相信这是有目的的,它似乎在过程中更新了一些缓存:)

    这会导致我的一个自定义帖子类型出现问题,因为它还会触发一些奇怪的缓存机制,导致内存不足。

    我知道我可以用钩子覆盖它,但我想知道它的目的是什么?

    似乎没有记录。在不到500行的情况下,随机执行此操作似乎也很奇怪。

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

    这一切都是为了将帖子添加到缓存中。这样做的好处是get_post( $post_id ) 不会导致再次命中数据库。这可能与循环调用中的许多模板函数相同get_post().

    我不完全理解表达的逻辑$split_the_query. 这个限制很有意义,因为很大的限制可能是一些批处理过程,而不是由主题显示。

    以下代码是条件逻辑:

    if ( $split_the_query ) {
            // First get the IDs and then fill in the objects
    
            $this->request = "SELECT $found_rows $distinct $wpdb->posts.ID FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby $limits";
    
            $this->request = apply_filters( \'posts_request_ids\', $this->request, $this );
    
            $ids = $wpdb->get_col( $this->request );
    
            if ( $ids ) {
                $this->posts = $ids;
                $this->set_found_posts( $q, $limits );
                _prime_post_caches( $ids, $q[\'update_post_term_cache\'], $q[\'update_post_meta_cache\'] );
            } else {
                $this->posts = array();
            }
        } else {
            $this->posts = $wpdb->get_results( $this->request );
            $this->set_found_posts( $q, $limits );
        }
    
    $ids = $wpdb->get_col( $this->request ); 这将获得调用返回的ID数组。

    if ( $ids ) 如果该值为false,则不会返回帖子,因此只需将帖子设置为空数组即可。

    _prime_post_caches( $ids, $q[\'update_post_term_cache\'], $q[\'update_post_meta_cache\'] ); 这会告诉WordPress缓存为缓存捕获新的帖子ID。您会注意到,您可以在查询关联数组中传递两个查询参数,以告知要更新哪些缓存。

    奇怪的是,自定义帖子类型会导致问题,而默认的post 帖子类型不会给你带来任何问题。您可能只想将这两个查询变量设置为false,以防止缓存。

    当我在谷歌上搜索时,看起来其他人也有你的问题update_post_caches out of memory.

    结束

    相关推荐

    WordPress操作$wpdb的工作或执行流

    我读过关于覆盖全局变量的内容$wpdb 并通过这种方式连接到第二个数据库(Search another database with wp_query using new wpdb ) 例如,可以在第二个DB上使用WP\\U查询。之后,将使用$wpdb\\u backup“还原”$wpdb。参见以下代码@Tom J Nowellglobal $wpdb; // backup wpdb $wpdb_backup = $wpdb; // new db $newdb =