2016-11-14 1 views
2

У меня есть сайт участника, на котором пользователи должны платить, чтобы подписаться. Когда пользователь подписывается, его роль становится «членом» и теперь может публиковать в пользовательский тип сообщения, называемый «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

Вы также должны выбрать столбец 'post_status' в запросе. –

+0

плагин членства wordpress –

+0

Я использую гравитационные формы и управляю подписками вручную, я хочу, если я изменил роль вручную, чтобы получить результат –

ответ

1

Фундаментально, ваша функция должна иметь истек все сообщения. Функционально это работает, поэтому, когда вы говорите «нет эффекта», это удивительно.

Ваша функция должна быть изменена ниже, чтобы быть более эффективной (вам не нужно зацикливаться на сообщениях), и чтобы вы только обновляли соответствующие сообщения, а также бросать уведомления.

Revised код:

// 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. Это усиливая do_action('set_user_role'), что является основным WordPress. Этот крючок не может быть вызван в зависимости от того, как вы меняете роль пользователя. Этот крючок действительно называется, если вы перейдете к профилю пользователя через панель управления, измените роль и нажмите «Сохранить пользователя». Если это не сработает, обязательно объясните, как именно вы меняете роли.
  2. Это не будет работать, если роль, которую вы используете, не называется «членом». Измените код выше (где я использовал «member»), если необходимо, чтобы соответствовать тому, что вы фактически используете. Если он не работает, обязательно укажите точное имя роли, которую вы используете.
  3. «Истек» не является статусом сообщения Я знаком с. Я считаю, что это приведет к тому, что сообщения не будут отображаться, но это может и не быть. Если он не работает, обязательно загляните в базу данных, чтобы узнать, изменяются ли статусы сообщений..
  4. Если вы не установите эту функцию/зацепите (в одном из многих) подходящих мест, то она не может быть вызвана.
+0

Спасибо за подробное объяснение, однако, я хочу использовать это, чтобы изменить статус сообщения в ожидании, истек срок действия роли пользователя, поэтому он должен вступить в силу, если роль пользователя изменилась до истекли, у меня есть много других разных ролей, член, участник premuim ... и т. д., поэтому роль «expired» должна быть определена в коде –

+0

. В итоге я завершаю его внутри 'if ('expired' == $ new_role) {} 'и полностью удалил' if (! in_array ('member', $ old_roles)) {} ' спасибо –

Смежные вопросы