限制从 WP_Query 或“获取”函数返回的 wordpress 字段

Posted

技术标签:

【中文标题】限制从 WP_Query 或“获取”函数返回的 wordpress 字段【英文标题】:Limiting returned wordpress fields from WP_Query or 'get' functions 【发布时间】: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”等。 Fetch Selected Fields in WP_Query Class in WordPress 的可能重复项 我可能会问与您上面引用的相同问题,但为他提供的答案不符合我的需求。他的回答提供了一种在 WP_Query 返回后访问“标题”和“描述”的方法。另一方面,我正在寻找专门删除查询中返回的所有其他数据,除了少数几个。旨在减少发回的数据量。 你有 3 个返回选项:'all ids, id=>parent' 开发者文档:developer.wordpress.org/reference/classes/wp_query/… 【参考方案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 Parameter 或 WP_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/

【讨论】:

以上是关于限制从 WP_Query 或“获取”函数返回的 wordpress 字段的主要内容,如果未能解决你的问题,请参考以下文章

在自定义分类模板中的 WP_Query 期间查询(2)ACF 发布对象

查询ACF在自定义分类模板中的WP_Query期间发布对象

函数从查询中获取第一条记录并返回单个值

如何从函数返回多维 Mat 数组

具有待处理状态问题的 WP_Query 和 WooCommerce 订单

如何使用 pgAdmin 4.2 获取从 PG/PLSQL 中的函数返回的整个表数据或多行。