在用于WordPress / woocommerce后端的私人自定义插件中,我需要安排减少产品库存。使用名为WP Crontrol的插件,我能够看到我的wp_cron成功记录了调度命令,但是当我选择"立即运行"为了测试库存减少功能,它不会触发(即使WP Control报告任务成功)。我怀疑它与我在wp_schedule_single_event
中传递参数数组的方式有关,但我已经尝试了我能想到的每一次迭代。你们可以在下面的代码中看到任何红旗吗?提前谢谢。
这是执行调度功能的函数的一部分(请注意事件似乎在适当的时间成功调度。):
$x=0;
foreach ($robot_array as $index_key => $index_value){
if ($x <= 1){
wc_add_order_item_meta($passed_order_item, $index_value['product']['name'], $index_value['product']['sku']);
$product = New WC_Product($index_value['product']['id']);
$product->set_stock(1, 'subtract');
unset($product);
} elseif ($x > 1 && $x <= 11){
wc_add_order_item_meta($passed_order_item, $index_value['product']['name'], $index_value['product']['sku']);
$time = new DateTime();
$time->add(add_months($x, $time));
$args = array($index_value['product']['id']);
wp_schedule_single_event($time->getTimestamp(), 'cmcs_scheduled_stock_reduction', $args);
unset($time);
}
$x++;
}
这里应该触发的功能:
add_action('cmcs_scheduled_stock_reduction', 'cmcs_scheduled_stock_reduction_callback', 10, 2);
function cmcs_scheduled_stock_reduction_callback($args) {
global $woocommerce, $wpdb;
$product_id = $args;
do_action( 'add_debug_info', $args);
$product = New WC_Product($product_id);
$product->set_stock(1, 'subtract');
unset($product);
}
答案 0 :(得分:0)
事实证明,这是我传递参数的方式。这隐含在我在网上找到的资源中,但从未明确说明:你不能在wp_schedule_single_event
中传递一个参数。 $ args必须是一个数组,并映射到您在钩子函数中任意定义的变量。
我所做的是添加填充值以传递,然后引用我想要的数组中的元素,如下所示:
$x=0;
foreach ($robot_array as $index_key => $index_value){
if ($x <= 1){
wc_add_order_item_meta($passed_order_item, $index_value['product']['name'], $index_value['product']['sku']);
$product = New WC_Product($index_value['product']['id']);
$product->set_stock(1, 'subtract');
unset($product);
} elseif ($x > 1 && $x <= 11){
wc_add_order_item_meta($passed_order_item, $index_value['product']['name'], $index_value['product']['sku']);
$time = new DateTime();
$time->add(add_months($x, $time));
//HERE IS THE CHANGE
wp_schedule_single_event($time->getTimestamp(), 'cmcs_scheduled_stock_reduction', array($index_value['product']['id'],1,2));
//
unset($time);
}
$x++;
}
add_action('cmcs_scheduled_stock_reduction', 'cmcs_scheduled_stock_reduction_callback', 10, 3);
function cmcs_scheduled_stock_reduction_callback($arg1,$arg2,$arg3) {
global $woocommerce, $wpdb;
$product_id = $arg1;
$product = New WC_Product($product_id);
$product->set_stock(1, 'subtract');
unset($product);
}