【问题标题】:WordPress meta query check the current users in meta value arrayWordPress 元查询检查元值数组中的当前用户
【发布时间】:2020-05-21 11:26:10
【问题描述】:

如果当前用户在元值数组中,我无法查询当前用户的 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 或空数组。取决于之前是否设置过该字段。

另外,

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

结果查看

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

重要提示:
permit_users 是可选的,因此如果该字段没有值(false)或空数组,则查询应忽略它。

更新

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

【问题讨论】:

  • 您能否发布存储在数据库中元permit_users的示例值
  • 这是一个序列化的,我尝试使用LIKE 似乎工作但如果字段未设置或为空怎么办?并且使用LIKE 在序列化数据中搜索是否很好?如果当前用户 id 是 11 并且元值具有用户 id 111 会发生什么?我正在用 db 值更新问题。
  • @gvgvgvijayan 我有更新问题,请看一下。

标签: wordpress meta-query


【解决方案1】:

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

meta_key 格式为permit_users_{user_id},值为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 将需要时间。因此,将这些序列化数据保持在较短的长度,但不要担心并进行早期优化,等到慢查询日志记录这一点,然后我们可以寻求优化的解决方案,例如添加索引或添加新的搜索引擎层,例如弹性搜索。

【讨论】:

  • 非常感谢您提供详细信息。因为,我已经有很多帖子,这将使更改现有数据变得更加困难。但我考虑了这个建议,并将在稍后实施。现在,如果sprintf(':"%s";', get_current_user_id()) 有效,我可以继续使用它。再次感谢。
  • 很高兴为您解决问题。谢谢。
  • 它适用于这种情况,因为在 %s 内部将插入 1 即用户 ID,例如get_current_user_id() return 1 表示最终字符串看起来像 :"1"; 同样适用于用户 ID 11。如果您遇到任何失败或未获得预期结果,请检查 WP 中最后执行的查询。请随时提出更多问题,完全没有问题。
猜你喜欢
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2014-02-12
相关资源
最近更新 更多