我有会员网站,用户必须付费才能订阅。当用户订阅他的角色成为“成员”时,现在可以发布到名为“user-profile”的自定义帖子类型
我想要做的是将此帖子类型中所有已发布帖子的状态更改为待处理状态(例如,用户角色更改为“已过期”
我尝试了这个,但似乎没有任何影响
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');
答案 0 :(得分:1)
从根本上说,您的功能应该过期所有帖子。在功能上,它是有效的,所以当你说'没有效果"时,这是令人惊讶的。
您的功能应修改以下,以提高效率(您不需要循环播放帖子)并确保您只更新相关帖子,以及确保它不会发出通知。
修订代码:
// 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 );
经过测试,我证明它有效。 然而有一些原因可能会导致它无法满足您的需求:
do_action('set_user_role')
。此钩子可能不会被称为,具体取决于您如何更改用户的角色。如果您通过仪表板转到用户的个人资料,更改角色,然后点击"保存用户",则此挂钩会被调用。 如果它不起作用,请务必准确解释您如何更改角色。