[英]Wordpress - How to schedule function to run every 48 hours
我在数据库中保存了一系列报价,我希望每48小时从数据库中提取一个随机的报价并显示在我的网站上。
我发现了使用自定义cron计划事件每48小时进行一次安排的代码。 但是,我假设我没有正确实现它,因为尽管站点上显示了一个随机引用,但是每次刷新页面时它都会切换到新的随机引用,而不是每48小时一次。
function quote_custom_cron_schedule( $schedules ) {
$schedules['every_two_days'] = array(
'interval' => 172800, // Every 48 hours
'display' => __( 'Every 48 hours' ),
);
return $schedules;
}
add_filter( 'cron_schedules', 'quote_custom_cron_schedule' );
//Schedule an action if it's not already scheduled
if ( ! wp_next_scheduled( 'quote_cron_hook' ) ) {
wp_schedule_event( time(), 'every_two_days', 'quotes_cron_hook' );
}
//Hook into that action that'll fire every 48 hours
add_action( 'quotes_cron_hook', 'quotes_cron_function' );
//Function that executes via cron
function quotes_cron_function() {
$args = array(
'post_type' => 'quote',
'orderby' => 'rand',
'posts_per_page'=> 1,
);
$quotes = new WP_Query( $args );
$quotes_output = '';
if( $quotes->have_posts() ):
while ( $quotes->have_posts() ) : $quotes->the_post();
$quotes_title = get_the_title();
$quotes_content = get_the_content();
$quotes_output .= '<div id="quote"><p>"' . $quotes_content . '"</p><p class="quote-name">' . $quotes_title . '</p></div>';
endwhile;
else:
$quotes_output = '';
endif;
wp_reset_postdata();
echo $quotes_output;
}
然后,我的header.php文件中将包含以下内容:
<?php do_action( 'quotes_cron_hook' ); ?>
这正在执行该功能,但是每次刷新页面时都会执行。 我需要函数等待48小时才能再次更改报价。 我觉得我可能在这里缺少一些简单的东西。
您的问题很可能是这样的:
if ( ! wp_next_scheduled( 'quote_cron_hook' ) ) {
wp_schedule_event( time(), 'every_two_days', 'quotes_cron_hook' );
}
当你有quote_cron_hook
insted的的quotes_cron_hook
一个有着s
一个没有。 这种不匹配将导致条件永不失败,因为事件被命名为错误,从未计划,并且此条件在每个单个请求上均通过。 这反过来运行wp_schedule_event
用的起始时间函数time
(见下文)。
如果您查看下面wp_schedule_event
链接的文档。 您拥有time()
的第一个参数是
$ timestamp (整数)(必需)您第一次希望事件发生。 这必须是UNIX时间戳格式。 WP cron使用UTC / GMT时间,而不是本地时间。 使用time(),在WordPress中始终为格林尼治标准时间。
请注意,这是您第一次希望事件发生 ,现在的time()
正确,并且由于它的名称错误,它将在每次页面加载时执行一次,然后立即运行。
您当然可以将time()
设置为其他值,但这只会掩盖问题。
其他的东西
这也可能是错误的。
wp_schedule_event( time(), 'every_two_days', 'quotes_cron_hook' );
更具体地说,请查看文档
https://codex.wordpress.org/Function_Reference/wp_schedule_event
$ recurrence (字符串)(必需)事件应多久发生一次。 有效值:
- 每小时
- 每天两次
- 日常
默认值:无
除非没有记录,否则我看不到every_two_days
。 老实说,我没有使用过WP调度程序。 Default: None
可能是您在此处实际拥有的,因为WP无法识别该值,因此会回落到无。 但是我不确定到底是什么。
甚至更多其他的东西
就像我在评论中说的那样(可以使用,但请记住)
wp调度程序只能在活动请求发生时运行,因此wp调度程序只能授予作业在给定时间之前不会运行的权限。 没有被授予者将在此之后的特定时间运行,而是在分配的时间之后在下一个请求上运行
将此添加到wp-config.php
define('DISABLE_WP_CRON', true);
禁用内置的cron / scheduler。 然后进入C-Panel或编辑crontab(crontab -e)并添加此cron作业以每分钟(或一些有用的时间间隔)运行
php -q pathtowp/wp-cron.php
这样做是什么,它将控制时序的控制从wordpress转移到了“实际的” CRON应用程序(在Linux上)。 这样,它就不再依赖页面加载了。
但是,正如我所说的,并且由于这是某人应该查看的帖子,因此正常的WP行为可能对您而言是完全正常的。 通常,如果我对调度程序执行任何操作,则只能依靠真正的CRON,这就是我提到它的原因。
希望能帮助到你!
我认为您在想这是错误的方式。 您的标头中有do_action( 'quotes_cron_hook' )
,它将在每次页面加载时触发quotes_cron_hook
操作,这将使quotes_cron_function()
在每次触发时都可以挂接到该操作中。 这似乎与您报告的行为一致。
关键是,设置WP cron作业不会强制挂钩仅以该特定间隔运行。 在您的情况下, quotes_cron_hook
操作会在每次加载页面时触发,但也会每48小时触发一次。
在我看来,您想要的功能是提取“临时”报价,然后每48小时更改一次。 为此,您需要以下内容:
if ( ! wp_next_scheduled( 'change_quote_hook' ) ) {
wp_schedule_event( time(), 'every_two_days', 'change_quote_hook' );
}
add_action( 'change_quote_hook', 'change_quote_function' );
function change_quote_function() {
$args = array(
'post_type' => 'quote',
'orderby' => 'rand',
'posts_per_page'=> 1,
);
$quotes = new WP_Query( $args );
$quotes_output = '';
if( $quotes->have_posts() ):
while ( $quotes->have_posts() ) :
$quotes->the_post();
// Set the temporary post using a WordPress option
update_option( 'quote_post', get_the_ID() );
endwhile;
endif;
wp_reset_postdata();
}
然后,cron作业将每48小时(如人们所指出的那样或多或少)触发一次此功能,并设置引号,然后在该引号上显示该报价。 然后,您的标题可以执行操作以在每次页面加载时显示报价。
add_action( 'display_quote', 'display_quote_function' );
function display_quote_function() {
// Get the quote post ID
// The default, 1, will be returned if the option is not set
$quote_id = get_option( 'quote_post', 1 );
$quote = get_post( $quote_id );
$quotes_title = quote->post_title;
$quotes_content = quote->post_content;
$quotes_output = '<div id="quote"><p>"' . $quotes_content . '"</p><p class="quote-name">' . $quotes_title . '</p></div>';
echo $quotes_output;
}
do_action('display_quote');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.