WordPress元查询检查元值数组中的当前用户

WordPress meta query check the current users in meta value array

如果 s/he 在元值数组中,我无法为当前用户查询 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
    ...
)

如果没有价值

return 错误或空数组。取决于之前是否设置过该字段。

此外,

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

查看结果

查询应该 return 在 permit_users 键中具有当前用户 ID 的所有帖子。

Important:
The permit_users is an optional, so if the field has not value (false) or empty array, the query should ignore it.

更新

我已经尝试与 LIKE 进行比较,这似乎有效。但是对比序列化数据好不好?如果当前用户是 11 并且值中有 111 用户怎么办?

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

meta_key,格式 permit_users_{user_id},值为 user_id

以上述格式保存值,meta unique 设置为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 将需要时间。因此,以较短的长度维护此序列化数据,但不要担心并进行早期优化等到慢查询日志记录下来,然后我们可以寻求优化的解决方案,例如添加索引或添加新的搜索引擎层,例如弹性搜索。