我正在构建一个带有自定义帖子类型复选框的过滤系统。
我认为 Wordpress 查询期望相同类型的分类法位于同一个数组中。
下面的代码不显示任何“merk”(品牌)。如果我只选择一个品牌,效果很好,选择具有不同分类法的多个盒子也效果很好。 我目前使用 for 循环遍历所有复选框并在选中时添加到数组中。
$array = [
'relation' => 'AND',
[
'taxonomy' => 'merk',
'field' => 'slug',
'terms' => ['coral']
],
[
'taxonomy' => 'merk',
'field' => 'slug',
'terms' => ['deluxe']
]
];
当分类法相同时,有没有办法以编程方式合并它们,从而导致以下结果:
[
'relation' => 'AND',
[
'taxonomy' => 'merk',
'field' => 'slug',
'terms' => ['coral', 'deluxe']
]
];
循环时,通过引用修改数组(而不是迭代数组的副本)。如果某个项目具有
taxonomy
和 field
元素,则它有资格进行合并。第一次遇到时,将 terms
数组声明为引用。如果再次遇到相同的 taxonomy
和 field
组合,则将 terms
子数组中的一个或多个元素推入引用中。
代码:(演示)
$array = [
'relation' => 'AND',
[
'taxonomy' => 'merk',
'field' => 'slug',
'terms' => ['coral']
],
[
'taxonomy' => 'foo',
'field' => 'bar',
'terms' => ['stackoverflow']
],
[
'taxonomy' => 'merk',
'field' => 'slug',
'terms' => ['deluxe', 'ultra']
]
];
foreach ($array as $key => &$item) {
if (is_array($item) && isset($item['taxonomy'], $item['field'])) {
$id = $item['taxonomy'] . '_' . $item['field'];
if (!isset($ref[$id])) {
$ref[$id] = &$item['terms'];
} else {
array_push($ref[$id], ...$item['terms']);
unset($array[$key]);
}
}
}
var_export($array);
输出:
array (
'relation' => 'AND',
0 =>
array (
'taxonomy' => 'merk',
'field' => 'slug',
'terms' =>
array (
0 => 'coral',
1 => 'deluxe',
2 => 'ultra',
),
),
1 =>
array (
'taxonomy' => 'foo',
'field' => 'bar',
'terms' =>
array (
0 => 'stackoverflow',
),
),
)