web-dev-qa-db-fra.com

Quel serait un PHP commande pour effacer toutes les publications de la catégorie X du mois dernier?

Je souhaite exécuter un travail cron qui effacerait de manière permanente tous les messages appartenant à une catégorie quelconque des X derniers jours (par exemple, la semaine). C'est probablement très basique, mais j'apprécierais quelques indications. Merci.

3
Tal Galili

La première étape consiste à configurer le travail cron.

La deuxième partie nécessite d'interroger la base de données pour un type de publication spécifique dont l'entrée est antérieure à 1 semaine. Nous pouvons le faire avec get_posts () et en spécifiant l'argument category et l'argument date_query.

//* If the scheduled event got removed from the cron schedule, re-add it
if( ! wp_next_scheduled( 'wpse_263953_remove_old_entries' ) ) {
  wp_schedule_event( time(), 'daily', 'wpse_263953_remove_old_entries' );
}

//* Add action to hook fired by cron event
add_action( 'wpse_263953_remove_old_entries', 'wpse_263953_remove_old_entries' );
function wpse_263953_remove_old_entries() {
  //* Get all posts older than 7 days...
  $posts = get_posts( [
    'numberposts' => -1,
    //* Use `cat` to query the category ID
    //* 'cat' => 'wpse_263953_category_id',
    //* Use `category_name` to query the category slug
    'category_name' => 'wpse_263953_category',
    'date_query' => [
      'after' => date( "Y-m-d H:i:s", strtotime( '-7 days', current_time( 'timestamp' ) ) ),
      //* For posts older than a month, use '-1 months' in strtotime()
    ],
  ]);
  //* ...and delete them
  foreach( $posts as $post ) {
    wp_delete_post( $post->ID );
  }
}
6
Nathan Johnson

Suite à la requête, vous obtiendrez la liste des ID de publication âgés de plus de 30 jours pour une catégorie donnée.

SELECT  
    p.ID as post_id, 
    term.term_id as category_id
FROM wp_posts as p 
LEFT JOIN wp_term_relationships as tr ON tr.object_id = p.ID
LEFT JOIN wp_terms as term ON tr.term_taxonomy_id = term.term_id
WHERE term.term_id = "CATEGORY ID HERE" 
    AND DATEDIFF(NOW(), p.post_date) > 30

Une fois que vous obtenez la liste, vous pouvez décider de la météo que vous souhaitez supprimer ou non.

Pour supprimer la fonction suivante après utilisation, le deuxième paramètre (TRUE) supprimera définitivement la publication. Si vous souhaitez conserver le courrier dans la corbeille (FALSE)

wp_delete_post( 'YOUR_POST_ID_HERE', TRUE);

N'oubliez pas de changer le préfixe de la table si ce n'est pas 'wp_'

2
JItendra Rana