Php 使用Wordpress wp_查询搜索数组中存储的多个变量的出现情况
这应该很容易解决,我想这与我使用LIKE有关,但我就是看不见树木 我已经定义了一个名为“课程”的自定义职位类型(CPT)。使用高级自定义字段(ACF),课程CPT有一个名为教师的列。ACF在教师列中存储大量数据,包括每个教师的唯一ID $\u SESSION['search\u teachers']由表单中的多选字段填充,并包含我要搜索教师列的教师ID。它可以包含任意数量的教师ID 以下是我到目前为止的情况:Php 使用Wordpress wp_查询搜索数组中存储的多个变量的出现情况,php,mysql,wordpress,session,sql-like,Php,Mysql,Wordpress,Session,Sql Like,这应该很容易解决,我想这与我使用LIKE有关,但我就是看不见树木 我已经定义了一个名为“课程”的自定义职位类型(CPT)。使用高级自定义字段(ACF),课程CPT有一个名为教师的列。ACF在教师列中存储大量数据,包括每个教师的唯一ID $\u SESSION['search\u teachers']由表单中的多选字段填充,并包含我要搜索教师列的教师ID。它可以包含任意数量的教师ID 以下是我到目前为止的情况: $teachers = implode($_SESSION['search_teach
$teachers = implode($_SESSION['search_teachers'],',');
$args_courses = array(
'post_type' => 'courses',
'posts_per_page' => 9999,
'meta_query' => array(
array(
'key' => 'active',
'value' => 1,
'compare' => '='
),
array(
'key' => 'teachers',
'value' => $teachers,
'compare' => 'LIKE'
)
),
'orderby' => 'course_name',
'order' => 'ASC'
);
请注意,我正在使用:
'key' => 'active', 'value' => 1, 'compare' => '='
在我的WP_查询中,筛选课程是否当前处于活动状态
如果$\u SESSION['search\u teachers']只包含一个教师ID,我的WP\u查询工作正常。如果$\u SESSION['search\u teachers']包含多个教师ID,我该如何使其工作
提前感谢您的帮助
编辑:
以下是我的教师专栏中的内容:
a:3:{i:0;s:3:"509";i:1;s:3:"511";i:2;s:3:"514";}
这就是我的$_课程['search_teachers']中包含的内容:
Array ( [0] => 511 [1] => 514 )
参见
WP includes/Meta.php
中的classWP\u Meta\u Query
,参考自WP includes/Query.php
$teachers = $_SESSION['search_teachers']; // keep as array
...
array(
'key' => 'teachers',
'value' => $teachers, // an array of strings
// 'compare' => 'IN' // this is default if $teachers is an array
)
更新
考虑到教师栏的价值
a:3:{i:0;s:3:"509";i:1;s:3:"511";i:2;s:3:"514";}
这是一个数据,
使用SQL没有可靠的查询方法。这些数据旨在用于PHP级别,而不是数据库。最好简单地使用多个posteta
条目,这与我上面给出的解决方案配合得很好
您可以尝试通过以下方式“破解”,但1)我不建议这样做,因为如果序列化数据的结构发生更改,它可能会给出误报,2)这是不可能的:
'meta_query' => array_merge(
array(
'key' => 'active',
'value' => 1,
'compare' => '='
),
// TODO: 'OR'
array_map( function($teacher_id) {
return array(
'key' => 'teachers',
'value' => "%\"$teacher_id\"%",
'compare => 'LIKE'
);
} )
),
如你所见,我们需要以某种方式将其转化为
WHERE ...
(active = 1 AND (
teachers LIKE '%"ID_1"%'
OR teachers LIKE '%"ID_2"%'
OR teachers LIKE '%"ID_3"%'
))
但是
如前所述,您应该使用多值元,如下所示:
table wp_postmeta:
meta_id | post_id | meta_key | meta_value
--------+---------+-------------+------------
1000 | 20000 | teacher | 509
1001 | 20000 | teacher | 511
1002 | 20000 | teacher | 514
想想你的查询会做什么:它会生成
WHERE。。教师喜欢“教师1,教师2”
。您可能希望在中找到。或者,您可以尝试使用一个存在的
@Kenney:find_IN_set()
用于此类操作,但效率不高。谢谢Kenny,但是compare=>IN也会返回0个结果。我已经调整了问题,让它更清楚我在寻找什么;您无法在SQL中真正安全地使用它,因为当结构更改和添加数字时,您会得到误报。而且,用这种方式在SQL中很难找到多个位置的多个字符串。我会用解决方案更新这个问题,但我不推荐这样做。