首頁 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板