wordpress cron与您的普通cron
安排重复事件
>
如果您熟悉Unix的Cron,您可能会认为WordPress的Cron总是在寻找新任务并随着它们而运行它们。这远非事实,我将不久解释为什么。加载页面时,
wordpress的cron都会运行,无论是前端还是后端页面。换句话说,当您的网站上加载页面时,WordPress将检查是否有任何任务或事件需要运行并执行它们。如果您认为这不是理想的,那么您是绝对正确的。>如果您碰巧拥有一个无法获得太多流量的网站,并且您的任务需要在精确的时间执行,那么WordPress将不知道该任务是在某人访问您的网站之前到期的。即使它恰好是搜索引擎在您的网站上爬行。
有两种cron事件的口味,您可以使用几行代码安排:
>让我们来看看以下示例,我们将每天删除帖子修订。
>首先,我们创建我们的自定义“动作”,该自定义“动作”将附加到它的函数时,我们要运行的功能。
用于安排重复事件,我们使用WP_SCHEDULE_EVENT($ TIMESTAMP,$ recurrence,$ hook,$ args)函数,该功能获取4个参数:
><span><span><?php </span></span><span><span>// delete_post_revisions will be call when the Cron is executed </span></span><span><span>add_action( 'delete_post_revisions', 'delete_all_post_revisions' ); </span></span><span> </span><span><span>// This function will run once the 'delete_post_revisions' is called </span></span><span><span>function delete_all_post_revisions() { </span></span><span> </span><span> <span>$args = array( </span></span><span> <span>'post_type' => 'post', </span></span><span> <span>'posts_per_page' => -1, </span></span><span> <span>// We don't need anything else other than the Post IDs </span></span><span> <span>'fields' => 'ids', </span></span><span> <span>'cache_results' => false, </span></span><span> <span>'no_found_rows' => true </span></span><span> <span>); </span></span><span> </span><span> <span>$posts = new WP_Query( $args ); </span></span><span> </span><span> <span>// Cycle through each Post ID </span></span><span> <span>foreach( (array)$posts->posts as $post_id ) { </span></span><span> </span><span> <span>// Check for possible revisions </span></span><span> <span>$revisions = wp_get_post_revisions( $post_id, array( 'fields' => 'ids' ) ); </span></span><span> </span><span> <span>// If we got some revisions back from wp_get_post_revisions </span></span><span> <span>if( is_array( $revisions ) && count( $revisions ) >= 1 ) { </span></span><span> </span><span> <span>foreach( $revisions as $revision_id ) { </span></span><span> </span><span> <span>// Do a final check on the Revisions </span></span><span> <span>if( wp_is_post_revision( $revision_id ) ) { </span></span><span> <span>// Delete the actual post revision </span></span><span> <span>wp_delete_post_revision( $revision_id); </span></span><span> <span>} </span></span><span> <span>} </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>}</span></span>
$ timestamp - (integer)(必需)您第一次希望该事件发生。这必须采用Unix时间戳格式。 WP Cron使用UTC/GMT时间,而不是本地时间。使用time(),它始终是wordpress中的GMT。 (current_time('timestamp')是wordpress中的本地时间。)
>请注意,您还可以将此代码段添加到操作中。如果您是插件作者,则可以设置计划的事件,以便在访问插件选项页面时运行。对于一个简单得多的例子,我们将将其与WordPress的Init Action相提并论。
<span><span><?php </span></span><span><span>// Make sure this event hasn't been scheduled </span></span><span><span>if( !wp_next_scheduled( 'delete_post_revisions' ) ) { </span></span><span> <span>// Schedule the event </span></span><span> <span>wp_schedule_event( time(), 'daily', 'delete_post_revisions' ); </span></span><span><span>}</span></span>
>
安排一个事件<span><span><?php </span></span><span><span>// Add function to register event to WordPress init </span></span><span><span>add_action( 'init', 'register_daily_revision_delete_event'); </span></span><span> </span><span><span>// Function which will register the event </span></span><span><span>function register_daily_revision_delete_event() { </span></span><span> <span>// Make sure this event hasn't been scheduled </span></span><span> <span>if( !wp_next_scheduled( 'delete_post_revisions' ) ) { </span></span><span> <span>// Schedule the event </span></span><span> <span>wp_schedule_event( time(), 'daily', 'delete_post_revisions' ); </span></span><span> <span>} </span></span><span><span>}</span></span>
>
它背后的概念与反复事件相同。首先,您注册一个自定义挂钩,该钩在服务器上运行时由Cron调用。克朗调用钩子后,其功能将执行,这基本上就是您完成操作的方式。举例来说,我们将设置帖子的到期日期。发表后30天的帖子将到期。我们将挂在publish_post中,以便我们可以在发布帖子后立即安排我们的单个事件并开始计算。
>>设置将在30天后删除帖子的函数。
><span><span><?php </span></span><span><span>// delete_post_revisions will be call when the Cron is executed </span></span><span><span>add_action( 'delete_post_revisions', 'delete_all_post_revisions' ); </span></span><span> </span><span><span>// This function will run once the 'delete_post_revisions' is called </span></span><span><span>function delete_all_post_revisions() { </span></span><span> </span><span> <span>$args = array( </span></span><span> <span>'post_type' => 'post', </span></span><span> <span>'posts_per_page' => -1, </span></span><span> <span>// We don't need anything else other than the Post IDs </span></span><span> <span>'fields' => 'ids', </span></span><span> <span>'cache_results' => false, </span></span><span> <span>'no_found_rows' => true </span></span><span> <span>); </span></span><span> </span><span> <span>$posts = new WP_Query( $args ); </span></span><span> </span><span> <span>// Cycle through each Post ID </span></span><span> <span>foreach( (array)$posts->posts as $post_id ) { </span></span><span> </span><span> <span>// Check for possible revisions </span></span><span> <span>$revisions = wp_get_post_revisions( $post_id, array( 'fields' => 'ids' ) ); </span></span><span> </span><span> <span>// If we got some revisions back from wp_get_post_revisions </span></span><span> <span>if( is_array( $revisions ) && count( $revisions ) >= 1 ) { </span></span><span> </span><span> <span>foreach( $revisions as $revision_id ) { </span></span><span> </span><span> <span>// Do a final check on the Revisions </span></span><span> <span>if( wp_is_post_revision( $revision_id ) ) { </span></span><span> <span>// Delete the actual post revision </span></span><span> <span>wp_delete_post_revision( $revision_id); </span></span><span> <span>} </span></span><span> <span>} </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>}</span></span>
非常简单,对吗?现在,一旦帖子实际发布,我们就需要安排活动。为了完成此任务,我们需要使用wp_schedule_single_event($ timestamp,$ hook,$ args)函数,该功能获取3个参数。
>
<span><span><?php </span></span><span><span>// Make sure this event hasn't been scheduled </span></span><span><span>if( !wp_next_scheduled( 'delete_post_revisions' ) ) { </span></span><span> <span>// Schedule the event </span></span><span> <span>wp_schedule_event( time(), 'daily', 'delete_post_revisions' ); </span></span><span><span>}</span></span>
>
>您可能想知道,为什么要安排事件?有一个充分的理由,特别是如果您在插件中包括某种类似的时间表活动。>
crons存储在WP_Options表上,并简单地停用和删除插件。 WordPress仍将尝试运行您的事件,即使不再可用的插件。话虽如此,请确保您在插件或自定义实施中正确安装了整个事件。>
>未安排的cron事件相对容易,您需要知道的只是钩子的名称,何时是何时应该运行特定的cron。我们将使用WP_NEXT_SCHEDULED()来查找下一次发生的情况,只有这样我们才能使用wp_unschedule_event()。考虑到我们的第一个示例,我们将以以下方式解开事件。
>>自定义cron间隔
<span><span><?php </span></span><span><span>// Add function to register event to WordPress init </span></span><span><span>add_action( 'init', 'register_daily_revision_delete_event'); </span></span><span> </span><span><span>// Function which will register the event </span></span><span><span>function register_daily_revision_delete_event() { </span></span><span> <span>// Make sure this event hasn't been scheduled </span></span><span> <span>if( !wp_next_scheduled( 'delete_post_revisions' ) ) { </span></span><span> <span>// Schedule the event </span></span><span> <span>wp_schedule_event( time(), 'daily', 'delete_post_revisions' ); </span></span><span> <span>} </span></span><span><span>}</span></span>
<span><span><?php </span></span><span><span>// delete_post_revisions will be call when the Cron is executed </span></span><span><span>add_action( 'delete_post_revisions', 'delete_all_post_revisions' ); </span></span><span> </span><span><span>// This function will run once the 'delete_post_revisions' is called </span></span><span><span>function delete_all_post_revisions() { </span></span><span> </span><span> <span>$args = array( </span></span><span> <span>'post_type' => 'post', </span></span><span> <span>'posts_per_page' => -1, </span></span><span> <span>// We don't need anything else other than the Post IDs </span></span><span> <span>'fields' => 'ids', </span></span><span> <span>'cache_results' => false, </span></span><span> <span>'no_found_rows' => true </span></span><span> <span>); </span></span><span> </span><span> <span>$posts = new WP_Query( $args ); </span></span><span> </span><span> <span>// Cycle through each Post ID </span></span><span> <span>foreach( (array)$posts->posts as $post_id ) { </span></span><span> </span><span> <span>// Check for possible revisions </span></span><span> <span>$revisions = wp_get_post_revisions( $post_id, array( 'fields' => 'ids' ) ); </span></span><span> </span><span> <span>// If we got some revisions back from wp_get_post_revisions </span></span><span> <span>if( is_array( $revisions ) && count( $revisions ) >= 1 ) { </span></span><span> </span><span> <span>foreach( $revisions as $revision_id ) { </span></span><span> </span><span> <span>// Do a final check on the Revisions </span></span><span> <span>if( wp_is_post_revision( $revision_id ) ) { </span></span><span> <span>// Delete the actual post revision </span></span><span> <span>wp_delete_post_revision( $revision_id); </span></span><span> <span>} </span></span><span> <span>} </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>}</span></span>
>使用WordPress的cron再容易了,这是一个非常好的有趣的工具,一定可以帮助您使插件更加健壮。学习所有这些功能,并将它们通过现实世界应用程序付诸实践,这是掌握WordPress的CRON安排活动的最佳方法。
>两个功能都用于在WordPress中安排事件,有什么区别。 WP_SCHEDULE_EVENT功能用于安排重复的事件,这意味着它将按照您指定的定期时间进行运行,例如每天,每天或两次。另一方面,WP_SCHEDULE_SINGLE_EVENT用于安排一次性事件,该事件将来会在特定时间运行。重要的是要根据您是否希望事件进行一次或反复运行的正确函数很重要。
>
可能有几个原因工作不起作用。一个常见的问题是服务器的时间设置问题。如果服务器的时间未正确设置,则可能导致调度问题。另一个可能的问题是与插件或主题发生冲突。某些插件或主题可能会干扰WordPress Cron系统,从而导致故障。您的代码也可能存在错误。确保彻底测试您的代码并检查服务器设置,如果您在WordPress Cron作业方面遇到麻烦。>我如何测试我的WordPress Cron作业是否有效?>有几个测试您的WordPress Cron作业是否有效的方法。一种方法是使用WP Crontrol之类的插件,该插件使您可以查看和控制WP-Cron系统中发生的事情。另一种方法是使用调试工具。通过在wp-config.php文件中启用wp_debug,您可以看到Cron作业运行时发生的任何错误。您还可以使用PHP中的error_log函数将任何错误记录到文件中。
>
>我如何在WordPress Cron事件中解开WordPress Cron事件?您可以使用WP_UNSCHEDULE_EVENT函数解开WordPress CRON事件。此函数需要两个参数:事件的时间戳和要启动函数的操作钩。调用此功能后,指定的事件将不再发生。>
我可以使用WordPress Cron安排帖子吗?
我如何查看所有计划的WordPress Cron作业?可以使用WP Crontrol等插件查看所有计划的WordPress Cron作业。该插件提供了一个用户友好的界面,您可以在其中查看所有计划的事件,它们的间隔和下一个运行时间。您也可以使用它来添加,编辑或删除Cron作业。
是的,您可以手动运行WordPress Cron作业。您可以使用诸如WP Crontrol之类的插件来执行此操作,该插件可让您立即运行任何Cron事件。这对于测试和调试目的可能很有用。
以上是掌握WordPress Cron进行调度事件的详细内容。更多信息请关注PHP中文网其他相关文章!