首页 > 解决方案 > Woocommerce:迭代订单和订购产品的最佳方式

问题描述

我正在获取所有处理订单,然后我需要遍历每个订单以执行某些操作,我发现这样做的唯一方法是使用嵌套循环:

foreach ( $processing_orders as $order ) {
            
            foreach( $order->get_items() as $item ) {
                //Do stuff
            }
}

我们的 woocommerce 商店增长得惊人,现在这个$processing_orders数组有数千个处理订单,我们这里有性能瓶颈,我担心未来的可扩展性,不知道是否有更好的方法来做到这一点需要使用嵌套循环。

更新 按要求我添加了完整的代码:

global $woocommerce;

    // Create a mailer
    $mailer = $woocommerce->mailer();

    $processing_orders = (array) wc_get_orders( array(
        'limit'        => -1,
        'status'       => ['wc-processing','wc-follow-up','wc-follow-up-2','wc-follow-up-3','wc-follow-up-4'],
        'type' => 'shop_order',
        'date_created' => '>'. $from
    ) );

    if ( sizeof($processing_orders) > 0 ) {
        $reminder_text = __("Notificación: fecha de envío enviada al proveedor $today", "woocommerce");

        foreach ( $processing_orders as $order ) {
            
            foreach( $order->get_items() as $item ) {
                $product_id = $item->get_product_id();
                $current_shipping_days = get_post_meta( $product_id, '_shipping_days_field', true );
                $current_shipping_days = (int)$current_shipping_days;
                $product_shipping_date = convertDateTimeImmutable($order->get_date_created())->modify( "+ $current_shipping_days weekdays" )->format( 'd/m/y' );

                $days_until_shipping = $date2->diff($date1)->format("%a");  //find difference
                $days = intval($diff);

                $product_post_object = get_post( $product_id );
                $vendor_id = $product_post_object->post_author;

                $vendor_info = get_userdata( $vendor_id );
                $vendor_email = $vendor_info->user_email;

                $order_url = esc_url( add_query_arg( array(
                    'order_id'   => $order->get_order_number(),
                    '_view_mode' => 'email',
                    'permission' => '1',
                ), dokan_get_navigation_url( 'orders' ) ) );

                switch ($days) {
                    case 3:
                        $message_body = '<p>'.sprintf( __("Faltan 3 días para que se cumpla la fecha de entrega de tu pedido: %s"), 
                                            '<a href="'.esc_url( $order_url ).'">#'.$order->get_order_number().'</a>'
                                        ) .'</p>';

                        $message = $mailer->wrap_message(
                        // Message head and message body.
                        sprintf( '<h2>'. __( 'Faltan 3 días para que se cumpla la fecha de entrega del pedido %s' ) . '</h2>', $order->get_order_number() ), $message_body );

                        // Cliente email, email subject and message.
                        $mailer->send( $vendor_email, sprintf( __( 'Aviso: pedido #%s, faltan 3 días para que se cumpla la fecha de entrega' ), $order->get_order_number() ), $message );
                        break;
                    case 2:
                        $message_body = '<p>'.sprintf( __("Faltan 2 días para que se cumpla la fecha de entrega de tu pedido: %s"), 
                                            '<a href="'.esc_url( $order_url ).'">#'.$order->get_order_number().'</a>'
                                        ) .'</p>';

                        $message = $mailer->wrap_message(
                        // Message head and message body.
                        sprintf( '<h2>'. __( 'Faltan 2 días para que se cumpla la fecha de entrega del pedido %s' ) . '</h2>', $order->get_order_number() ), $message_body );

                        // Cliente email, email subject and message.
                        $mailer->send( $vendor_email, sprintf( __( 'Aviso: pedido #%s, faltan 2 días para que se cumpla la fecha de entrega' ), $order->get_order_number() ), $message );
                        break;
                    case 1:
                        $message_body = '<p>'.sprintf( __("Falta 1 día para que se cumpla la fecha de entrega del pedido: %s"), 
                                            '<a href="'.esc_url( $order_url ).'">#'.$order->get_order_number().'</a>'
                                        ) .'</p>';

                        $message = $mailer->wrap_message(
                        // Message head and message body.
                        sprintf( '<h2>'. __( 'Falta 1 día para que se cumpla la fecha de entrega del pedido %s' ) . '</h2>', $order->get_order_number() ), $message_body );

                        // Cliente email, email subject and message.
                        $mailer->send( $vendor_email, sprintf( __( 'Aviso: pedido #%s, falta 1 día para que se cumpla la fecha de entrega' ), $order->get_order_number() ), $message );
                        break;
                    case 0:
                        $message_body = '<p>'.sprintf( __("Hoy se cumple la fecha de entrega del pedido: %s"), 
                                            '<a href="'.esc_url( $order_url ).'">#'.$order->get_order_number().'</a>'
                                        ) .'</p>';

                        $message = $mailer->wrap_message(
                        // Message head and message body.
                        sprintf( '<h2>'. __( 'Aún no has enviado el pedido %s Hoy se cumple la fecha de entrega. Enviar los pedidos tarde tiene consecuencias.' ) . '</h2>', $order->get_order_number() ), $message_body );

                        // Cliente email, email subject and message.
                        $mailer->send( $vendor_email, sprintf( __( 'Aviso: pedido #%s, hoy se cumple la fecha para la entrega' ), $order->get_order_number() ), $message );
                        break;
                    case -1:
                        $message_body = '<p>'.sprintf( __("Ya se cumplió la fecha de entrega del pedido: %s"), 
                                            '<a href="'.esc_url( $order_url ).'">#'.$order->get_order_number().'</a>'
                                        ) .'</p>';

                        $message = $mailer->wrap_message(
                        // Message head and message body.
                        sprintf( '<h2>'. __( 'Aún no has enviado el pedido %s y ya se venció fecha de entrega. Enviar los pedidos tarde tiene consecuencias.' ) . '</h2>', $order->get_order_number() ), $message_body );

                        // Cliente email, email subject and message.
                        $mailer->send( $vendor_email, sprintf( __( 'Aviso: pedido #%s, se ha vencido el tiempo de entrega' ), $order->get_order_number() ), $message );
                }
            }
        }
    }

这有点长,但是当距离他们的订单发货日期还有 3、2、1 和 0 天时,我会通过电子邮件将剩余部分发送给供应商。

一个订单有很多子订单,所以我得到所有“父”处理订单,然后我遍历他们的每个产品项目,然后我得到产品的“post_author”来获取供应商并向他发送电子邮件。

上面的代码每天运行。

我正在使用 Dokan 多供应商插件。

标签: phpwoocommercenested-loopsscalabilitydokan

解决方案


推荐阅读