今天,在为客户开发简单脚本时遇到了一个有趣的问题。客户希望他的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相关吗?
预先感谢
答案 0 :(得分:0)
因此,wordpress Cron不是真正的Cron。这取决于被访问的上传页面,然后触发wp-cron.php。因此,如果更新在某个时间点运行,则只有在设置的时间过去并且有人访问该站点后,它才会再次运行。
您可以在wp-config(define('DISABLE_WP_CRON',true))上禁用wp的Cron,并使用Webhost的cron作业运行wp-cron.php。