【问题标题】:Filtering the Woocommerce $order items By Category (Term)按类别(期限)过滤 Woocommerce $order 项目
【发布时间】: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 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 要复杂得多!非常感谢您对此提供任何帮助。

回顾一下,我希望按类别顺序打印/回显/等顺序的产品(如果有人觉得超级大方,会自动显示)。我真的不介意这是如何实现的,只要它显然是安全可靠的。

为这篇长篇博文深表歉意,并在此先感谢您。

【问题讨论】:

  • 您的代码有点过时了,因为 WooCommerce 3 在循环中查找 this thread for order items... 现在根据产品类别对订单项目进行排序很棘手,因为您可以为产品设置许多类别... A更好的方法是在下订单之前对购物车物品进行分类(see this thread)
  • 我知道这不是自迁移到 Woocommerce 3 以来最好的方法,但我一直在努力寻找符合我一直在寻找的代码示例,因此我为什么会受伤采用这种方法。特别是按类别排序方面。我当然会阅读您突出显示的线程,但目前在购物车中排序是一个备用计划,因为我正在与第三方交互并且不能保证在它到达之前没有任何干扰点,因此采用这种方法。

标签: php wordpress woocommerce array-filter


【解决方案1】:

在我看来,您正在循环订单,但您并没有循环您想要订购的类别。

我没有运行此代码,但该模式应该按照我的想法执行。

// 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']);
    }
}

【讨论】:

  • 哦,快到了!它列出了类别 ID,然后是内容,仅 5 次,即订单中的项目数。早上我会好好挑选一下,看看能不能微调一下。
  • 不,忽略这一点,是我愚蠢。我不小心把它放在另一个循环里!此代码完美运行。
  • 在我将其标记为已接受答案之前的一件事。使用这种方法调整类别的顺序有多容易?如果我没看错,您可以将 $categories 变量更改为整数列表,只要您删除将 $cat_id 分配给 $categories 的行,它就可以工作。
  • 如果类别已设置,并且您乐于对其进行硬编码,那么如果您预先设置 $categories 数组,这就是您需要做的所有事情。例如以下会将顺序设置为 18,17,然后其他任何内容都会随之而来 - $categories = [18=>[], 17=>[]];
  • 另外,如果您只想按类别名称排序,那么在循环类别之前,您可以执行键排序 - ksort($categories) 用于 ASC,krsort($categories) 用于 DESC
猜你喜欢
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多