【发布时间】:2019-06-29 15:37:26
【问题描述】:
我的数据库中保存了一系列报价,我希望每 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 小时才能再次更改报价。我觉得我可能在这里遗漏了一些简单的东西。
【问题讨论】:
-
wp 调度程序只能在活动请求发生时运行,因此 wp 调度程序只能授予作业在给定时间之前不会运行的权限。没有被授权者会在之后的特定时间运行,它会在分配的时间之后的下一个请求上运行。
-
请注意,WordPress cron 作业实际上并不是 cron 作业。每当有人访问触发您的脚本的页面时,WordPress 将检查该 cron 作业是否已在计划的窗口内运行。如果不是,那么它将运行,否则将被忽略。它将不会自动触发。让它自动运行的唯一方法是 1)在服务器上设置一个实际的 cron 作业(可能对您来说不可能),或者 2)创建一个单独的服务,旨在为您定期访问该页面(您最好的选择)强制 WordPress cron 作业运行。
-
@B.Fleming - 我忘了向该站点发出请求,这是我应该记住的实际事情,我正在制作一个几乎需要使用 CRON 的 wordpress 插件,但要设置它对于插件用户来说有点困难。所以这是我可以添加到我的网站的服务。 ... :-)
标签: php wordpress loops cron schedule