2017-04-14 21 views
0

特定のWooCommerceの動作を設定するように求められましたが、フィルタを使用してエスケープすることはできません。私が本当に有能ではない。WooCommerce - 商品カテゴリに応じて注文ステータスと管理者の電子メール受信者を変更します

正確には、注文が「abo」カテゴリの製品のみで構成されている場合、それは自動的に「完了」とマークされ、管理メール別のサービスに送信されます。

私はコードのいくつかの例を集め、電子メール受信者を変更したり、注文ステータスを変更したり、製品カテゴリに応じて一般的な変更を行ったりしています。これはフランケンシュタインの怪物です。電子メールの変更と注文ステータスの変更は両方とも失敗しました。

/** 
* Change email recipient for admin New Order emails when the order only has products from the 'abo' category 
* 
* @param string $recipient a comma-separated string of email recipients (will turn into an array after this filter!) 
* @param \WC_Order $order the order object for which the email is sent 
* @return string $recipient the updated list of email recipients 
*/ 
add_filter('woocommerce_email_recipient_new_order', 'dada_conditional_email_recipient', 10, 2); 
function dada_conditional_email_recipient($recipient, $order) { 
    // Bail on WC settings pages since the order object isn't yet set yet 
    // Not sure why this is even a thing, but shikata ga nai 
    $page = $_GET['page'] = isset($_GET['page']) ? $_GET['page'] : ''; 
    if ('wc-settings' === $page) { 
     return $recipient; 
    } 

    // just in case 
    if (! $order instanceof WC_Order) { 
     return $recipient; 
    } 
    $items = $order->get_items(); 

    foreach ($items as $item) { 
     $product = $order->get_product_from_item($item); 

     // check if there's an "abo" in the order, then if there's anything else. 
     if (is_product() && has_term('abo', 'product_cat')) { 
      $abo_in_order = 'true'; 
     } 
     if (is_product() && has_term('livre', 'product_cat') || has_term('revue', 'product_cat') || has_term('livre', 'product_cat')) { 
      $abo_alone_in_order = 'false'; 
     } 
     else { 
      $abo_alone_in_order = 'true'; 
     } 
    } 
    // if there's an 'abo' and nothing else, change the e-mail recipient to [email protected] 
    if (($abo_in_order == 'true')&&($abo_alone_in_order == 'true')) $recipient = '[email protected]'; 
    return $recipient; 
} 


/** 
* Autocomplete orders with only an 'abo' product 
*/ 

add_filter('woocommerce_payment_complete_order_status', 'dada_abo_order_autocomplete', 10, 2); 
function dada_abo_order_autocomplete($order_status, $order_id) { 

    $order = wc_get_order($order_id); 
    if ('processing' == $order_status && ('on-hold' == $order->status || 'pending' == $order->status || 'failed' == $order->status)) { 

     // just in case 
     if (! $order instanceof WC_Order) { 
      return $order_status; 
     } 
     $items = $order->get_items(); 

     foreach ($items as $item) { 
      $product = $order->get_product_from_item($item); 

      // check if there's an "abo" in the order, then if there's anything else. 
      if (is_product() && has_term('abo', 'product_cat')) { 
       $abo_in_order = 'true'; 
      } 
      if (is_product() && has_term('livre', 'product_cat') || has_term('revue', 'product_cat') || has_term('livre', 'product_cat')) { 
       $abo_alone_in_order = 'false'; 
      } 
      else { 
       $abo_alone_in_order = 'true'; 
      } 
     } 
     // if there's an 'abo' and nothing else, change the order status to 'completed' 
     if (($abo_in_order == 'true')&&($abo_alone_in_order == 'true')) $order_status = 'completed'; 
    } 
    return $order_status; 
} 

問題の原因は何ですか?

は、あなたが代わりに "woocommerce_payment_complete_order_status" の注文状況を更新するためのフックを "woocommerce_thankyou" を実装する必要がありジョス

答えて

0
  1. 、ありがとうございます。ステータスが完了した注文があれば、現在の更新注文ステータスコードはtrigerrになります。しかし、あなたの要件はステータスを「完了」に変更することです。動的に新しい電子メール仮親を追加するための

  2. 、あなたはこのフックを試してみてください:「woocommerce_email_recipient_new_order」 これを参照してください:WooCommerce send new order email to customer

+0

をおかげで、私は「woocommerce_thankyou」フックを使用しようとするでしょう。しかし、新しい電子メール受信者にとって、それは私が始めたコードなので、カテゴリ識別部分のどこかで失敗していると思います。 – YearZeroJoss

+0

はい。カテゴリロジックを確認してください。私の答えが役に立つと分かったら、それを受け入れupvoteすることができます。 –

関連する問題