【问题标题】:woocommerce_email_attachments hook with empty $order argument in WoocommerceWoocommerce 中带有空 $order 参数的 woocommerce_email_attachments 钩子
【发布时间】:2019-04-14 15:09:35
【问题描述】:

为我建立 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://tt.dev.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 被传递为空?

【问题讨论】:

    标签: php wordpress object woocommerce hook-woocommerce


    【解决方案1】:

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

    定义了这个过滤钩子:

    • 一次(1)WC_Email 类中(使用$order 参数)
    • 三次(3)WC_emails 类中没有 $order 参数)

    所以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。

    【讨论】:

    • 谢谢!我觉得答案和你说的很接近。我用真实代码更新了原始问题。你能看出那里有什么问题吗?我看到他使用的过滤器与提到的过滤器不同
    • 只是为了更好地理解答案:同一个钩子被同一个订单调用多次?有时使用一组 A 参数,而其他时间使用一组不同的参数?并且在钩子中,代码需要“理解”这是哪种类型的调用?对吗?
    • @LouisShraga 该钩子在其他通知上调用,如产品低库存、无库存、延期交货……如果您不将其限制为特定的$email_id,它会在所有订单通知上调用。在您的代码中,它仅限于$email_id = 'customer_on_hold_order',因此它用于客户暂停订单电子邮件通知……如果您喜欢/想要您也可以为这个答案投票。还是谢谢你。
    • 谢谢,你知道吗和/或可以请我看一下文档(我只是找不到它),上面写着如果在 customer_on_hold emailId 的情况下为通话设置了 $order
    • @LouisShraga 没有具体的文档……当一个订单被设置为一个特定的订单状态时,它会触发相关的邮件通知,如果它被设置和定义了……你可以探索每个的源代码以WC_Email 开头的woocommerce 类对于每个类,您都有触发电子邮件的订单状态转换。
    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 2020-03-19
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2020-01-12
    • 2017-08-04
    • 1970-01-01
    相关资源
    最近更新 更多