在WP REST API上按ACF中具有数组值的字段进行筛选

时间:2018-02-02 作者:Danilo P. da Silva

我痛苦了好几个星期GET 在中调用WP REST API 我在那里有一块地ACF 具有多选功能的插件,存储值为array().

调用后的响应示例/wp-json/wp/v2/posts

{
        ...
        },
        ...
        "acf": {
            ...
            "ddd": [
                "11",
                "12",
                "13",
                "14"
            ],
            ...
        ...
}
还有我打电话时的反应/wp-json/acf/v3/posts

[
    {
        ...
        "acf": {
        ...
        "ddd": [
                "11",
                "12",
                "13",
                "14"
            ],
        ...
      }
   }
]
所以,问题是当我在functions.php 我的主题:

add_filter( \'rest_post_query\', function( $args ) {
    $args[\'meta_query\'] = array(
        array(
            \'key\'   => \'ddd\',
            \'value\' => esc_sql( $_GET[\'ddd\'] ),

        )
    );

    return $args;

} );
我可以这样过滤:/wp-json/acf/v3/posts?fieldname=value 我完美地给出了按URL中的术语过滤的帖子,但这适用于简单字段。在我的特殊需要领域ddd 是一个数组,因为在ACF中,我使用的是一个多选字段。因此,当我尝试使用上面的函数进行筛选时,只会得到一个空响应:[].

我也试过使用Tags 字段来自WordPress Core, 什么是array 中的值REST 也有响应,但我从未成功地使其工作,甚至使用了不推荐使用的函数filter[key]=&filter[value]= 从…起WordPress.

有用信息:

我试图通过ACF 开发人员,没有提供相关帮助ACF to REST API 向REST API公开ACF字段的插件,开发人员正试图帮助我解决这个问题我不一定只需要使用URL过滤调用,在PHP中这样做可能会有不同的逻辑,通过一些预循环,可以只过滤带有一些字段值的帖子,如条件,如年龄,地区,性别。。。因为它们将同时是多个过滤器。

1 个回复
SO网友:Jacob Peattie

高级自定义字段将多个选择字段的值存储为序列化数组。对于选择了选项“one”和“three”的select字段,存储在数据库中的值如下所示:

\'a:2:{i:0;s:3:"one";i:1;s:5:"three";}\'
这是不可能的WP_Query (这是元查询结束的地方)或SQL来根据以这种方式存储的选定值筛选结果。MySQL将此值视为一个通用字符串,无法理解其中是否包含不同的值(“一”或“三”,更不用说基于它们的查询了。这是因为序列化完全在PHP中进行,MySQL对此一无所知。这就像将JSON存储在MySQL列中一样:MySQL对数据结构一无所知。它只是文本。

您要么需要用一种能够以您想要的方式存储数据的解决方案来取代ACF(自定义分类法是最简单的选择),要么使用ACF的API&;筛选以更改其存储数据的方式。您将需要参考ACF资源和文档来了解如何做到这一点,因为这将是一个离题的问题(正如所问的,这个问题也是离题的,但我将其视为一个关于meta_query 和序列化数据)。

结束

相关推荐

是否可以将定制的SQL用于单个post.php?

是否可以在单个页面中使用自定义SQL。php文件来返回所需的单个帖子的数据?就我的目的而言,在$querystr中有一些数据操作,使用php很难再现,而使用简单的SQL很容易实现。如果我把下面的代码放在一页中。php文件,我目前有一个完整的结果集,每个帖子一行。我只想提取与用户单击的页面相关的行/记录/帖子。<?php $querystr = \" SELECT custom_sql_column_name_here FROM custom_sql