如何每24小时运行一次代码?

时间:2020-04-05 作者:Slingy

我正在为基于Woocommerce的面包店编写自定义插件。问题是,它有基于两天前订单的库存。产品A的产量为500件。库存减少了2天前订购的物品数量(全球总额)。我写了这个函数,它可以工作(我猜),但我仍然必须每天午夜(24:00/12 a.m.)调用这个函数

最好的解决方案是cron,我听说WP有自己的类似crown的功能,只有在有流量的情况下才能工作。

您认为在真正的cron之上使用WP-cron是个好主意吗?每天大约有100人访问page。

请您帮我编辑下面的代码,以存档这些点,好吗?

1) 每天24:002启动功能)使用custom\\u post\\u meta中的值更新库存auto_restock_value 减去前2天的订单数量(global variable $sum). 这应该有效(?)3) 保存值并每天重复。

提前感谢您!

$post_id = $_GET[\'post\'];

function update_restock_value() {
    global $post_id;
    $val = get_post_meta( $post_id, \'auto_restock_value\', true );
    echo \'<div class="option_group">\';

    woocommerce_wp_text_input( array(
        \'id\'          => \'auto_restock_value_id\',
        \'value\'       => $val,
        \'type\'        => \'number\',
        \'label\'       => \'Auto - uzupełniany stan magazynowy\',
        \'desc_tip\'    => true,
        \'name\'        => \'auto_restock_value\',
        \'description\' => \'Ta wartość, codziennie o 24:00, nadpisze stan magazynowy danego produktu\',
    ) );

    echo \'</div>\';
}


//register_activation_hook( __FILE__, \'my_custom_cron\' );
//add_action( \'my_hourly_event\', \'do_this_hourly\' );

//function my_custom_cron() {
    //wp_schedule_event( time(), \'hourly\', \'update_cart_stock\' );
//}

function post_order() {
    $args = array(
        \'type\' => \'shop_order\',
        \'status\' => \'processing\',//zmienić//zmienić na completed
        \'return\' => \'ids\',
        \'date_created\' => ( date("F j, Y", strtotime( \'-2 days\' ) ) ),//list orders from 2 days before
    );
    global $sum;
    $orders_ids = wc_get_orders( $args );

    foreach ($orders_ids as $order_id) {//get order Id, and show product qty of this product
        $order = new WC_Order( $order_id );
        $items = $order->get_items();
        foreach ( $items as $item ) {
            $product_id = $item->get_product_id();
            if($product_id == $_GET[\'post\']) {//If product if is the same as current product, then update global $sum
                $product_qty = $item->get_quantity();
                $sum += $product_qty;
            }
        }
    }
}

add_action(\'init\', \'post_order\'); 

function update_cart_meta() {
    global $post_id;
    global $sum;
    echo \'<p id="sum">\' . $sum . \'</p>\';//checking if it works
    update_post_meta($post_id, \'_stock\', $sum);//update stock with orders qty from 2 das before
}

add_action(\'init\', \'update_cart_meta\');

function update_custom_meta() {
    global $post_id;
    $custom_value = $_POST[\'auto_restock_value\'];
    update_post_meta($post_id, \'auto_restock_value\', $custom_value);//update custom post meta field
}

add_action(\'save_post\', \'update_custom_meta\');
编辑:

问题2-为什么此操作返回零?

function update_cart_meta() {
    global $post_id;
    global $sum;
    echo \'<p id="sum">\' . $sum . \'</p>\';//checking if it works (it works)
    $custom_value = $_POST[\'auto_restock_value\']; //(it works)
    $custom_output = $custom_value - $sum; // doesn\'t work, return 0
    update_post_meta($post_id, \'_stock\', $custom_value);//update stock with orders qty from 2 days before
}

add_action(\'init\', \'update_cart_meta\');

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

要每24小时运行一次,可以使用WP Cron系统。但是,请记住:

  • wp-cron 在每次页面加载后运行/检查。如果2天内没有人访问您的站点,cron作业无法运行,它需要访问者获得运行的机会,因为它需要访问者访问站点以进行检查,它不会在正确的时间运行。如果它在12:00到期,但13:01之前没有人访问,那么它在13:01之前将没有机会访问您的代码所依赖的$post_id = $_GET[\'post\']; 这在cron作业中是不可能的,cron作业是一个单独的web请求,因此没有POST或GET值。您需要将此值存储在某个选项中,以便它知道post ID是什么,现在我们有一些注意事项,这就是应该如何设置每日WP Cron计划的方法:

    if ( ! wp_next_scheduled( \'your_hook\' ) ) { // if it hasn\'t been scheduled
        wp_schedule_event( time(), \'daily\', \'your_hook\' ); // schedule it
    }
    
    
    ....
    
    
    add_action( \'your_hook\', \'your_function\' );
    
    我建议在init 钩要使其在每天的特定时间之后发生,请修改传递给的时间wp_schedule_event 下一次应该运行。E、 g.如果是5号星期一晚上7点,我们希望它每天下午5点运行,那么就给它5点6th. Doing that is a PHP problem not a WP problem though, and luckily stack overflow has a great answer here.

    使其在准确的时间运行,而不考虑访问者

    如果您有幸能够设置系统级cron作业,您可以消除站点访问者对WP cron工作的需求:

    https://developer.wordpress.org/plugins/cron/hooking-wp-cron-into-the-system-task-scheduler/

    <禁用WP Cron inwp-config.php
  • 通过直接ping URL或使用WP CLI执行cron作业,如果您有冒险精神,并且了解开发人员/服务器管理员,请设置cavalcade服务以运行WP cron任务请注意,如果您在多站点上,则需要为每个博客执行此操作,WP Cron不会针对每个站点运行,如果您没有明确针对每个站点运行它,请进一步阅读。为了进一步阅读,官方文档插件手册中有一节介绍了Cron作业:

    https://developer.wordpress.org/plugins/cron/

相关推荐

PHP致命错误:未捕获错误:在新的WordPress安装中调用未定义的函数wp_kses_Normize_Entities()

我正在尝试在NetBSD(unix)上安装Wordpress 5.3.2。phpinfo()告诉我正在运行Apache/2.4.33(Unix)PHP/7.2.6/wp管理/设置配置。php?步骤=1在窗口底部(在“提交”按钮下方)有一条消息,表示“您的网站出现严重错误”。考虑将WP\\u DEBUG设置为“true”,希望得到错误消息,我手动配置了WP config。php,但正在安装。php我得到一个空白屏幕。服务器日志显示“调用未定义函数wp\\u kses\\u normalize\\u enti