Объекты WooCommerce недоступны при вызове их из cron WordPress - PullRequest
0 голосов
/ 24 января 2019

У меня "странная" проблема с вызовом объектов WooCommerce из задания wp_cron.

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

// Update the stock of our products every 10 minutes
function cron_yp_update_product_stock_b1f6051b() {
    $oConvexStock = YP_get_stock_per_SKU();

    $oQuery = new WC_Product_Query( array( "return" => "objects", "virtual" => false ) );
    $oResult = $oQuery->get_products();
    if ( is_array( $oResult ) ) {
        foreach( $oResult as $oProduct ) {
            if ( isset( $oConvexStock[$oProduct->get_sku()] ) ) {
                wc_update_product_stock($oProduct, $oConvexStock[$oProduct->get_sku()], "set" );
            }
        }
    }
}

Он извлекает массив, в котором коды SKU являются ключами, а значение - текущим запасом, доступным на складе.Затем он запрашивает продукты WooCommerce для всех не виртуальных продуктов и сравнивает их SKU с единицами в массиве хранилища.Если есть совпадение, оно обновит текущую позицию на складе.

Ничего особенного или продвинутого.Он отлично работает, когда я запускаю cronjob из панели администратора (используя cron manager).Но когда cronjob запускает автономно, объект WC_Product_Query не заполняется или что-то еще.Я могу print_r объект $oQuery, и он показывает пустой объект, но когда я вызываю метод get_products(), он падает.

Похоже, класс WooCommerce не запускается или что-то, когда cron запускается автономно, но это происходит / вызывается при вызове через административную панель.

Я пробовал поискать в Google илиспрашиваю на WordPress.org, но безрезультатно (либо нет ответа на плохие навыки поиска).

Прежде чем я начну разрывать WordPress и WooCommerce и сжигать огромное количество часов, кто-нибудь знает, почему это происходит и как это исправить?

Что касается заранее, Мишель

ОБНОВЛЕНИЕ 1. Я работал весь день, чтобы выяснить, что происходит не так.Я в конце концов нашел это.Но я до сих пор не знаю, почему это работает в админ-панели, а не через cron.

Проблема в классе WP_Query.

Существует переменная с именем query и метод с именем query.Функция запроса выглядит следующим образом:

public function query( $query ) {
    $this->init();
    $this->query = $this->query_vars = wp_parse_args( $query );
    return $this->get_posts();
}

Как вы можете видеть, внутри этой функции они обновляют запрос $ this->, но, поскольку PHP не введен, можно предположить, что он обновит переменную илиметод.Еще хитрее то, что wp_parse_args возвращает ссылку на массив (указатель) при передаче в него массива.Таким образом, PHP не может определить, имеете ли вы в виду переменную или обновляете функциональную точку.

Суть в том, что по какой-то причине переменная половина времени обновляется, а половина - указатель функции, который завершает всю обработку сценариев PHP вместе.

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

Кстати, моя версия PHP - 7.2.11

Если кто-нибудь знает, как сказать PHP, какой из двух он действительно должен обновить, это очень поможет.

1 Ответ

0 голосов
/ 27 января 2019

Проблема была решена.В конце концов это был последний вызов функции get_posts (), которая по какой-то причине пошла не так.После продолжительного сеанса отладки я заметил, что оператор return get_posts (), который выглядит как

return $this->posts

На самом деле вообще ничего не возвращал.Когда я обновил функцию запроса:

public function query( $query ) {
    $this->init();
    $this->query = $this->query_vars = wp_parse_args( $query );
    $this->get_posts();
    return $this->posts;
}

, все было решено.Я действительно понятия не имею, почему оператор return не возвращал значение $ this-> posts в одном событии, а в другом.

По крайней мере, я могу продолжить работу над этим проектом.

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