Проблема с пользовательским уведомлением WooCommerce с аргументом переменной $email

#php #wordpress #object #woocommerce #email-notifications

#php #wordpress #объект #woocommerce #email-уведомления

Вопрос:

У меня есть 2 пользовательских почтовых ящика, настроенных как wc_shipped_order amp; wc_received_order , и они отлично работают. У меня установлен триггер, поэтому, когда статус заказа изменяется на «отправлено», он запускает отправитель электронной почты отправленного заказа.

Я пытаюсь добавить код отслеживания доставки с помощью другого пользовательского плагина через хук действия woocommerce_email_before_order_table со следующим:

 add_action( 'woocommerce_email_before_order_table', 'tracking_number_email', 10, 4 );
function tracking_number_email( $order, $sent_to_admin, $plain_text, $email ) {
    if( 'wc_shipped_order_email' == $email->id ){
        echo '<p><strong>'.__('Australia Post Tracking Number').': </strong>' . get_post_meta( $order->get_id(), 'tracking_number', true ) . '</p>';
    }
}
 

Однако, когда я пытаюсь добавить оператор if, чтобы проверить, была ли почтовая wc_shipped_order программа, я получаю сообщение об ошибке. Фактическая часть echo работает, но оператор IF терпит неудачу и выдает эту ошибку:

 Notice: Trying to get property 'id' of non-object in /var/www/wp-content/plugins/my-custom-functions/inc/php/functional.php(103) : eval()'d code on line 239
 

Он понятия не имеет, что $email->id это такое, и я пытался сбросить эти переменные $email , но там ничего нет.

Кто-нибудь может мне помочь?

Ответ №1:

Ожидается, что в WooCommerce $email переменный аргумент будет объектом, из которого вы можете получить некоторые свойства (например id , в вашем коде). Выданная ошибка сообщает, что это не объект, поэтому невозможно получить от него какое-либо свойство (и, следовательно, не id свойство).

Чтобы избежать этой проблемы, вы можете использовать условную функцию PHP is_object() , например:

 add_action( 'woocommerce_email_before_order_table', 'tracking_number_email', 10, 4 );
function tracking_number_email( $order, $sent_to_admin, $plain_text, $email ) {
    if( is_object($email) amp;amp; 'wc_shipped_order_email' == $email->id ){
        $tracking_number = get_post_meta( $order->get_id(), 'tracking_number', true );

        if ( ! empty($tracking_number) ) {
            echo '<p><strong>'.__('Australia Post Tracking Number').': </strong>' . $tracking_number . '</p>';
        }
    }
}
 

Теперь он должен работать без ошибок.

Теперь эта проблема может быть связана с плагином, вашей темой или каким-либо другим пользовательским кодом, созданным вами. С предоставленной информацией никто не может догадаться, почему это происходит.