如何在WP_QUERY META_QUERY中检查元值数组中的当前用户

时间:2020-05-21 作者:pixelngrain

如果当前用户在元值数组中,我很难为其查询cpt。

查询参数

$args = [
    \'post_type\'      => $cp::get_module_cpt(),
    \'posts_per_page\' => - 1,
    \'meta_query\'     => [
        \'relation\' => \'AND\',
        [
            \'key\'     => \'premium_module\',
            \'value\'   => 0,
            \'compare\' => \'=\',
        ],
        [
            \'key\'     => \'permit_users\',
            \'value\'   => get_current_user_id(),
            \'compare\' => \'IN\',
        ],
    ],
];
元键

permit_users

元值,如果有值

Array
(
    [0] => 29
    [1] => 28
    ...
)
如果没有值,则返回false或空数组。取决于之前是否设置过字段。

此外,我还尝试将设置与= 平等,但这也不起作用。可能是因为该值位于数组中。

查找结果时,查询应返回在permit_users 钥匙

Important:
Thepermit_users 是可选的,因此如果字段没有值(false)或空数组,则查询应忽略它。

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

您无法在元值内的数组内轻松查询。这是因为MySQL中没有数组值。相反,该值存储为serialized 一串

这样的数组:

array(
    0 => 29,
    1 => 28,
);
作为以下字符串存储在数据库中:

a:2:{i:0;i:29;i:1;i:28;}
因此,找到其中的值的唯一方法是LIKE 在字符串上。但问题是,如果要检查28 在数组中,您需要查询LIKE \'%:28;%\', 但是除了速度慢得多之外,如果28 是数组中的索引。

因此,使用add_post_meta() 为同一元键添加多行。例如,如果使用:

update_post_meta( $post_id, \'permit_users\', [ 29, 28 ] );
您将获得:

+--------------+--------------------------+
|   meta_key   |        meta_value        |
+--------------+--------------------------+
| permit_users | a:2:{i:0;i:29;i:1;i:28;} |
+--------------+--------------------------+
但如果您使用:

add_post_meta( $post_id, \'permit_user\', 28 );
add_post_meta( $post_id, \'permit_user\', 29 );
您将获得:

+-------------+------------+
|  meta_key   | meta_value |
+-------------+------------+
| permit_user |         28 |
| permit_user |         29 |
+-------------+------------+
还有你的WP_Query 使用IN 将按您期望的方式工作:

[
    \'key\'     => \'permit_user\',
    \'value\'   => get_current_user_id(),
    \'compare\' => \'IN\',
],

相关推荐

如何使用WP_QUERY对定制发布类型进行查询和排序

伙计们,我有一个名为“game”的自定义帖子类型,它有一些自定义字段(get\\u post\\u meta),我可以通过它们的键“\\u game\\u date\\u key”、“u game\\u home\\u goals\\u key”和“\\u game\\u away\\u goals\\u key”访问这些字段。如何使用WP\\u Query()返回按“\\u game\\u date\\u key”和(“\\u game\\u home\\u goals\\u key”和“\\u gam