根据用户角色将帖子状态更改为待处理

时间:2016-11-14 14:53:30

标签: php wordpress

我有会员网站,用户必须付费才能订阅。当用户订阅他的角色成为“成员”时,现在可以发布到名为“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');

1 个答案:

答案 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 );

经过测试,我证明它有效。 然而有一些原因可能会导致它无法满足您的需求:

  1. 这是利用核心WordPress的do_action('set_user_role')。此钩子可能不会被称为,具体取决于您如何更改用户的角色。如果您通过仪表板转到用户的个人资料,更改角色,然后点击"保存用户",则此挂钩会被调用如果它不起作用,请务必准确解释您如何更改角色。
  2. 如果您使用的角色未被调用"成员",则无效。如有必要,请更改上面的代码(我已经使用过的"成员")以匹配您实际使用的角色。 如果它不起作用,请务必准确解释您正在使用的角色名称。
  3. "过期"不是我熟悉的帖子状态。我相信这会抑制帖子的显示,但可能不会。 如果不起作用,请务必查看数据库以查看帖子状态是否正在发生变化
  4. 如果您未在适当位置(多个)中安装此功能/挂钩,则可能无法调用此功能。