Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Wordpress wp_查询搜索数组中存储的多个变量的出现情况_Php_Mysql_Wordpress_Session_Sql Like - Fatal编程技术网

Php 使用Wordpress wp_查询搜索数组中存储的多个变量的出现情况

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

这应该很容易解决,我想这与我使用LIKE有关,但我就是看不见树木

我已经定义了一个名为“课程”的自定义职位类型(CPT)。使用高级自定义字段(ACF),课程CPT有一个名为教师的列。ACF在教师列中存储大量数据,包括每个教师的唯一ID

$\u SESSION['search\u teachers']由表单中的多选字段填充,并包含我要搜索教师列的教师ID。它可以包含任意数量的教师ID

以下是我到目前为止的情况:

$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
中的class
WP\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中很难找到多个位置的多个字符串。我会用解决方案更新这个问题,但我不推荐这样做。