wordpress - 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
用户怎么办?
解决方案
我的建议是,如果此自定义帖子类型是由您开发的,则意味着尝试反序列化并将每个用户保存在单独的行中,如下所示
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',
],
],
];
上述方法适用于值为 的序列化数据11
,111
但请将此视为临时解决方案。
我再次要求您尝试将序列化数据转换为单独的自己的一行值。
附加说明:如果序列化字符串非常长,并且在最坏的情况下,从冗长的字符串中匹配查询用户 ID 将需要时间。因此,将这些序列化数据保持在较短的长度,但不要担心,并进行早期优化,等到慢查询日志记录这一点,然后我们可以寻求优化的解决方案,例如添加索引或添加新的搜索引擎层,例如弹性搜索。
推荐阅读
- python - ping 不调用系统命令
- java - 如何在动态字符串中添加方法并根据for循环条件调用它们?
- r - 如何调整闪亮的 textAreaInput 标签宽度
- php - 更改 WordPress 搜索以仅生成 WooCommerce 搜索结果
- python - 在导入许多文件时将列添加到具有部分文件名的熊猫数据框
- ansible - 无法在 Ansible 中检索保管库机密
- nginx - 对 Web 服务器的奇怪请求
- terminal - 第一个 zsh 提示符上方的奇怪空间
- listview - Xamarin.Forms ListView 选定项目保持突出显示,直到取消选择或选择其他项目
- java - 尝试运行迁移时出现 Flyway ExceptionInInitializerError