PHP - Как проверить, верна ли переменная db для любого из блогов пользователей в мультисайте WordPress

У меня есть многосайтовая установка WordPress с более чем 100 пользователями с блогами. Некоторые пользователи имеют более одного блога.

Пользователи могут платить за свои блоги (считайте это сценарием пожертвований) или они могут выбрать бесплатный блог. Если у них есть бесплатный блог, то в wp_Blog-ID_options есть переменная с именем is_free_site, и для нее установлено значение 1. (Blog-ID относится к блогу пользователя)

Если пользователь платит за свой сайт, is_free_site либо будет установлено значение 0, либо переменная вообще не будет существовать в базе данных. Смотрите скриншот:

http://www.awesomescreenshot.com/image/1657353/0238f2bf2d49f0b165170be6c64ba3a3

Я пытаюсь написать функцию с именем does_user_pay, которая будет проверять, платит ли текущий пользователь, вошедший в систему, за какой-либо из своих сайтов, и если он это делает, она возвращает true. Это сделано для того, чтобы я мог скармливать премиум-контент тем, кто решит платить.

Так, например, у пользователя А может быть 2 сайта, один из которых он платит, а другой нет, поэтому does_user_pay() должно быть правдой.

У пользователя Б может быть 1 сайт, за который он не платит, so does_user_pay() будет ложным.

у пользователя C может быть 1 сайт, за который он платит, поэтому does_user_pay() будет правдой.

Я кодирую это в пользовательский плагин, вот что у меня есть до сих пор:

function does_user_pay() {
    global $current_user;
    $user_id = get_current_user_id();
    $user_blogs = get_blogs_of_user($user_id);

    // Need to write a function here that checks if any of the user blogs are paid for

    if(is_user_logged_in() && USER_HAS_PAID_SITE) {
        return true;
    } else {
        return false;
    }
}

Любая помощь могла бы быть полезна


person Sam Skirrow    schedule 30.09.2016    source источник


Ответы (1)


Вы можете сделать эту проверку следующим образом (при условии, что пользователь зарегистрирован и его идентификатор хранится в $user_id):

$blogs = get_blogs_of_user($user_id); // array with all user blogs
foreach($blogs as $blog){
    switch_to_blog($blog->userblog_id); // switch the blog
    $is_free_site = get_option('is_free_site', 0); // get the option value (if not exists, so the user paid, we'll get 0)           
    restore_current_blog(); // it's important to restore after a switch blog

    if($is_free_site == 0) return true;  // found a paid blog
}

return false; // not found a paid blog
person Umberto    schedule 30.09.2016
comment
Можем ли мы добавить is_user_logged_in() после $is_free_site == 0, чтобы избавиться от предположения, что пользователь вошел в систему правильно? - person Sam Skirrow; 30.09.2016
comment
я думаю, что if(!is_user_logged_in()) return false; может быть первой строкой функции - person Umberto; 30.09.2016
comment
Работает как удовольствие!! Спасибо - хотя мне кажется, что это немного замедляет работу моего сайта - хотя может быть из-за моего интернет-соединения - как вы думаете, это будет довольно ресурсоемкий фрагмент кода? - person Sam Skirrow; 30.09.2016