首页 > 解决方案 > WordPress 元查询检查元值数组中的当前用户

问题描述

如果他/她在元值数组中,我无法查询当前用户的 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

元值

如果有值

数据库

a:5:{i:0;s:2:"23";i:1;s:1:"2";i:2;s:1:"6";i:3;s:1:"7";i:4;s:2:"27";}

在 PHP 中

Array
(
    [0] => 29
    [1] => 28
    ...
)

如果没有价值

返回 false 或空数组。取决于之前是否设置过该字段。

此外,

我尝试将比较设置为=相等,但这也没有用。可能是因为该值在数组中。

结果查看

查询应返回键中具有当前用户 ID 的所有帖子permit_users

重要:
permit_users可选的,所以如果字段没有值(假)或空数组,查询应该忽略它。

更新

我尝试过与之比较LIKE似乎有效。但是比较序列化数据好吗?如果当前用户是11并且值中有111用户怎么办?

标签: wordpressmeta-query

解决方案


我的建议是,如果此自定义帖子类型是由您开发的,则意味着尝试反序列化并将每个用户保存在单独的行中,如下所示

meta_key 格式permit_users_{user_id}为 value user_id

以上述格式保存值,元唯一设置为true(最后一个参数)

add_post_meta( 68, 'permit_users_' . get_current_user_id(), '21', true );

否则您的项目数据库现在非常成熟并且难以进行上述建议更改,那么您可以使用以下元查询

$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'   => sprintf(':"%s";', get_current_user_id()),
            'compare' => 'LIKE',
        ],
    ],
];

上述方法适用于值为 的序列化数据11111但请将此视为临时解决方案。

我再次要求您尝试将序列化数据转换为单独的自己的一行值。

附加说明:如果序列化字符串非常长,并且在最坏的情况下,从冗长的字符串中匹配查询用户 ID 将需要时间。因此,将这些序列化数据保持在较短的长度,但不要担心,并进行早期优化,等到慢查询日志记录这一点,然后我们可以寻求优化的解决方案,例如添加索引或添加新的搜索引擎层,例如弹性搜索。


推荐阅读