web-dev-qa-db-fra.com

Publier en masse les publications entre des dates spécifiques (par exemple, à partir d'avril 2017)?

Je dois annuler la publication (c’est-à-dire, la brouillon) de plusieurs publications d’un site, mais dans un laps de temps déterminé (c’est-à-dire qu’elles ne veulent pas que toutes les publications soient inédites, mais à des dates précises).

Dans ce cas, la date est essentiellement celle de tout article d'avril 2017 ou d'une version antérieure, qui devrait être définie pour être brouillon.

Voici le script que je commence avec ma base et l'approche que j'ai adoptée jusqu'à présent. J'ajoute une option "ajouter une action" dans ce fichier "wp-includes/plugin.php." Comment cibler une publication dans une plage de dates?

    add_action('admin_ini','custom_function');

    function custom_function(){
    $args = array('post_type'=> 'post',
         'post_status' => 'publish',
         'posts_per_page'=>-1
    );
    $published_posts = get_posts($args);

    foreach($published_posts as $post_to_draft){
       $query = array(
        'ID' => $post_to_draft->ID,
        'post_status' => 'draft',
       );
       wp_update_post( $query, true );
    }
}
1
Michael Teller

Vous pouvez le faire sans écrire de code en utilisant WP CLI en enchaînant 2 commandes:

  • la commande pour récupérer toutes les publications d'avril 2017 ou avant
  • la commande pour mettre à jour toutes les publications et définir le paramètre post_status sur draft

Récupérer toutes les publications avant avril 2017

Nous pouvons utiliser wp post list pour le faire, et nous en aurons besoin comme identifiants de publication pour les transmettre à la commande suivante. Plus de détails sur cette commande ici .

Par exemple, nous pouvons récupérer tous les articles de 2017 comme ceci:

wp post list --year="2017" --format=ids

Et tous les messages d'avril comme ceci:

wp post list --year="2017" --month="4" --format=ids

De cette façon, nous pouvons exécuter cette commande pour chaque mois de 2017 et chaque année précédent, et transmettre le résultat à la commande suivante.

Mise en brouillon

Nous pouvons le faire avec wp post update 123 où 123 est l'ID du message à modifier

wp post update 123 --post_status="draft"

Réunir les deux

Nous allons donc définir tous les messages en 2016 pour rédiger:

wp post update $(wp post list --year="2016" --format=ids) --post_status="draft"

Et 2015:

wp post update $(wp post list --year="2015" --format=ids) --post_status="draft"

Et 2014:

wp post update $(wp post list --year="2014" --format=ids) --post_status="draft"

etc

Notes générales

  • Vous voudrez le faire via WP CLI. Le faire à chaque admin_init hook ralentira le processus. S'il ne peut pas terminer ce qu'il est en train de faire avant la limite de temps impartie, votre site ne chargera jamais WP Admin
  • Les requêtes qui demandent tout sont mauvaises pour votre site et peuvent paralyser votre base de données ou déclencher des avertissements de mémoire insuffisante. Toujours chercher les messages par lots de 100 ou moins. Vous pouvez toujours exécuter une deuxième et une troisième requête, mais ne les récupérez pas toutes en même temps.
  • Ne modifiez jamais les fichiers dans wp-includes ou wp-admin. Toutes vos modifications seront écrasées lorsque WP sera mis à jour. C'est une recette pour un désastre. En 2012, un site piraté a publié des données sur les clients et lui a valu une amende de plusieurs millions de dollars, car ils avaient modifié WP Core au lieu d'utiliser des thèmes et des plugins, mais ne pouvaient pas le mettre à jour pour obtenir une nouvelle sécurité corrige et pensa que ce n'était pas grave
  • Utilisez WP_Query au lieu de get_posts, il utilise le cache par défaut et est plus proche d'une boucle de publication réelle.
  • Indentez correctement et obtenez un éditeur qui vous indentera, cela résoudra toute une classe de bugs et d'erreurs
  • Vous avez posé une question XY, vous avez proposé une solution à un problème, vous ne saviez pas comment l'implémenter et vous avez demandé comment l'implémenter. Vous auriez dû demander comment résoudre le problème. Si vous l'aviez fait, une liste complète de réponses possibles aurait pu être postée, ce qui n'est pas possible maintenant. Par exemple. utiliser pre_get_posts pour masquer les publications avant avril 2017 (votre problème est résolu, mais ce n'est pas ce que vous avez demandé)
1
Tom J Nowell