有条件地将附加 'meta_query' 数组附加到 WP_Query 的最佳方法是什么
What is the best way to append additional 'meta_query' array to WP_Query conditionally
我有以下功能:
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
以便 if
$t1
、$t2
、$t3
没有值 没有 meta_query
添加
否则对于每个$t#
,一个数组被添加到meta_query
。
我只是想让它动态化,因为不是每个调用都会有所有三个 $t#
。
如何实现?
您可以根据传入的值动态构建 meta_query
数组。在下面的代码中,
- 我们为传入的每个
$t#
参数构建一个 sub-array
- 如果我们有任何
$t#
参数,那么我们将使用这些数组来构建我们的元查询。
- 我们在没有 meta_query 参数的情况下构建
$args
数组
- 最后,如果我们有一个 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
meta_query,所以我使用 AND 构建了它,但您可以根据需要进行更改。
更新:如果你有一个默认的 meta_query,那么你可以像往常一样将它添加到 meta_query 数组和参数中。那么上面第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;
}
我有以下功能:
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
以便 if
$t1
、$t2
、$t3
没有值 没有 meta_query
添加
否则对于每个$t#
,一个数组被添加到meta_query
。
我只是想让它动态化,因为不是每个调用都会有所有三个 $t#
。
如何实现?
您可以根据传入的值动态构建 meta_query
数组。在下面的代码中,
- 我们为传入的每个
$t#
参数构建一个 sub-array - 如果我们有任何
$t#
参数,那么我们将使用这些数组来构建我们的元查询。 - 我们在没有 meta_query 参数的情况下构建
$args
数组 - 最后,如果我们有一个 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
meta_query,所以我使用 AND 构建了它,但您可以根据需要进行更改。
更新:如果你有一个默认的 meta_query,那么你可以像往常一样将它添加到 meta_query 数组和参数中。那么上面第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;
}