У меня есть веб-сайт WordPress Memberships, который построен на WooCommerce с плагином WooCommerce Memberships, чтобы ограничивать некоторые страницы только для членов.
Некоторые из этих страниц «кормят» … т.е. Доступ к этим страницам открывается через 3 дня после покупки и т. Д. Я настроил это в WooMemberships.
Я пытаюсь просто сделать условную проверку PHP, чтобы увидеть, есть ли у текущего пользователя доступ к определенной странице.
Я нашел этот кусок кода в документах: wc_memberships_is_post_content_restricted()
Тем не менее, я не смог заставить его работать.
Существует ли фрагмент кода, который в основном будет делать оператор PHP IF о том, имеет ли текущий пользователь доступ к определенной странице (используя page ID
)?
например:
if ( current_user_has_access(page_ID) ) { DO SOMETHING } else { DON'T }
Благодарю.
Вам придется заменить (в условиях):
$page_id
По вашему page ID
номер (например: is_page (42))$membership_plan
слизняком плана ('plan_slug'
) или связанные post ID
,Условия:
wc_memberships_is_post_content_restricted($page_id)
=> true
если $page_id
отозван.is_page($page_id)
=> правда, если актуально $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
Я имею дело с той же проблемой в 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
}
?>
Я не уверен, поможет ли это, но вот мое мнение об этом. Сначала я просматриваю активное членство всех пользователей, а затем проверяю правила $ content, чтобы увидеть, входят ли ограниченные планы в планы членства пользователей (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
}