php - 从 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 它实际上应该更新两者中的哪一个,那将有很大帮助。
解决方案
问题解决了。最终这是对函数 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 的值,但在另一个事件中却返回了。
至少对我来说,我可以继续从事这个项目。
推荐阅读
- model-view-controller - 从控制器操作发布到第三方网站
- javascript - Vuetify.js 和日期选择器手表不会在月份触发
- php - Codeigniter, mysql, select_max... 不同列值时插入
- excel - 宏的执行不起作用(Excel 2016)
- scala - scala代码错误将unixtimestamp转换为数据帧中的日期时间格式
- css - 将具有百分比 (%) 宽度的 div 设置为其最大内容的最小宽度
- c# - 网格未使用所有可用空间
- python - 修改视频帧,但在 python skvideo ffmpeg 中保留它们的时间戳
- c++ - “new int * **[10]”有什么作用?
- r - 增加字符串以支持> 4000个字符限制的方法?