хук woocommerce_email_attachments с пустым аргументом $ order в Woocommerce - PullRequest
0 голосов
/ 11 ноября 2018

Человек, создающий сайт 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 голосов
/ 12 ноября 2018

Ваш разработчик использовал этот официальный фрагмент woocommerce (устарел, поскольку ему 3 года) и использует woocommerce_email_attachments фильтр-хук.

Этот фильтр-крючок определен:

  • один раз (1) в WC_Email классе (с аргументом $order)
  • три раза (3) в WC_emails Класс ( без аргумент $order)

Таким образом, WC_Order Object $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 в качестве 2-го и 3-го аргументов)
  • Вкл. Уведомление «Нет на складе» 'no_stock' и $product в качестве 2-го и 3-го аргументов)
  • Вкл. Уведомление «Задержка» 'backorder' и $args в качестве 2-го и 3-го аргументов)

Таким образом, здесь 2-й аргумент - это состояние склада $stock_status, а 3-й аргумент - это WC_Product объект $product (или массив $args) .

Тогда В этих 3 уведомлениях объект $order не существует , так как это может быть WC_Product Объект, массив, пустой массив или ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...