【问题标题】:Limiting returned wordpress fields from WP_Query or 'get' functions限制从 WP_Query 或“获取”函数返回的 wordpress 字段
【发布时间】:2014-12-12 18:48:30
【问题描述】:

希望限制 WP 查询的返回字段,以帮助加快服务器的响应速度并减少检索的数据量。对于我正在使用的查询,它最多只需要3个数据字段,其余的通过循环中的ACF get_field_object 引入。我正在使用的其他函数,例如 get_posts 或 get_terms 具有字段选项,但仅限于少数东西,例如仅 'slug' 或 'id => slug'。

我习惯用 CakePHP 开发,它可以选择指定要返回的每个字段,但是项目需要 wordpress 来实现其他功能,所以我很有限。

TL;DR 需要加快从 Wordpress 获取帖子的速度

【问题讨论】:

  • 字段是什么?它们都是定制的吗?
  • 我想要限制的字段是默认出现的字段,例如“post_content”、“guid”、“post_modified”等。
  • 我可能会问与您上面引用的相同问题,但为他提供的答案不符合我的需求。他的回答提供了一种在 WP_Query 返回后访问“标题”和“描述”的方法。另一方面,我正在寻找专门删除查询中返回的所有其他数据,除了少数几个。旨在减少发回的数据量。
  • 你有 3 个返回选项:'all ids, id=>parent' 开发者文档:developer.wordpress.org/reference/classes/wp_query/…

标签: loops slug wordpress


【解决方案1】:

我在查询中使用了 fields 参数并在此查询上运行 get posts。 例如:在我的例子中,我只需要获取多个类别的 Post id,所以我创建了一个这样的查询:

$the_query = new WP_Query( array( 
                        'ignore_sticky_posts' => 1,
                        'posts_per_page'      => -1,
                        'cat'                 => '2,6,7' ,
                        'fields'              => 'ids',
                        'post_type'           => 'post',
                        'post_status'         => 'publish', 
                                ) 
                        );

在这个查询上运行 get_posts:

$posts = $the_query->get_posts();

$posts 将仅获取特定类别帖子的 ID。

或者也可以使用标准和流行的方式来完成,即通过运行 have_posts 循环:

if ( $the_query->have_posts() ) {
        while ( $the_query->have_posts() ) {
            $the_query->the_post();
            $post_id_array[] = get_the_ID(); 
        }           
    }

这是帮助加快服务器响应速度和减少检索数据量的两种方法

【讨论】:

    【解决方案2】:

    WP_Query 将返回对象......所以它非常快。但是,如果您真的想限制返回的内容,可以使用 Return Fields ParameterWP_Query 来实现。

    【讨论】:

    • 我已经看过了,不幸的是它只提供了 3 个选项,比我需要检索的内容少了大约 1 或 2 个字段。
    【解决方案3】:

    这是我为限制来自 WP_Query 的字段所做的,尤其是当我想对它们进行 json_encode 时。 $return 变量包含我的帖子数组,其中只有 $fields 数组中列出的字段。

        $query = new WP_Query( array( 'post_type' => 'my_custom_type' ) );
        $return = array();  
        $fields = array('post_title', 'ID');  //list of fields I want in $return
        $posts = $query->get_posts();
        foreach($posts as $post) {
            $newPost = array();
            foreach($fields as $field) {
                $newPost[$field] = $post->$field;
            }
            $return[] = $newPost;
        }
    

    【讨论】:

    • 这不会优化查询,您可以使用简单的数组映射轻松实现实际操作
    【解决方案4】:

    我不知道它会有多大帮助,但下面是我如何从 CPT 获得扁平阵列。这不是最快的,但可能会更糟。我正在使用 ACF 获取自定义字段,但您可以只取回 slug 或者您可以取回多个字段:

    // Query Jobs Args
    $query_args = array(
        'post_type' => 'job',
        'posts_per_page' => -1,
        'fields' => 'ids'
    );
    
    // Get Jobs Query
    $query = new WP_Query($query_args);
    
    // Loop Persistent Vars
    $job_ids = array();
    
    // Loop Over Jobs
    foreach($query->posts as $post_id) {
        $job_ids[] = get_field('job_id', $post_id);
    }
    
    // Do stuff with flattened array of job ids
    

    【讨论】:

      【解决方案5】:

      有趣的是,您可以通过 WP Rest API 使用 _fields 参数来做到这一点

      https://yoursite.com/wp-json/wp/v2/posts?_fields=author,id,excerpt,title,link
      

      有关 API 的更多信息,请点击此处:https://developer.wordpress.org/rest-api/

      【讨论】:

        猜你喜欢
        • 2013-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多