将数组与PRE_GET_POST中的META_QUERY进行比较

时间:2014-04-09 作者:camara_tech

我正在开发一个表单,用于使用高级自定义字段插件创建的自定义字段过滤帖子列表。由于表格的原因,我使用pre_get_posts 通过GET请求更改查询的操作。(以下代码引用是PHP或从print_r())

我将meta\\u查询设置为:

$query->set(\'meta_query\',$filter);
以及$filter 如下所示:

Array
(
    [0] => Array
        (
            [key] => delivery_method
            [value] => Array
                (
                    [0] => Online
                    [1] => Scheduled

                )

            [compare] => IN
        )
)
我正在查询的自定义字段的结构如下:

Array (
    [delivery_method] => Array (
        [0] => Online
        [1] => Scheduled
    )
)
当我查找带有[compare] => IN (如上所述),不返回任何职位。当我查找带有[compare] => NOT IN, 所有的帖子都被退回了。

我试图只返回那些有特定“交付方法”的帖子。有没有办法比较我错过的两个数组?或者我必须以某种方式分解其中一个数组,并将单个值与一个数组进行比较吗?

2 个回复
最合适的回答,由SO网友:camara_tech 整理而成

ACF文档建议单独检查值,而不是同时使用数组。

以下代码来自复选框字段类型的ACF文档:

http://www.advancedcustomfields.com/resources/field-types/checkbox/

/*
*  Query posts for a checkbox value.
*  This method uses the meta_query LIKE to match the string "red" to the database value a:2:{i:0;s:3:"red";i:1;s:4:"blue";} (serialized array)
*  The above value suggests that the user selected "red" and "blue" from the checkbox choices
*/

$posts = get_posts(array(
    \'meta_query\' => array(
        array(
            \'key\' => \'field_name\', // name of custom field
            \'value\' => \'"red"\', // matches exaclty "red", not just red. This prevents a match for "acquired"
            \'compare\' => \'LIKE\'
        )
    )
));
因此pre_get_posts 应如下所示:

$filter = array(
    array(
        \'key\' => \'delivery_method\'
        \'value\' => \'"Online"\'
        \'compare\' => \'LIKE\'
    ),
    array(
        \'key\' => \'delivery_method\'
        \'value\' => \'"Scheduled"\'
        \'compare\' => \'LIKE\'
    )
)

