web-dev-qa-db-fra.com

Code pour expirer automatiquement les messages après 30 jours

J'ai essayé les plugins disponibles dans la section plugins Wordpress, mais ils semblent échouer lamentablement. Initialement, j'ai utilisé le rôle Auto Post Expire par utilisateur, qui a fonctionné pendant un certain temps, mais pour une raison quelconque, ce n'est plus le cas.

Ce que je veux, c'est ajouter un code dans functions.php qui sera automatiquement défini en tant que brouillons ayant 30 jours de plus que leur date de publication.

J'ai le code suivant mais je ne sais pas s'il s'agit de celui que je devrais utiliser. Est-ce correct et si non, quelle est la forme correcte?

 function expire_posts () {
 global $ wpdb; 
 $ daystogo = "30"; 
 $ sql = "UPDATE wp_posts SET` post_status` = 'draft' WHERE `post_type` = 'post' ET DATEDIFF (NOW (), 'post_date`)>' $ daystogo ')"; 
} 
 
 Add_action (' wp_head ',' expire_posts '); 
2
Punct Ulica

Vous venez de déclarer la requête, mais vous ne l'avez pas exécutée!

function expire_posts() {
  global $wpdb;
  $daystogo = "30";
  $sql = "UPDATE wp_posts SET `post_status` = 'draft' WHERE `post_type` = 'post' AND DATEDIFF(NOW(), `post_date`) > '$daystogo')";
  $wpdb->query( $sql );
}

N'oubliez pas de toujours préparez vos requêtes .

Il serait également judicieux d’utiliser la fonction wp_cron() pour exécuter le code à intervalles réguliers (par exemple une fois par jour). Lorsque vous vous connectez à wp_head, la requête est exécutée chaque fois qu'un utilisateur visite une page.

1
RRikesh

Il y a quelques problèmes avec votre requête

$daystogo = "30";

$sql =
"UPDATE {$wpdb->posts}
SET post_status = 'draft'
WHERE (post_type = 'post' AND post_status = 'publish')
AND DATEDIFF(NOW(), post_date) > %d";

$wpdb->query( $wpdb->prepare( $sql, $daystogo ) );

Vous ne voulez pas supprimer les messages supprimés en les déclarant brouillon, n'est-ce pas? Et vous ne voulez vraiment pas que chaque version sauvegardée automatisée (post_status = hérite) soit un brouillon. Donc, sélectionnez uniquement les publications.

Utilisez $wpdb-prepare() pour la requête EVERY.

(Édition: chaque requête comportant des entrées de variable, c’est-à-dire. N'utilisez pas la fonction de préparation pour les requêtes entièrement statiques qui ne comportent aucune entrée de variable.)

Utilisez les variables de classe WPDB au lieu du nom de table en clair $wpdb->posts au lieu de wp_posts. Voir le Codex .

Testez votre requête avant de les coder. Utilisez quelque chose comme une interface MySQL ou MySQL-Admin . Dans votre requête SQL, il y a un ) à la fin où personne ne devrait être.

1
Ralf912