首页 > CMS教程 > &#&按 > 掌握WordPress Cron进行调度事件

掌握WordPress Cron进行调度事件

Christopher Nolan
发布: 2025-02-19 11:51:14
原创
375 人浏览过

掌握WordPress Cron进行调度事件

钥匙要点

  • > wordpress cron是一组功能,可以在加载页面时在WordPress站点上安排任务。它与Unix的cron不同,因为它并不总是在寻找新任务,而是在页面加载时执行任务。
  • >
  • >可以安排两种类型的cron事件:单个事件,一次,再也不会运行,直到重新安排和重复发生的事件,并无限期地运行。两种类型都需要创建必须在Cron中注册的自定义“动作”。
  • >未安排事件是必不可少的,尤其是在使用插件时,即使在插件被停用或删除后,WordPress仍将继续尝试运行事件。要安排一个事件,需要知道钩子的名称和Cron Run的下一个预定时间。 可以通过连接到cron_schedules滤波器并添加自定义间隔来设置自定义的cron间隔。使用cron安排事件时,可以使用。
  • >能够在紧缩的时间表上运行某些功能对于任何CMS至关重要,WordPress具有一组功能,有助于使此过程非常简单且几乎毫不费力。
> 在本文中,我将介绍以下WordPress Cron功能:

wordpress cron与您的普通cron 掌握WordPress Cron进行调度事件有何不同

安排重复事件

    安排一个事件
  • 未安排事件
  • >指定自定义cron间隔
  • 什么是cron?
  • >您可能熟悉“ cron”一词,因为它与Unix系统中的基于时间的调度程序有关,尽管WordPress的Cron不同。它背后的主要思想是相同的。
>一些示例WordPress在内部如何使用其CRON系统检查主题和插件更新,甚至检查是否准备发表帖子。

>

wordpress cron有何不同?

>

如果您熟悉Unix的Cron,您可能会认为WordPress的Cron总是在寻找新任务并随着它们而运行它们。这远非事实,我将不久解释为什么。

加载页面时,

wordpress的cron都会运行,无论是前端还是后端页面。换句话说,当您的网站上加载页面时,WordPress将检查是否有任何任务或事件需要运行并执行它们。如果您认为这不是理想的,那么您是绝对正确的。

>

>如果您碰巧拥有一个无法获得太多流量的网站,并且您的任务需要在精确的时间执行,那么WordPress将不知道该任务是在某人访问您的网站之前到期的。即使它恰好是搜索引擎在您的网站上爬行。

>用cron

调度事件

有两种cron事件的口味,您可以使用几行代码安排:>

    >单个事件 - 仅运行一次,再也不会再重新安排了。
  • >
  • 重复事件 - 按计划运行,并设置为使用时间间隔无限期地重新出现。
安排重复事件

调度重复事件要求您创建一个自定义的“操作”,也必须在Cron上注册。 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中的本地时间。)

>
    $ recurrence - (string)(必需)该事件应重复发生一次。有效的值是“小时”,“ Twickaily”和“ Daily”。我们将看到如何以后创建自己的时间间隔。
  • >
  • $ hook - (string)(必需)要执行的操作钩的名称。
  • >
  • $ args - (array)(可选)参数传递到挂钩函数。
  • >
  • 首先,我们确保事件在之前没有安排,如果没有安排,我们继续进行安排。

请注意,您还可以将此代码段添加到操作中。如果您是插件作者,则可以设置计划的事件,以便在访问插件选项页面时运行。对于一个简单得多的例子,我们将将其与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个参数。

  • $ timestamp - (integer)(必需)您希望发生的事件发生的时间。这必须以Unix时间戳格式。
  • >
  • $ hook - (string)(必需)要执行的操作钩的名称。
  • >
  • $ args - (array)(可选)参数传递到钩函数。
这很快就会仔细研究所有这些动作和钩子的方式。

>

<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>
登录后复制
登录后复制
>我们正在使用WordPress拥有的一些时间常数来使我们的生活更轻松。有关这些常数的更多信息,您可以转到“使用时间常数”,但这是一个快速的概述:

    > minute_in_seconds = 60(秒)
  • hour_in_seconds = 60 * minute_in_seconds
  • day_in_seconds = 24 * hour_in_seconds
  • week_in_seconds = 7 * day_in_seconds
  • year_in_seconds = 365 * day_in_seconds
未安排事件

>现在您知道如何安排重复的事件和单一事件,知道如何安排这些事件也将很有用。

>

>您可能想知道,为什么要安排事件?有一个充分的理由,特别是如果您在插件中包括某种类似的时间表活动。

>

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>
登录后复制
登录后复制

>可以设置自定义的CRON间隔,您可以在使用CRON计划事件时使用这些间隔。为此,我们只需要挂入cron_schedules滤波器并添加自己的滤镜即可。让我们看一下添加一个自定义间隔集以每10分钟运行一次。

>
<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 Cron

的问题

> WP_SCHEDULE_EVENT和WP_SCHEDUE_SINGLE_EVENT?

​​

两个功能都用于在WordPress中安排事件,有什么区别。 WP_SCHEDULE_EVENT功能用于安排重复的事件,这意味着它将按照您指定的定期时间进行运行,例如每天,每天或两次。另一方面,WP_SCHEDULE_SINGLE_EVENT用于安排一次性事件,该事件将来会在特定时间运行。重要的是要根据您是否希望事件进行一次或反复运行的正确函数很重要。

>为什么我的wordpress cron作业不起作用?

>

>

可能有几个原因工作不起作用。一个常见的问题是服务器的时间设置问题。如果服务器的时间未正确设置,则可能导致调度问题。另一个可能的问题是与插件或主题发生冲突。某些插件或主题可能会干扰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_SCHEDULE_EVENT函数允许您指定首次应发生事件的时间以及应重新出现的间隔。 WP_SCHEDULE_SINGLE_EVENT函数允许您指定应发生事件的确切时间。

>

>我如何在WordPress Cron事件中解开WordPress Cron事件?

您可以使用WP_UNSCHEDULE_EVENT函数解开WordPress CRON事件。此函数需要两个参数:事件的时间戳和要启动函数的操作钩。调用此功能后,指定的事件将不再发生。

>

什么是WordPress cron Action Hook?

我可以使用WordPress Cron安排帖子吗?

是的,您可以使用WordPress Cron来安排帖子。 WordPress本身使用CRON作业来处理计划的帖子。当您设置要在将来的日期发布的帖子时,WordPress计划在指定的时间发布CRON作业以发布帖子。

>

我如何查看所有计划的WordPress Cron作业?可以使用WP Crontrol等插件查看所有计划的WordPress Cron作业。该插件提供了一个用户友好的界面,您可以在其中查看所有计划的事件,它们的间隔和下一个运行时间。您也可以使用它来添加,编辑或删除Cron作业。

>我可以手动运行WordPress Cron作业吗?

是的,您可以手动运行WordPress Cron作业。您可以使用诸如WP Crontrol之类的插件来执行此操作,该插件可让您立即运行任何Cron事件。这对于测试和调试目的可能很有用。

WordPress Cron作业和真正的Cron作业有什么区别?这不是真正的Cron工作,因为它不会在服务器级别运行。相反,当您的WordPress网站上加载页面时,它运行。另一方面,真正的CRON作业是在服务器级别安排的任务。它在特定时间运行,无论是否有人访问您的网站。尽管WordPress Cron作业更容易设置和使用,但真正的Cron作业可以更可靠和精确。

以上是掌握WordPress Cron进行调度事件的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板