Changer l'état des publications en en attente en fonction du rôle de l'utilisateur
J'ai un site membres où les utilisateurs doivent payer pour s'abonner. Lorsque l'utilisateur s'abonne, son rôle devient "membre" et peut désormais publier sur un type de publication personnalisé appelé "profil utilisateur"
ce que je veux faire est de changer le statut de tous les messages publiés en en attente dans ce type de message si, par exemple, le rôle de l'utilisateur est changé en "expiré"
J'ai essayé cela, mais ne semble pas avoir d'effet
function auto_expire_posts(){
global $wpdb, $wp_roles;
//get all post ids of published posts.
$post_ids = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE post_status = 'publish' ");
foreach($post_ids as $id){
$postid = $id->ID;
if ($_GET['role'] == "expired" )
{
$profile_post = array();
$profile_post['ID'] = $postid;
$profile_post['post_status'] = 'pending';
// Update the post into the database
wp_update_post( $profile_post );
}
}
}
add_action('set_user_role', 'auto_expire_posts');
Fondamentalement, votre fonction aurait dû expiré tous les messages . Fonctionnellement, cela fonctionne, donc quand vous dites "aucun effet", c'est surprenant.
Votre fonction doit être modifiée par - dessous, afin d'être plus efficace (vous n'avez pas besoin de boucler sur les poteaux) et pour vous assurer de mettre à jour uniquement les messages pertinents, ainsi que d' assurer qu'il ne jette pas des avis.
Code révisé:
// This action passes 3 parameters, so let's accept them - $user_id, $new_role, $old_roles
function auto_expire_posts( $user_id, $new_role, $old_roles ) {
// If the user didn't USED to be a member, then no need to do anything
if ( ! in_array( 'member', $old_roles ) ) {
return;
}
global $wpdb;
// Set the array of values to update
$update = array(
'post_status' => 'expired'
);
// Set the array that defines the "WHERE" clause
// WHERE is ONLY published posts that are authored by the specified user
$where = array(
'post_status' => 'publish',
'post_author' => $user_id
);
// $updated will contain the number of posts changed
$updated = $wpdb->update( $wpdb->posts, $update, $where );
}
// Ensure the add_action passes the 3 parameters through (10 is the priority, 3 is the number of parameters)
add_action( 'set_user_role', 'auto_expire_posts', 10, 3 );
Ceci est testé, et j'ai prouvé que cela fonctionne. Cependant , il y a quelques raisons pour lesquelles vous trouverez peut - être qu'il ne fait pas ce que vous voulez:
- Ceci est le tire parti
do_action('set_user_role')
qui est WordPress cœur. Ce hook peut ne pas être appelé selon la façon dont vous modifiez le rôle de l'utilisateur. Ce crochet ne s'appelle si vous allez au profil de l' utilisateur à travers le tableau de bord, de changer le rôle et cliquez sur « Enregistrer l' utilisateur ». Si cela ne fonctionne pas, assurez-vous d'expliquer exactement comment vous modifiez les rôles. - Cela ne fonctionnera pas si le rôle que vous utilisez n'est pas appelé "membre". Modifiez le code ci-dessus (où j'ai utilisé "membre") si nécessaire pour qu'il corresponde au rôle que vous utilisez réellement. Si cela ne fonctionne pas, assurez-vous d'expliquer exactement le nom du rôle que vous utilisez.
- "expiré" n'est pas un statut de publication que je connais. Je pense que cela supprimera l'affichage des messages, mais ce n'est peut-être pas le cas. Si cela ne fonctionne pas, assurez-vous de regarder dans la base de données pour voir si les statuts des publications changent .
- Si vous n'installez pas cette fonction / crochet dans (l'un des nombreux) emplacements appropriés, il se peut qu'elle ne soit pas appelée.