Pour une raison quelconque, je dois annuler la publication de certains messages chaque fois que Wordpress se charge. Ceci est mon code:
function af_change_post_status() {
$notpayed_posts = new WP_Query( array(
'meta_key' => '_payment',
'meta_value' => '0'
) );
foreach ($notpayed_posts as $notpayed_post) {
wp_transition_post_status( 'draft', $notpayed_post->post_status, $notpayed_post);
}
}
add_action( 'init', 'af_change_post_status' );
La requête est correcte et renvoie les articles que je veux, mais la fonction wp_transition_post_status
ne fonctionne pas et je ne sais pas pourquoi?
Cette fonction contient des appels à do_action () pour les points d'ancrage des actions de transition post-statut. L'ordre des mots dans le nom de la fonction peut prêter à confusion - il ne modifie pas le statut des publications, il appelle uniquement les actions pouvant être associées aux développeurs de plug-ins.
https://codex.wordpress.org/Function_Reference/wp_transition_post_status
Ce que vous voulez, c'est wp_update_post
, vous utilisez également WP_Query
de manière incorrecte:
`` `$ notpayed_posts = new WP_Query (array ('meta_key' => '_payment', 'meta_value' => '0'));
while ($notpayed_posts->have_posts()) {
$notpayed_posts->the_post();
wp_update_post( array(
'ID' => get_the_ID(),
'post_status' => 'draft'
));
}
wp_reset_postdata();
De plus, gardez à l'esprit que votre requête est une méta requête coûteuse/très lente. Cette méta n'est pas conçue pour la recherche ou les requêtes pour lesquelles vous recherchez des publications. Considérons un terme de taxonomie.
Vous ne faites également rien pour changer la méta par la suite, donc s'il y a 10 posts qui correspondent, alors chaque page chargée tentera de mettre à jour 10 posts, même s'ils ont déjà été mis à jour! Modifiez la méta-valeur avec update_post_meta
ou vérifiez le statut de la publication dans la requête, par exemple.
$notpayed_posts = new WP_Query( array(
'post_status' => 'publish',
'meta_key' => '_payment',
'meta_value' => '0'
) );
De plus, utilisez un travail cron, ne le faites pas à chaque chargement de page en utilisant le hook init
, c'est très mauvais pour les performances et incompatible avec la mise en cache des pages
C'est une erreur assez simple. Vous utilisez WP_Query
pour obtenir des publications, mais vous essayez ensuite d'utiliser cet objet WP_Query
en tant que tableau, mais cette classe n'implémente pas l'itérateur AFAIR.
function af_change_post_status() {
$notpayed_posts = new WP_Query( array(
'meta_key' => '_payment',
'meta_value' => '0'
) );
foreach ($notpayed_posts->posts as $notpayed_post) {
wp_transition_post_status( 'draft', $notpayed_post->post_status, $notpayed_post);
}
}
add_action( 'init', 'af_change_post_status' );
Cela devrait mieux fonctionner (si votre requête est correcte).