$query->set(\'meta_query\',$filter);

SO网友:gmazzap

如果我是正确的,那么您有一个包含数组的字段,很明显,您可以使用以下方法保存该字段:

add_post_meta( $postid, \'delivery_method\', array(\'Online\', \'Scheduled\') );
然后您要查询字段“delivery\\u method”=array( \'Online\', \'Scheduled\').

问题是像yours这样的元查询:

$meta_query = array(
  array(
    \'key\' => \'delivery_method\',
    \'value\' => array( \'Online\', \'Scheduled\' ),
    \'compare\' => \'IN\'
  )
);
返回将“deliver\\u method”键设置为“Online”(字符串)或“Scheduled”(字符串)或两者兼有的帖子,但您的帖子将键“deliver\\u method”保存为数组,因此其值为serialized 在保存到数据库之前使用WordPress,并且您不能使用未序列化的数组查询序列化的值。。。

因此,如果您想存储不同的传递方法,最好是对同一个键使用多个值,而不是使用一个具有多个值的键,例如。

add_post_meta( $postid, \'delivery_method\', \'Online\' );
add_post_meta( $postid, \'delivery_method\', \'Scheduled\' );
通过这种方式,使用适当的参数,您将能够根据需要获得具有其中一种或两种方法的帖子。

我真的不知道如何使用ACF来实现这一点,但是插件特定的方式对于这个网站来说是不合适的,但我认为这个概念很简单,你可以简单地应用到这个插件上。

针对特定情况的一种恶意攻击是使用序列化值作为值进行查询

$meta_query = array(
  array(
    \'key\' => \'delivery_method\',
    \'value\' => serialize ( array( \'Online\', \'Scheduled\' ) )
  )
);
此元查询返回两个方法都保存为数组的帖子。

结束

相关推荐

将数组与PRE_GET_POST中的META_QUERY进行比较 - 小码农CODE - 行之有效找到问题解决它

将数组与PRE_GET_POST中的META_QUERY进行比较

时间:2014-04-09 作者:camara_tech

我正在开发一个表单,用于使用高级自定义字段插件创建的自定义字段过滤帖子列表。由于表格的原因,我使用pre_get_posts 通过GET请求更改查询的操作。(以下代码引用是PHP或从print_r())

我将meta\\u查询设置为:

$query->set(\'meta_query\',$filter);
以及$filter 如下所示:

Array
(
    [0] => Array
        (
            [key] => delivery_method
            [value] => Array
                (
                    [0] => Online
                    [1] => Scheduled

                )

            [compare] => IN
        )
)
我正在查询的自定义字段的结构如下:

Array (
    [delivery_method] => Array (
        [0] => Online
        [1] => Scheduled
    )
)
当我查找带有[compare] => IN (如上所述),不返回任何职位。当我查找带有[compare] => NOT IN, 所有的帖子都被退回了。

我试图只返回那些有特定“交付方法”的帖子。有没有办法比较我错过的两个数组?或者我必须以某种方式分解其中一个数组,并将单个值与一个数组进行比较吗?

2 个回复
最合适的回答,由SO网友:camara_tech 整理而成

ACF文档建议单独检查值,而不是同时使用数组。

以下代码来自复选框字段类型的ACF文档:

http://www.advancedcustomfields.com/resources/field-types/checkbox/

/*
*  Query posts for a checkbox value.
*  This method uses the meta_query LIKE to match the string "red" to the database value a:2:{i:0;s:3:"red";i:1;s:4:"blue";} (serialized array)
*  The above value suggests that the user selected "red" and "blue" from the checkbox choices
*/

$posts = get_posts(array(
    \'meta_query\' => array(
        array(
            \'key\' => \'field_name\', // name of custom field
            \'value\' => \'"red"\', // matches exaclty "red", not just red. This prevents a match for "acquired"
            \'compare\' => \'LIKE\'
        )
    )
));
因此pre_get_posts 应如下所示:

$filter = array(
    array(
        \'key\' => \'delivery_method\'
        \'value\' => \'"Online"\'
        \'compare\' => \'LIKE\'
    ),
    array(
        \'key\' => \'delivery_method\'
        \'value\' => \'"Scheduled"\'
        \'compare\' => \'LIKE\'
    )
)

$query->set(\'meta_query\',$filter);

SO网友:gmazzap

如果我是正确的,那么您有一个包含数组的字段,很明显,您可以使用以下方法保存该字段:

add_post_meta( $postid, \'delivery_method\', array(\'Online\', \'Scheduled\') );
然后您要查询字段“delivery\\u method”=array( \'Online\', \'Scheduled\').

问题是像yours这样的元查询:

$meta_query = array(
  array(
    \'key\' => \'delivery_method\',
    \'value\' => array( \'Online\', \'Scheduled\' ),
    \'compare\' => \'IN\'
  )
);
返回将“deliver\\u method”键设置为“Online”(字符串)或“Scheduled”(字符串)或两者兼有的帖子,但您的帖子将键“deliver\\u method”保存为数组,因此其值为serialized 在保存到数据库之前使用WordPress,并且您不能使用未序列化的数组查询序列化的值。。。

因此,如果您想存储不同的传递方法,最好是对同一个键使用多个值,而不是使用一个具有多个值的键,例如。

add_post_meta( $postid, \'delivery_method\', \'Online\' );
add_post_meta( $postid, \'delivery_method\', \'Scheduled\' );
通过这种方式,使用适当的参数,您将能够根据需要获得具有其中一种或两种方法的帖子。

我真的不知道如何使用ACF来实现这一点,但是插件特定的方式对于这个网站来说是不合适的,但我认为这个概念很简单,你可以简单地应用到这个插件上。

针对特定情况的一种恶意攻击是使用序列化值作为值进行查询

$meta_query = array(
  array(
    \'key\' => \'delivery_method\',
    \'value\' => serialize ( array( \'Online\', \'Scheduled\' ) )
  )
);
此元查询返回两个方法都保存为数组的帖子。

相关推荐