Intereting Posts
Как показать только дочерние категории с помощью the_category (); Получение идентификатора страницы внутри цикла Включить выдержки из отрывка в теме wordpress двадцать тринадцать Короткое обозначение динамической таксономии многократного использования Отображение страниц в WordPress с одинаковыми сообщениями на каждой странице Требование вызова («../../../ wp-blog-header.php») приводит к ошибке 404? Как создать поля Repeater с помощью дополнительных пользовательских полей? Проблемы с jQuery UI Tools (Flowplayer) Архив пользовательских сообщений типа по дате (хранится как метазначение) WP3.1 Как разрешить определенной роли, такой как Contributor, иметь возможность просматривать только ожидающие комментарии и одобрять их? body_class (); не работает с bootstrap navbar fixed top? Как сделать плагин Broadcast распространять изображения на несколько сайтов? Как перенаправить / искать / в? S = Есть ли фильтр get_post (s), который может полностью или полностью изменить выход? Объектно-ориентированный плагин не работает

Задача cron для автоматического удаления сообщений определенного типа сообщений старше x дней

Я хочу удалить все сообщения определенного типа сообщений (в данном случае «vfb_entry»), которые старше 60 дней. Задача cron должна выполняться один раз в день.

У меня есть следующий код, но он не работает, если я запускаю работу cron. Однако запуск только запроса в phpMyAdmin возвращает правильный результат. Так что проблема с самой fuction.

Кто-нибудь может помочь?

// Cron Job to Delete VFB Entries older than 60 days if(!wp_next_scheduled( 'remove_old_vfb_entries')){ wp_schedule_event(time(), 'daily', 'remove_old_vfb_entries'); } add_action('remove_old_vfb_entries', 'myd_remove_old_vfb_entries'); // Build the function function myd_remove_old_vfb_entries(){ global $wpdb; // Set max post date and post_type name $date = date("Ymd H:i:s", strtotime('-60 days')); $post_type = 'vfb_entry'; // Build the query // Only select VFB Entries from LFG or LFM Form $query = " SELECT $wpdb->posts.ID FROM $wpdb->posts WHERE post_type = '$post_type' AND post_status = 'publish' AND post_date < '$date' AND ($wpdb->posts.ID IN (SELECT entry_id FROM wp_postmeta_lfg4 WHERE post_id IS NOT NULL) OR $wpdb->posts.ID IN (SELECT entry_id FROM wp_postmeta_lfm3 WHERE post_id IS NOT NULL)) ORDER BY post_modified DESC "; $results = $wpdb->get_results($query); foreach($results as $post){ // Let the WordPress API clean up the entire post trails wp_delete_post( $post->ID, true); } } 

Изменить: решение без запроса моих просмотров, просто используя wp_posts и wp_postmeta и INNER JOIN ниже.

Solutions Collecting From Web of "Задача cron для автоматического удаления сообщений определенного типа сообщений старше x дней"

 // Cron Job to Delete VFB Entries older than 60 days if(!wp_next_scheduled( 'remove_old_vfb_entries')){ wp_schedule_event(time(), 'daily', 'remove_old_vfb_entries'); } add_action('remove_old_vfb_entries', 'myd_remove_old_vfb_entries'); // Build the function function myd_remove_old_vfb_entries(){ global $wpdb; // Set max post date and post_type name $date = date("Ymd H:i:s", strtotime('-60 days')); $post_type = 'vfb_entry'; // Build the query // Only Delete Entries from Form 5 and 8 $query = " SELECT $wpdb->posts.ID FROM $wpdb->posts INNER JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id WHERE post_type = '$post_type' AND post_status = 'publish' AND $wpdb->postmeta.meta_key = '_vfb_form_id' AND ($wpdb->postmeta.meta_value = 5 OR $wpdb->postmeta.meta_value = 8) AND post_date < '$date' "; $results = $wpdb->get_results($query); foreach($results as $post){ // Let the WordPress API clean up the entire post trails wp_delete_post( $post->ID, true); } } 
 // add the schedule event if it has been removed if( ! wp_next_scheduled( 'mg_remove_old_entries' ) ) { wp_schedule_event( time(), 'daily', 'mg_remove_old_entries' ); //run the event daily } // action hooked to fired with wordpress cron job add_action( 'mg_remove_old_entries', 'mg_remove_old_entries' ); function mg_remove_old_entries() { $posts = get_posts( [ 'numberposts' => -1, 'post_type' => 'vfb_entry', 'date_query' => [ // get all the posts from the database which are older than 60 days 'before' => date( "Ymd H:i:s", strtotime( '-60 days' ) ), ], ]); if( !empty($posts) ) { foreach( $posts as $post ) { wp_delete_post( $post->ID ); //remove the post from the database } } } 

Примечание. Нет необходимости запускать какой-либо пользовательский SQL-запрос. Это сделает запрос медленным, а также не подходит для wordpress. WordPress уже имеет встроенные функции для всего.

Я хочу удалить все сообщения определенного типа сообщений (в данном случае «vfb_entry»), которые старше 60 дней. Задача cron должна выполняться один раз в день.

Первым шагом является создание задания cron. Код в вопросе правильный для этой части, поэтому он в основном скопирован ниже.

Вторая часть требует запроса базы данных для определенного типа сообщения, где запись старше 60 дней. Мы можем сделать это с помощью get_posts() и указать аргумент date_query аргумент date_query .

 //* If the scheduled event got removed from the cron schedule, re-add it if( ! wp_next_scheduled( 'wpse_213720_remove_old_entries' ) ) { wp_schedule_event( time(), 'daily', 'wpse_213720_remove_old_entries' ); } //* Add action to hook fired by cron event add_action( 'wpse_213720_remove_old_entries', 'wpse_213720_remove_old_entries' ); function wpse_213720_remove_old_entries() { //* Get all the custom post type entries older than 60 days... $posts = get_posts( [ 'numberposts' => -1, 'post_type' => 'wpse_262471_post_type', 'date_query' => [ 'before' => date( "Ymd H:i:s", strtotime( '-60 days' ) ), ], ]); //* ...and delete them array_filter( function( $post ) { wp_delete_post( $post->ID ); }, $posts ); } 

Ответ выше напрямую запрашивает $wpdb . Использование get_posts() лучше по целому ряду причин, включая простоту чтения и будущую проверку.