woocommerce_email_attachments钩子在Woocommerce中带有空的$ order参数

时间:2018-11-11 20:34:26

标签: php wordpress object woocommerce hook-woocommerce

为我建立WP网站的人现在由于这个问题而陷入困境。他需要将一些自定义PDF文件附加到订单确认邮件中。他使用woocommerce_emails_attach_downloadables函数来做到这一点。由于某种原因,该函数在$order参数为空的情况下被调用。

这是他使用的代码:

add_filter( 'woocommerce_email_attachments', 'attach_order_notice', 10, 3 );
function attach_order_notice ( $attachments, $email_id, $order )
{

//

   // Only for "New Order" email notification (for admin)
   if( $email_id == 'customer_on_hold_order' ){

      $pdf_options = array(
//       "source_type" => 'html',
//       "source" => '<html>hello</html>',
         "source_type" => 'url',
         "source" => 'http://tag4u.devurl.co.il/checkout/order-received/757/?key=wc_order_5bce0e5ba39b8',
         "action" => 'save',
         "save_directory" => get_template_directory() .'/pdfs',
         "file_name" => 'print-pdf'. json_encode($order) .'.pdf');


//    phptopdf($pdf_options);




      $attachments[] = get_template_directory() . '/pdfs/print-pdf.pdf';
   }
   return $attachments;
}

我的问题是:
那是什么情况?
是什么导致$order传递为空?

1 个答案:

答案 0 :(得分:1)

您的开发人员可能一直在使用this woocommerce official snippet (这已经3岁了,已经过时了),并且使用了woocommerce_email_attachments过滤器挂钩。

此过滤器挂钩已定义:

  • WC_Email中的一次(1)(带有$order参数)
  • WC_emails没有 $order参数)中的三遍(3)
  

因此WC_Order对象$order仅在WC_Email类中定义为第三个参数。

这意味着该过时的官方代码需要进行调整,如下所示:

add_filter( 'woocommerce_email_attachments', 'woocommerce_emails_attach_downloadables', 10, 3 );
function woocommerce_emails_attach_downloadables( $attachments, $email_id, $order ) {
    // Avoiding errors and problems
    if ( ! is_a( $order, 'WC_Order' ) || ! isset( $email_id ) ) {
        return $attachments;
    }

    // ===>  Your custom code goes Here  <===

    return $attachments;
}

这应该可以避免出现问题。

  

因此,正如您所问的那样,该挂钩还用于以下特定的产品通知带有完全不同的挂钩参数

     
      
  • 关于“库存不足”通知 (使用'low_stock'$product作为第二和第三参数)
  •   
  • 关于“无库存”通知(使用'no_stock'$product作为第二和第三参数)
  •   
  • “缺货”通知上 (使用'backorder'$args作为第二和第三参数)
  •   
     

因此,这里的第二个参数是库存状态$stock_status,第三个参数是WC_Product对象$product (或数组$args

然后在这3个通知中,$order对象不存在,因为它可以是WC_Product对象,数组,空数组或null。 / p>