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中文網其他相關文章!