WooCommerce 会员资格:有条件地检查页面访问权限
WooCommerce Memberships: Conditional to check a page access
我有一个基于 WooCommerce 的 Wordpress 会员网站,带有 WooCommerce 会员插件,用于将某些页面限制为仅限会员。
其中一些页面 "drip-fed"... 即。访问这些页面会在购买后 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
由计划的 slug ('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
我不确定这是否有帮助,但这是我的看法。我首先检查所有用户的活跃会员资格,然后检查内容 $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
}
我在 StoryMoment.com 处理同样的问题(我们为儿童制作音频 + 电子书故事系列)。
我就是这样处理的。我在页面模板中使用以下内容来根据访问显示或隐藏页面元素。 wc_memberships_view_delayed_post_content
会根据内容的类型而改变。
您可以在文件中看到其他选项:
class-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
}
?>
我有一个基于 WooCommerce 的 Wordpress 会员网站,带有 WooCommerce 会员插件,用于将某些页面限制为仅限会员。
其中一些页面 "drip-fed"... 即。访问这些页面会在购买后 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
由计划的 slug ('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
我不确定这是否有帮助,但这是我的看法。我首先检查所有用户的活跃会员资格,然后检查内容 $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
}
我在 StoryMoment.com 处理同样的问题(我们为儿童制作音频 + 电子书故事系列)。
我就是这样处理的。我在页面模板中使用以下内容来根据访问显示或隐藏页面元素。 wc_memberships_view_delayed_post_content
会根据内容的类型而改变。
您可以在文件中看到其他选项:
class-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
}
?>