我正在构建一个插件,它需要一个每月更新的数据库文件。我想写一个函数,每30天自动替换一次旧文件。
这是我到目前为止的情况。我走对了吗?
add_action( \'plugins_loaded\', \'update_some_file\' );
function update_some_file() {
$remotefile = curl_init(\'http://www.somesite.com/somefile.dat\');
curl_setopt($remotefile, CURLOPT_NOBODY, true);
curl_setopt($remotefile, CURLOPT_RETURNTRANSFER, true);
curl_setopt($remotefile, CURLOPT_FILETIME, true);
$result = curl_exec($remotefile);
if ($result === false) {
die (curl_error($remotefile));
}
$timestamp_r = curl_getinfo($remotefile, CURLINFO_FILETIME);
$localfile = \'/path/to/somefile.dat\';
if ( file_exists( $localfile ) && ( date("Y-m-d H:i:s", $timestamp_r) - date("Y-m-d H:i:s", filemtime($localfile)) >= 30 days ) ) { // obviously need some help here.
rename(\'/path/to/somefile.dat\', \'/path/to/old_somefile.dat\');
$newfile = file_get_contents(\'http://www.somesite.com/somefile.dat\');
file_put_contents(\'/path/to/somefile.dat\', $newfile);
unlink(\'/path/to/old_somefile.dat\')
}
}
或者有没有更简单/更好的方法?
更新时间:
我验证了文件操作部分是否正常工作:
add_action( \'plugins_loaded\', \'update_some_file\' );
function update_some_file() {
$localfile = dirname( __FILE__ ) . \'/includes/localfile.txt\';
if ( file_exists( $localfile ) ) {
rename(dirname( __FILE__ ) . \'/includes/localfile.txt\', dirname( __FILE__ ) . \'/includes/old/localfile.txt\');
$newfile = file_get_contents(\'http://somesite.com/localfile.txt\');
file_put_contents(dirname( __FILE__ ) . \'/includes/localfile.txt\', $newfile);
unlink(dirname( __FILE__ ) . \'/includes/old/localfile.txt\');
}
}
更新时间:
这是最终的工作代码,多亏了菲奇的帮助。(我将时间表设置为5分钟进行测试)
add_filter( \'cron_schedules\', \'lsmicron_add_intervals\');
function lsmicron_add_intervals( $schedules ) {
$schedules[\'fiveminutes\'] = array(
\'interval\' => 300,
\'display\' => __(\'5 Minutes\')
);
return $schedules;
}
add_action(\'lsmicron_fiveminutes_event\', \'lsmi_geoip_update\');
if ( !wp_next_scheduled( \'lsmicron_fiveminutes_event\' ) ) {
wp_schedule_event( time(), \'fiveminutes\', \'lsmicron_fiveminutes_event\' );
}
function lsmi_geoip_update() {
$localfile = dirname( __FILE__ ) . \'/includes/localfile.txt\';
if ( file_exists( $localfile ) ) {
rename(dirname( __FILE__ ) . \'/includes/localfile.txt\', dirname( __FILE__ ) . \'/includes/old/localfile.txt\');
$newfile = file_get_contents(\'http://example.com/localfile.txt\');
file_put_contents(dirname( __FILE__ ) . \'/includes/localfile.txt\', $newfile);
unlink(dirname( __FILE__ ) . \'/includes/old/localfile.txt\');
}
}
最合适的回答,由SO网友:fischi 整理而成
首先,我想您的函数已经可以运行了-我没有调试它,但想为您指出WordPress事件调度的正确方向。
您应该使用wp-cron
为此。它让您可以安排事件,并让它们由WordPress处理。
请记住,这不是一个真正的cronjob,取决于您的站点是否被调用。如果您需要更新文件,无论站点上是否有访问者,请考虑使用真正的cronjob调用wp cron。
首先,您需要每月注册一次(在本例中为30天)。您可以在那里定义任何间隔,无论您需要什么,只需以秒为单位传递间隔即可。
function f711_add_intervals($schedules) {
$schedules[\'thirtydays\'] = array(
\'interval\' => ( 30 * 24 * 60 * 60 ), // time in seconds.
\'display\' => __(\'30 Days\')
);
return $schedules;
}
add_filter( \'cron_schedules\', \'f711_add_intervals\');
现在,您可以注册一个计划的事件,但只有在检查了尚未注册的事件之后:
// function to register the event
function f711_activation() {
// check if event is already scheduled
if ( !wp_next_scheduled( \'f711_thirtydays_event\' ) ) {
// schedule event with the schedule \'thirtydays\', calling the action hook
wp_schedule_event( current_time( \'timestamp\', \'thirtydays\', \'f711_thirtydays_event\' );
}
}
// define the hook, calling your function
add_action(\'f711_thirtydays_event\', \'update_some_file\');
您可以使用
wp_get_schedule()
函数,检查是否一切正常。