按类别(术语)筛选WooCommerce $订单项



在这个问题中,我有所有的部分,但我似乎就是无法将它们组合在一起。

我有一个用于WooCommerce订单的打印模板,该模板以正常方式列出产品,它们存储在数组中的订单依次是它们放置在篮子中的订单等。但是,我们希望它们按类别(Term)分组。因此,这将意味着首先列出term_id 17下的所有项目,然后是所有term_id 18,等等。

理想情况下,这将是一个自动过程,其中代码读取使用中的所有Terms,然后逐个遍历它们,并输出篮中该Term的所有产品。但我离那个阶段还远着呢。

到目前为止,这段代码已经部分成功了:
foreach ($order->get_items() as $item) {
$product_id = $item['product_id'];
$meta = $item['item_meta'];
$meta = array_filter($meta, function ($key) {
return !in_array($key, Order::getHiddenKeys());
}, ARRAY_FILTER_USE_KEY);
$terms = get_the_terms ( $product_id, 'product_cat' );
foreach ( $terms as $term ) {
$cat_id = $term->term_id;

if($cat_id === 18) {
var_dump($item['name']);
}
}

这将成功转储在term_id 18中分类的订单项。但是,如果我像这样修改if语句:

if($cat_id === 18) {
var_dump($item['name']);
} elseif($cat_id === 17) {
var_dump($item['name']);
}

我希望它输出term_id 18项,然后是term_id 17AFTER他们。不幸的是,尽管代码是以这种方式排列的,但它只是以默认的17和18的顺序显示数组。

我想也许它以这种方式输出是因为它没有修改原始数组,只是在不同的点掩盖它的部分。所以,我一直在试验array_filter函数,但我似乎无法得到正确的逻辑。我知道这个尝试很糟糕,但这是我对array_filter:

的实验。
function test ($var) {
foreach ( $terms as $term ) {
$cat_id = $term->term_id;

if($cat_id === 18) {
print_r($item['name']);
}
}
return $var;
}

foreach ($order->get_items() as $item) {
$product_id = $item['product_id'];
$meta = $item['item_meta'];
$meta = array_filter($meta, function ($key) {
return !in_array($key, Order::getHiddenKeys());
}, ARRAY_FILTER_USE_KEY);

$terms = get_the_terms ( $product_id, 'product_cat' );
print_r(array_filter($terms, "test"));

我知道这是大错特错,但我就是无法理解。我很好与基本的PHP和WordPress PHP使用正常,但WooCommerce是如此复杂得多!

重述一下,我希望订单中的产品在类别订单中打印/回显/等(理想情况下是自动)。我真的不介意这是如何实现的,只要它是安全和可靠的。

在我看来,你是在循环排序,但你不是在循环你想排序的类别。

我没有运行这段代码,但是我认为这个模式应该是你想要的。

// Group items into Categories - If you have a custom order you wish, pre-populate this array, or you can sort after
$categories = [];
foreach ($order->get_items() as $item) {
$product_id = $item['product_id'];
$terms = get_the_terms($product_id, 'product_cat');
$cat_id = $terms[0]->term_id;
$categories[$cat_id][] = $item;
}
// Loop Categories
foreach($categories as $category => $items){
echo sprintf("<h1>%s</h1>", $category);
//Loop Items in Category
foreach ($items as $item) {
print_r($item['name']);
}
}

最新更新