web-dev-qa-db-fra.com

tâche cron pour supprimer automatiquement les publications d'un type de publication spécifique plus ancien que x jours

Je souhaite supprimer toutes les publications d'un type de publication spécifique (dans ce cas, "vfb_entry") datant de plus de 60 jours. Le travail cron devrait être exécuté une fois par jour.

J'ai le code suivant mais il ne fonctionne pas si je déclenche le travail cron. Cependant, l'exécution de la requête dans phpMyAdmin uniquement renvoie le résultat correct. Donc, il doit y avoir un problème avec la fonction elle-même.

Quelqu'un peut-il aider s'il vous plait?

// 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("Y-m-d 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);
          }
}

Edit: Solution sans interroger mes points de vue, en utilisant simplement wp_posts et wp_postmeta et un INNER JOIN ci-dessous.

1
jackennils
// 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( "Y-m-d H:i:s", strtotime( '-60 days' ) ),
    ],
  ]);

  if( !empty($posts) ) {
    foreach( $posts as $post ) {
      wp_delete_post( $post->ID ); //remove the post from the database
    }
  }
}

Remarque: Il n'est pas nécessaire d'exécuter une requête SQL personnalisée. Cela ralentirait la requête et ce n’est pas bon non plus pour wordpress. Wordpress a déjà construit des fonctions pour tout.

// 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("Y-m-d 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);
          }
}
1
jackennils

Je souhaite supprimer toutes les publications d'un type de publication spécifique (dans ce cas, "vfb_entry") datant de plus de 60 jours. Le travail cron devrait être exécuté une fois par jour.

La première étape consiste à configurer le travail cron. Le code de la question est correct pour cette partie. Il est donc copié ci-dessous.

La deuxième partie nécessite l'interrogation de la base de données pour un type de publication spécifique dont l'entrée est antérieure à 60 jours. Nous pouvons le faire avec get_posts() et en spécifiant l'argument post_type et l'argument 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( "Y-m-d H:i:s", strtotime( '-60 days' ) ),
    ],
  ]);
  //* ...and delete them
  array_filter( function( $post ) {
    wp_delete_post( $post->ID );
  }, $posts );
}

La réponse ci-dessus interroge directement $wpdb. L'utilisation de l'abstraction get_posts() est préférable pour diverses raisons, notamment la facilité de lecture et la pérennité.

0
Nathan Johnson