1

我有以下功能:

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#.

我怎样才能实现它?

4

1 回答 1

1

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

  1. $t#我们为传入的每个参数构建一个子数组
  2. 如果我们有任何$t#参数,那么我们使用这些数组来构建我们的元查询。
  3. 我们构建$args没有 meta_query 参数的数组
  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还是ORmeta_query,所以我使用 AND 构建了它,但您可以根据需要进行更改。

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

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;
}
于 2020-09-01T22:40:10.497 回答