如何使WordPress每X次运行一个脚本?

时间:2018-11-15 15:47:36

标签: php wordpress woocommerce

今天,在为客户开发简单脚本时遇到了一个有趣的问题。客户希望他的WooCommerce产品库存每天在设定的时间自动更新,但事件根本没有触发。在下面可以找到我在主题文件夹内的functions.php文件中编写的脚本的实现:

// UPDATE WOOCOMMERCE STOCKS AGAINST BRANDSDISTRIBUTION
function my_cron_schedules($schedules){
    if(!isset($schedules["5min"])){
        $schedules["5min"] = array(
            'interval' => 5*60,
            'display' => __('Once every 5 minutes'));
    }
    if(!isset($schedules["1min"])){
        $schedules["1min"] = array(
            'interval' => 1*60,
            'display' => __('Once every 1 minutes'));
    }
    if(!isset($schedules["30min"])){
        $schedules["30min"] = array(
            'interval' => 30*60,
            'display' => __('Once every 30 minutes'));
    }
    return $schedules;
}

add_filter('cron_schedules','my_cron_schedules');

wp_schedule_event(time(), '1min', 'my_schedule_hook');

function my_schedule_hook(){
    // do something every day

    echo "creating data.csv because i didnt find it";

    $username = 'REMOVED FOR SECURITY';
    $password = 'REMOVED FOR SECURITY';
    $header = "Authorization: Basic " . base64_encode($username . ':' . $password);
    $url = 'https://www.brandsdistribution.com/restful/export/api/products.csv?acceptedlocales=pt_PT';

        if (!file_exists("data.csv")) {
            $body = wp_remote_retrieve_body(wp_remote_get($url, array('headers' => $header)));
            file_put_contents("data.csv", $body);
        }

        if (($handle = fopen("data.csv", "r")) !== false) {
            fgetcsv($handle);
            while (($data = fgetcsv($handle, 1000, ",")) !== false) {
                $num = count($data);
                for ($c = 0; $c < $num; $c++) {
                    $col[$c] = esc_attr($data[$c]);
                }

                $product_id = 7;//$col[28];
                $quantity = 200;//$col[31];

            wc_update_product_stock_status($product_id, $quantity);
            }

        }

        fclose($handle);
}

我们将其设置为每1分钟触发一次事件以进行测试。该脚本似乎甚至没有到达my_schedule_hook()函数中的第一个“ if”。

可能与cron相关吗?

预先感谢

1 个答案:

答案 0 :(得分:0)

因此,wordpress Cron不是真正的Cron。这取决于被访问的上传页面,然后触发wp-cron.php。因此,如果更新在某个时间点运行,则只有在设置的时间过去并且有人访问该站点后,它才会再次运行。

您可以在wp-config(define('DISABLE_WP_CRON',true))上禁用wp的Cron,并使用Webhost的cron作业运行wp-cron.php。