【问题标题】:WP_Query when meta_query value compare to array?当meta_query值与数组比较时的WP_Query?
【发布时间】:2021-10-27 18:25:23
【问题描述】:

我正在尝试使用meta_query 过滤器查询帖子,但问题是我在自定义字段中存储了多个用户 ID,我不知道如何过滤帖子。

所以自定义字段是多选框,它保存了选定用户的ID。

现在在前端我想通过检查当前登录的用户是否在选定用户列表中来查询帖子。

查询如下所示:

$args = array(
            'post_type' => 'music',
            'post_status' => 'publish',
            'posts_per_page' => -1,
            'orderby' => 'title',
            'order' => 'ASC',
                    'meta_query'    => array(
                        array(
                            'key'     => 'manager',
                            'value'   => get_current_user_id(),
                            'compare' => 'LIKE',
                        ),
                    )
        );

      $loop = new WP_Query( $args );

如果我在该字段中有单个用户 ID,这将起作用。但是manager 的值是一个数组。

编辑:添加更多信息,字段的值保存为序列化数组,因此数据库中的值为:

a:2:{i:0;s:1:"2";i:1;s:1:"5";}

要比较的值只是当前记录的用户 ID,因此例如是 5

如果当前用户5在序列化数据中查询帖子。

【问题讨论】:

    标签: mysql arrays wordpress serialization


    【解决方案1】:

    元值是字符串,因此您不能在它们表现得像数组的地方构建查询。 对于 WP_Query 有 IN 运算符,但反之亦然(当 meta_value 应该在给定数组内时)。

    因此,为了实现您的目标,您可以使用一些 SQL。使用 SQL 查找匹配的帖子,然后将找到的帖子 ID-s 传递给 WP_Query。

    global $wpdb;
    $sql="SELECT post_id FROM $wpdb->postmeta 
          WHERE meta_key='manager' 
          AND meta_value like '%:".'"'.esc_sql($user_id_here).'"'.";%'";
    $found_posts=$wpdb->get_col($sql);
    if(empty($found_posts))$found_posts=[0];
    
    $args = array(
                'post_type' => 'music',
                'post_status' => 'publish',
                'posts_per_page' => -1,
                'orderby' => 'title',
                'order' => 'ASC',
                'post__in'=>$found_posts
            );
    
    $loop = new WP_Query( $args );
    

    【讨论】:

    • 我不知道这只是意外还是实际可行的解决方案,但您的想法似乎直接适用于 $args,如下所示:'value' => ':"'.get_current_user_id().' ";', '比较' => '喜欢',
    • 没有。你把干草堆和针头混为一谈。 LIKE 表示元值 LIKE user_id。但是你需要反之亦然,你需要像 meta_value 这样的 user_id。对于这种情况,我的 SQL 解决方案 100% 有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2011-07-26
    • 2021-09-27
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    相关资源
    最近更新 更多