当前位置: 首页 > 知识库问答 >
问题:

从WordPress cron调用WooCommerce对象时不可用

袁高明
2023-03-14

我在从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()], "html" target="_blank">set" );
            }
        }
    }
}

它所做的是检索一个数组,其中SKU代码是键,值是仓库中的当前可用库存。然后,它查询WooCommerce产品中的所有非虚拟产品,并将其SKU与仓库阵列中的once进行比较。如果存在匹配项,它将更新当前的股票头寸。

没有什么真正新奇或先进的东西。当我从管理面板(使用cron管理器)触发cronjob时,它可以正常工作。但是,当cronjob触发自治时,WC\u Product\u查询对象不会进行填充或其他操作。我可以print\r打印$oQuery对象,它显示了一个空对象,但是当我调用get\u products()方法时,它崩溃了。

所以看起来当cron被触发时,WooCommerce类不会启动,但是当通过管理面板调用它时,它会启动。

我试着在WordP上搜索或询问ress.org但没有用(也没有回答糟糕的搜索技巧)。

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

提前问好,米歇尔

更新1。我已经工作了一整天,想弄清楚到底出了什么问题。我终于找到了。但我仍然不知道为什么它在管理面板中工作,而不是通过cron。

问题出在WP_查询类中。

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

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

如您所见,在这个函数中,他们正在更新$this-

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

为什么他们会给一个函数和一个变量取相同的名字我不知道,但是现在我被卡住了,因为我试图重命名$this的所有出现-

顺便说一下,我的PHP版本是7.2。11

如果有人知道如何告诉PHP它实际上应该更新这两个选项中的哪一个,那将非常有帮助。

共有1个答案

那安宁
2023-03-14

问题解决了。最后,由于某种原因,对函数get_posts()的最后一次调用出现了错误。在一个漫长的调试会话之后,我注意到get_posts()的return语句

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的值-

对我来说,至少我可以继续这个项目的工作。

 类似资料:
  • 问题内容: 当我尝试在任何上下文中导入时,都会引发此错误: 知道我该如何解决吗?我只是通过打开Terminal,运行然后输入即可生成此错误。 问题答案: 昨天我遇到了同样的问题,没有安装Hashlib,尝试使用pip安装它会给出该错误。我通过使用easy_install进行安装来修复它。 另外我还必须在Windows上为Python 2.7安装Scipy和Microsoft Visual C ++

  • 问题内容: 我在Django中创建URL视图时遇到问题。它给了我这个错误(ferrol是一个Space对象): 这是代码: spaces / models.py Main urls.py spaces / urls.py spaces / views.py 问题答案: 在你的spaces / urls.py文件中,你必须提供查看方法的完整路径: 或像这样:

  • 问题内容: 这个问题已经在这里有了答案 : TypeError:“ dict”对象不可调用 (8个答案) 5年前关闭。 我正在使用JavaScript获取用户位置,并将纬度和经度发送到Flask应用。但是,当我尝试从中获得纬度时,我会得到。为什么会出现此错误,我该如何解决? 问题答案: 您需要更换与这样: 该物体是一本字典,而不是一个函数。

  • 问题内容: 我有以下代码 当我运行它时,我得到了: 这是为什么?怎么修? 问题答案: 将变量称为。它掩盖了内置功能。

  • 我可以从一个简单的脚本成功加载TextBlob模块,但不能从Flask应用程序加载。我将向您展示代码和错误。 加载一个简单的脚本工作: 从烧瓶应用程序加载时抛出错误: 错误: 我使用的是textblob版本0.11。0与pip一起安装。

  • 问题内容: 为什么会出现此错误?我很困惑。 你需要知道什么才能回答我的问题? 问题答案: 是一个包含的模块。 你需要执行以下操作: 这就是错误消息的含义: 它表示为,因为你的代码正在调用模块对象。模块对象是导入模块时得到的东西的类型。你试图做的是在模块对象中调用恰好与包含它的模块同名的类对象。 这是一种从逻辑上分解这种错误的方法: “ 告诉我我的代码试图调用无法调用的内容。我的代码试图调用什么?”