为我建立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
传递为空?
答案 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>