У меня "странная" проблема с вызовом объектов 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, какой из двух он действительно должен обновить, это очень поможет.