调度产品库存减少但是wp_schedule_single_event似乎没有解雇我的功能

时间:2015-05-03 21:26:09

标签: php wordpress woocommerce

在用于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);
}

1 个答案:

答案 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);
}