【问题标题】:What is the best way to append additional 'meta_query' array to WP_Query conditionally有条件地将附加的“meta_query”数组附加到 WP_Query 的最佳方法是什么
【发布时间】:2020-12-21 01:09:17
【问题描述】:

我有以下功能:

function returnD($p, $t1, $t2, $t3) {
    $args = array(
        'post_type' => $p,
        'posts_per_page' => -1,
        'meta_query'    => array(
            array(
                'key'     => $t1,
                'value'   => 'up',
                'compare' => '=',
            )
        ) 
    );
    $loop = new WP_Query( $args );
    
    return $loop;
}

如何修改$args meta_query 以便如果

$t1$t2$t3 没有值没有添加meta_query

否则对于每个$t#,一个数组被添加到meta_query

我只是想让它动态化,因为不是每个电话都会有所有三个$t#

我怎样才能实现它?

【问题讨论】:

    标签: php wordpress meta-query


    【解决方案1】:

    您可以根据传入的值动态构建meta_query 数组。在下面的代码中,

    1. 我们为传入的每个$t#参数构建一个子数组
    2. 如果我们有任何 $t# 参数,那么我们将使用这些数组来构建我们的元查询。
    3. 我们构建没有 meta_query arg 的 $args 数组
    4. 最后,如果我们有一个 meta_query 数组,将它添加到我们的 $args 中

    完整功能如下,代码注释:

    function returnD($p, $t1, $t2, $t3) {
       
        // 1. if the $t# parameters have a value, create the meta_query sub-array for that value
        if ($t1) $t1query =  array( 'key'=> $t1, 'value' => 'up', 'compare' => '='  );
        if ($t2) $t2query =  array( 'key'=> $t2, 'value' => 'up', 'compare' => '='  );
        if ($t3) $t3query =  array( 'key'=> $t3, 'value' => 'up', 'compare' => '='  );
    
        // 2. if any of the $t# parameters have an array, then create our meta_query
    
        $meta_query = array( 'relation' => 'AND');    // change this to OR if required
            if ($t1query) $meta_query[] = $t1query;
            if ($t2query) $meta_query[] = $t2query;
            if ($t3query) $meta_query[] = $t3query;
        }
    
        // 3. set up your default args for this query
        $args = array(
            'post_type' => $p,
            'posts_per_page' => -1,
        );
    
        // 4. only add the meta query if one exists
        if ($meta_query)
            $args['meta_query'] = $meta_query;
    
        $loop = new WP_Query( $args );
        
        return $loop;
    }
    

    请注意,这未经测试,但基本思想已经存在。另外,您没有说这是 AND 还是 OR 元查询,所以我使用 AND 构建了它,但您可以根据需要进行更改。

    更新:如果你有一个默认的 meta_query,那么你可以像往常一样将它添加到 meta_query 数组和 args 中。那么上面第4步中的条件语句就不需要检查if ($meta_query)了。

    function returnD($p, $t1, $t2, $t3) {
       
        // 1. if the $t# parameters have a value, create the meta_query sub-array for that value
        if ($t1) $t1query =  array( 'key'=> $t1, 'value' => 'up', 'compare' => '='  );
        if ($t2) $t2query =  array( 'key'=> $t2, 'value' => 'up', 'compare' => '='  );
        if ($t3) $t3query =  array( 'key'=> $t3, 'value' => 'up', 'compare' => '='  );
    
        // 2. Create our meta_query. 
        $meta_query = array(
             'relation' => 'AND',    // change this to OR if required
             // add default meta_query array(s) here
             array( 'key' => 'color', 'value' => 'blue', 'compare' => 'NOT LIKE'),
        );
    
        if ($t1query) $meta_query[] = $t1query;
        if ($t2query) $meta_query[] = $t2query;
        if ($t3query) $meta_query[] = $t3query;
    
        // 3. set up your default args for this query
        $args = array(
            'post_type' => $p,
            'posts_per_page' => -1,
            'meta_query' => $meta_query
        );
    
        $loop = new WP_Query( $args );        
        return $loop;
    }
    

    【讨论】:

    • 谢谢,我会测试一下:)
    • @Si8 如果您有任何问题,请告诉我!我以前做过很多次,所以有可能,只是可能需要稍微调整一下代码。仅供参考,我也在想:OR 可能比 AND 更适合测试 - 并且根据参数可能不会返回任何结果,因此可能很难判断它是否有效。或将返回更多结果,因此至少您可以查看查询是否运行:)
    • @Si8 哎呀!前 3 个 if 语句应该创建 3 个不同的数组 - 我复制并粘贴了第一行并忘记更改所有变量名称 - 我现在已经在代码中修复了这个问题。至于if ($t1 || $t2 || $t3)——如果数组是空的,它们不会对$meta_query产生任何影响——就像我们甚至没有尝试添加它们一样。
    • @Si8 仅供参考我已经更新了我的答案以展示如何做到这一点。让我知道它是否适合您!
    • 谢谢!!!我能够使用您编写的内容并对其进行一些调整以满足我的需要。我赞成并 +1 你的回答。
    猜你喜欢
    • 2011-11-21
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 2015-02-23
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多