すべての処理命令を取得してから、各命令を反復して特定のアクションを実行する必要があります。これを行う唯一の方法は、ネストされたループを使用することです。
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 Multi-vendor プラグインを使用しています。