首页 > 解决方案 > 从 WordPress cron 调用 WooCommerce 对象时不可用

问题描述

从 wp_cron 作业调用 WooCommerce 对象时,我遇到了一个“奇怪”的问题。

我创建了下一个函数,该函数每隔 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 Products 中的所有非虚拟产品,并将它们的 SKU 与仓库数组中的一次进行比较。如果有匹配,它将更新当前的股票头寸。

没有什么真正花哨或先进的。当我从管理面板(使用 cron 管理器)触发 cronjob 时,它工作正常。但是当 cronjob 触发自治时,WC_Product_Query对象不会填充或其他东西。我可以print_r对象$oQuery并且它显示一个空对象,但是当我调用该get_products()方法时它崩溃了。

因此,当 cron 自动触发时,WooCommerce 类似乎没有被启动,但是当通过管理面板调用它时它确实/是。

我尝试在 WordPress.org 上搜索或询问,但无济于事(要么没有回答糟糕的搜索技巧)。

在我开始拆解 WordPress 和 WooCommerce 并花费大量时间之前,有人知道为什么会发生这种情况以及如何解决这个问题吗?

关于提前,米歇尔

更新 1. 我整天都在努力找出问题所在。我终于找到了。但我仍然不知道为什么这在管理面板中有效,而不是通过 cron。

问题出在 WP_Query 类中。

有一个称为查询的变量和一个称为查询的方法。查询函数如下所示:

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

正如你所看到的,在这个函数内部,他们正在更新 $this->query,但是由于没有输入 PHP,所以有人猜测它是否会更新变量或方法。更棘手的是 wp_parse_args 在将数组传递给它时返回对数组(指针)的引用。因此 PHP 无法判断您是指变量还是更新函数点。

底线是由于某种原因,一半时间变量被更新,一半时间函数指针,这结束了 PHP 脚本的整个处理。

为什么他们会用相同的名称命名一个函数和一个变量我不知道,但现在我被困住了,因为我试图将所有出现的 $this->query 重命名为其他名称,但这带来的问题比它解决的要多。

顺便说一句,我的 PHP 版本是 7.2.11

如果有人知道如何告诉 PHP 它实际上应该更新两者中的哪一个,那将有很大帮助。

标签: phpwordpresswoocommercecron

解决方案


问题解决了。最终这是对函数 get_posts() 的最后一次调用,由于某种原因出错了。经过漫长的调试会话后,我注意到 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 的值,但在另一个事件中却返回了。

至少对我来说,我可以继续从事这个项目。


推荐阅读