【发布时间】:2021-01-19 22:41:17
【问题描述】:
这几天我一直在纠结这个问题,这让我有点抓狂。我知道我拥有所有的部分,但我似乎无法将它们组合在一起。
我有一个 Woocommerce 订单的打印模板,它以正常方式列出产品,它们存储在数组中的顺序又是它们放入购物篮的顺序等。但是,我们希望它们按类别分组(学期)。所以这将意味着首先列出 term_id 17 下的所有项目,然后列出所有 term_id 18 等。
理想情况下,这将是一个自动过程,其中代码会读取所有正在使用的条款,然后逐个逐个浏览它们并输出购物篮中该条款的任何产品。但我离那个阶段还差得很远。
到目前为止,我在这段代码中取得了部分成功:
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 17 项AFTER。不幸的是,它只是按照默认顺序显示数组,即 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 要复杂得多!非常感谢您对此提供任何帮助。
回顾一下,我希望按类别顺序打印/回显/等顺序的产品(如果有人觉得超级大方,会自动显示)。我真的不介意这是如何实现的,只要它显然是安全可靠的。
为这篇长篇博文深表歉意,并在此先感谢您。
【问题讨论】:
-
您的代码有点过时了,因为 WooCommerce 3 在循环中查找 this thread for order items... 现在根据产品类别对订单项目进行排序很棘手,因为您可以为产品设置许多类别... A更好的方法是在下订单之前对购物车物品进行分类(see this thread)
-
我知道这不是自迁移到 Woocommerce 3 以来最好的方法,但我一直在努力寻找符合我一直在寻找的代码示例,因此我为什么会受伤采用这种方法。特别是按类别排序方面。我当然会阅读您突出显示的线程,但目前在购物车中排序是一个备用计划,因为我正在与第三方交互并且不能保证在它到达之前没有任何干扰点,因此采用这种方法。
标签: php wordpress woocommerce array-filter