Членство в WooCommerce: условно для проверки доступа к странице

У меня есть веб-сайт Wordpress Memberships, который построен на WooCommerce с плагином WooCommerce Memberships, чтобы ограничить доступ к определенным страницам только участниками.

Некоторые из этих страниц "наполняются капельным способом"... т.е. Доступ к этим страницам открывается через 3 дня после покупки и т. д. Я настроил это в WooMemberships.

Я пытаюсь просто выполнить условную проверку PHP, чтобы узнать, имеет ли текущий пользователь доступ к определенной странице.

Я нашел этот фрагмент кода в документах: wc_memberships_is_post_content_restricted()

Однако я не смог заставить его работать.

Есть ли фрагмент кода, который в основном будет выполнять оператор PHP IF о том, имеет ли текущий пользователь доступ к определенной странице (используя page ID)?

eg:

if ( current_user_has_access(page_ID) ) { DO SOMETHING } else { DON'T }

Спасибо.


person Scott    schedule 08.06.2016    source источник
comment
Спасибо за это :)   -  person Scott    schedule 09.06.2016


Ответы (3)


Вам придется заменить (в условиях):

  1. $page_id по вашему page ID номеру (например: is_page(42))
  2. $membership_plan по слагу плана ('plan_slug') или связанному с ним post ID.

Условия:

  • wc_memberships_is_post_content_restricted($page_id) => true, если $page_id убрано.
  • is_page($page_id) => true, если действительно $page_id.
  • wc_memberships_is_user_active_member( $membership_plan ) => true фактический пользователь является активным участником этого $membership_plan плана. В этом случае доступ к странице предоставляется тарифным планом пользователя.

Вы можете удалить некоторые условия, если они не нужны, и настроить их под свои нужды.

if( wc_memberships_is_post_content_restricted() && is_page($page_id) && wc_memberships_is_user_active_member( $membership_plan ) ) {

    // do something

} else {

    // don't

}

--- Обновлять ---

Единственными функциями, связанными с ограничением и (или) временным доступом, являются:

1) wc_memberships_restrict( $content, $membership_plans, $delay, $exclude_trial )
так же, как шорткод [wcm_restrict] (так что бесполезно)…

2) wc_memberships_get_user_access_time( $user_id, $target, $action, $gmt ): Параметры

$user_id  // for a logged 'user ID'
$target   : array('post' => id, 'product' => id) // content_type and content_id
$action   : 'view' or 'purchase' // Type of access (products only)<br>
$gmt =>   : true  or  false // (selection of the time zone)
// Returns user access start timestamp (in site timezone) for content or a product

Ссылка: Справочник по функциям членства в WooCommerce

person LoicTheAztec    schedule 09.06.2016
comment
Это потрясающе, спасибо. Я попробовал это, и он подтверждает, что пользователь является участником и т. Д., Однако он говорит, что у них есть доступ к страницам, к которым у них не должно быть доступа, пока не пройдет X дней... Есть ли способ проверить участник имеет доступ к определенной странице в зависимости от даты регистрации (я установил в Woo Memberships, что страницы должны отображаться только через X дней)?? Для контекста - я создаю меню, которое отображает только те страницы, к которым у них есть доступ в данный момент. - person Scott; 09.06.2016

Я занимаюсь той же проблемой на сайте StoryMoment.com (мы выпускаем серию аудио- и электронных книг для детей).

Вот как я с этим справился. Я использую следующее в шаблоне страницы, чтобы показать или скрыть элементы страницы в зависимости от доступа. wc_memberships_view_delayed_post_content будет меняться в зависимости от типа контента.

Вы можете увидеть другие параметры в файле:

класс-WC-членство-capabilities.php

<?php 

$has_access = current_user_can( 'wc_memberships_view_delayed_post_content', $post->ID );

if ($has_access) {

//do something

} else {

//do something else

}

?>
person Evan Brammer    schedule 29.09.2016
comment
ЭТО именно то, что сработало, просто реализовать! СПАСИБО! - person jampafoo; 23.11.2016
comment
Согласовано. Это очень просто и отлично работает. Просто интересно, как / возможно ли добавить членство, встроенное в сообщение с ограниченным контентом, в раздел else? - person Trevor; 24.05.2017

Я не уверен, поможет ли это, но вот мой взгляд на это. Сначала я просматриваю активное членство всех пользователей, а затем проверяю содержимое $rules, чтобы увидеть, являются ли ограниченные планы частью планов членства пользователей (in_array)

function can_user_access_content($user_id,$post_id){
    //check if there's a force public on this content    
    if(get_post_meta($post_id,'_wc_memberships_force_public',true)=='yes') return true;
    $args = array( 'status' => array( 'active' ));
    $plans = wc_memberships_get_user_memberships( $user_id, $args );
    $user_plans = array();
    foreach($plans as $plan){
        array_push($user_plans,$plan->plan_id);
    }
    $rules = wc_memberships()->get_rules_instance()->get_post_content_restriction_rules( $post_id );

    foreach($rules as $rule){
        if(in_array($rule->get_membership_plan_id(), $user_plans)){
            return true;
        }
    }       
    return false;
}

Использование будет примерно таким:

if(can_user_access_content(get_current_user_id(),$post->ID)){
    //do whatever here
}
person Paulo Vieira    schedule 12.09.2016
comment
Я добавил, если контент вообще ограничен: function can_user_access_content($user_id,$post_id){ //Check if this is restricted at all if(wc_memberships_is_post_content_restricted($post_id) === false ) return true; } - person vimes1984; 30.08.2018