2017-08-28 3 views
1

J'ai remarqué que l'e-mail du client en attente n'est pas disponible, j'ai donc essayé de remplacer les actions par une seule action qui enverrait l'e-mail approprié.Renvoyer par programme un WooCommerce customer_on_hold_order notification par e-mail

Cela semble fonctionner sauf pour le statut d'attente. Je ne vois pas quelle est la différence entre le cas de mise en attente et de traitement autre que ce n'est pas le $available_emails dans class-wc-meta-box-order-actions.php et j'ai supprimé tous les autres et ils fonctionnent toujours.

Qu'est-ce que je fais mal? Est-ce un moyen de rendre cela possible?

Mon code est:

function ulmh_resend1($actions) { 
    $actions['ulmh_resend'] = __('Resend Email', 'text_domain'); 
    return $actions; 
} 
function ulmh_resend2($order) { 
    $mailer = WC()->mailer(); 
    $mails = $mailer->get_emails(); 
    if ($order->has_status('on-hold')) { 
    $eml = 'customer_on_hold_order';  
    }elseif ($order->has_status('processing')) { 
    $eml = 'customer_processing_order'; 
    }elseif ($order->has_status('completed')) { 
    $eml = 'customer_completed_order'; 
    } else { 
    $eml = "nothing"; 
    } 
    if (! empty($mails)) { 
     foreach ($mails as $mail) { 
      if ($mail->id == eml) { 
       $mail->trigger($order->id); 
      } 
     } 
    } 
} 
function ulmh_resend3($order_emails) { 
    $remove = array('new_order', 'cancelled_order', 'customer_processing_order', 'customer_completed_order', 'customer_invoice'); 
    $order_emails = array_diff($order_emails, $remove); 
    return $order_emails; 
} 
add_action('woocommerce_order_actions', 'ulmh_resend1'); 
add_action('woocommerce_order_action_ulmh_resend', 'ulmh_resend2'); 
add_filter('woocommerce_resend_order_emails_available', 'ulmh_resend3'); 
+0

Quelle est la question, en particulier? Qu'est-ce que votre code fonctionne/ne fonctionne pas? –

+0

Le code fonctionne correctement si la commande est en cours de traitement ou terminée, mais aucun e-mail n'est envoyé si elle est en attente. Aucun message n'apparaît dans le journal de débogage, il semble juste que customer_on_hold_order n'est pas dans $ mails, mais l'email d'origine est envoyé correctement –

Répondre

1

J'ai revisité et compactée votre code, car là où des erreurs comme une erreur de typo dans if ($mail->id == eml){ pour eml comme nom de variable ... Aussi pour obtenir le numéro de commande de la WC_Order objet que vous devez utiliser $order->get_id() au lieu de $order->id.

Voici ce nouveau code fonctionnel:

add_action('woocommerce_order_actions', 'ulmh_resend1'); 
function ulmh_resend1($actions) { 
    $actions['ulmh_resend'] = __('Resend Email', 'text_domain'); 
    return $actions; 
} 

add_action('woocommerce_order_action_ulmh_resend', 'ulmh_resend2'); 
function ulmh_resend2($order) { 
    $wc_emails = WC()->mailer()->get_emails(); 
    if(empty($wc_emails)) return; 

    if ($order->has_status('on-hold')) 
     $email_id = 'customer_on_hold_order'; 
    elseif ($order->has_status('processing')) 
     $email_id = 'customer_processing_order'; 
    elseif ($order->has_status('completed')) 
     $email_id = 'customer_completed_order'; 
    else 
     $email_id = "nothing"; 

    foreach ($wc_emails as $wc_mail) 
     if ($wc_mail->id == $email_id) 
      $wc_mail->trigger($order->get_id()); 
} 

add_filter('woocommerce_resend_order_emails_available', 'ulmh_resend3'); 
function ulmh_resend3($order_emails) { 
    $remove = array('new_order', 'cancelled_order', 'customer_processing_order', 'customer_completed_order', 'customer_invoice'); 
    $order_emails = array_diff($order_emails, $remove); 
    return $order_emails; 
} 

Code va dans le fichier function.php de votre thème enfant actif (ou le thème) ou encore dans un fichier de plug-in.

Ce code est testé dans WooCommerce 3+ et fonctionne très bien maintenant pour les notifications par courriel de l'état des commandes en attente, lorsque vous réexpédiez

+0

Merci Loic - 2 erreurs stupides de ma part. Plus de café requis! –