Не могу получить способы доставки из заказа в расширении woocommerce, но могу в теме

Я разрабатываю расширение woocommerce и имею следующий раздел кода в одном из моих классов.

$order = new WC_Order(159); 
$shipping_methods = $order->get_shipping_methods(); 
print_r($shipping_methods); 

Это возвращает пустой массив, как показано здесь.

[24-Sep-2014 04:05:02 UTC] Array
(
)

Если я помещу точно такой же фрагмент кода в свою тему, вместо этого массив будет заполнен, как и ожидалось, и вернет следующее

Array
(
[10] => Array
    (
        [name] => International Delivery
        [type] => shipping
        [item_meta] => Array
            (
                [method_id] => Array
                    (
                        [0] => international_delivery
                    )

                [cost] => Array
                    (
                        [0] => 175
                    )

            )

        [method_id] => international_delivery
        [cost] => 175
    )
)

Я пытался отладить это, но не могу понять, что я пропустил. Те же три строки кода работают в теме, но не работают в плагине. Есть ли глобальная или другая переменная, которую я пропустил?

РЕДАКТИРОВАТЬ:

Объект заказа, который я создаю, уже является завершенным заказом, и я просто запрашиваю информацию из него. Я не уверен, что это проблема загрузки, как предлагается ниже.

Также, когда я var_dump $order показывает мне объект заказа. Есть ли причина, по которой унаследованные от WC_Abstract_Order методы не будут работать в этот момент?

WP_DEBUG включен и никаких ошибок или предупреждений не выдается.

Также следует отметить, что это класс, который расширяет WC_Email.

РЕДАКТИРОВАТЬ 2:

Я отследил, где объект $order путается в моем методе триггера для WC_Email.

Вызов этого фильтра woocommerce_order_get_items разрушает объект $order.

add_filter( 'woocommerce_order_get_items', array( $this, 'check_items' ), 10, 2 );

Это моя строка кода: если я ее отключу, то смогу получить доступ к get_shipping_methods().


person Digitalchild    schedule 24.09.2014    source источник


Ответы (2)


У вас включен режим WP_DEBUG? Если это так, я ожидаю увидеть некоторые фатальные ошибки, такие как get_shipping_methods() не существует или, может быть, «Вызов функции-члена для не-объекта», который оставит $order неопределенным и, следовательно, пустым, когда вы var_dump его.

Плагины загружаются перед темами (см. Справочник по хукам действий), поэтому WooCommerce полностью загружается к тому времени, когда вы тема называется. Возможно, ваш плагин запущен до загрузки WooCommerce.

Я бы попробовал запустить ваш код на более позднем хуке, таком как plugins_loaded или специфичный для WooCommerce, woocommerce_loaded.

person helgatheviking    schedule 24.09.2014
comment
С включенным WP_DEBUG я не получаю никаких ошибок, как вы предлагаете. Я уже var_dumping заказ $ и он создается. Я также следую стандарту проверки woocommerce перед загрузкой моего плагина. Я пытался использовать хук woocommerce_loaded, но это сломало плагин. - person Digitalchild; 25.09.2014
comment
Я также уже использую plugins_loaded для инициализации моего плагина. Что мне также кажется интересным, так это то, что это нужно для получения информации об уже выполненном заказе. Я просто спрашиваю. - person Digitalchild; 25.09.2014
comment
Ну тогда я немного в растерянности. Если бы они еще не были загружены, вы бы увидели ошибки. - person helgatheviking; 25.09.2014
comment
Спасибо за предложения в любом случае. Вот почему я так смущен. - person Digitalchild; 26.09.2014
comment
Я проверил ваш код в одном из моих плагинов WooCommerce, и пока в заказе есть товары, требующие доставки, я вижу возвращенный массив. Если в заказе нет отправленных товаров, я получаю пустой массив. Поскольку вы сказали, что использовали тот же код (и, предположительно, тот же номер заказа), это еще больше сбивает меня с толку. Я бы попробовал отключить другие плагины и вашу тему, чтобы увидеть, есть ли какие-либо конфликты, но да, я застрял. - person helgatheviking; 26.09.2014
comment
Среда разработки, поэтому у меня есть только woocommerce + мой плагин. Стандартная тема 2014 года. Мне интересно, имеет ли это какое-либо отношение к тому, что это класс электронной почты, который может предложить проблему с загрузкой. - person Digitalchild; 28.09.2014
comment
Может быть? Я сделал немного с созданием нового электронного письма, но не так много. Однако, насколько я помню, у меня был доступ к переменной $order. - person helgatheviking; 28.09.2014
comment
У меня есть доступ к переменной $order в методе триггера, но любой другой метод того же класса, метод $order содержит только простые сведения о заказе, и я не могу запрашивать методы доставки или другие сведения. - person Digitalchild; 29.09.2014

Оказывается, предыдущий разработчик неправильно перебирал $items и сбрасывал позиции. После долгих разочарований я исправил обнаружение line_item против предмета доставки, и теперь код работает.

Затем это передавалось всем фильтрам для объекта $order, эффективно удаляя все следы информации о доставке. Всегда проверяйте строку кода за строкой. Я выяснил, что 2 фильтра для изменения позиций постоянно сохраняют объект при вызовах, поэтому он удалял информацию о доставке.

person Digitalchild    schedule 29.09.2014
comment
Иногда работа с чужим кодом заставляет вас седеть. - person helgatheviking; 29.09.2014