Php 检测当前用户是否有活动订阅

Php 检测当前用户是否有活动订阅,php,wordpress,woocommerce,orders,woocommerce-subscriptions,Php,Wordpress,Woocommerce,Orders,Woocommerce Subscriptions,我正在WooCommerce的WordPress上开发一个网站。我正在使用额外的和插件来处理我的工作 问题是,当具有“订阅方”角色的用户使用活动订阅登录并尝试在每次他/她必须选择包时发布内容时,即使他/她有活动订阅 是否有人知道如何检测用户是否有活动订阅,如果返回true,则跳过选择包的步骤 谢谢。更新(2019) 使用WooCommerce订阅的新条件函数 新的条件函数使用了更轻的代码版本(SQL查询) 基于改进的WP_查询的原始增强条件函数 以下自定义条件函数有一个可选参数$user\u

我正在WooCommerce的WordPress上开发一个网站。我正在使用额外的和插件来处理我的工作

问题是,当具有“订阅方”角色的用户使用活动订阅登录并尝试在每次他/她必须选择包时发布内容时,即使他/她有活动订阅

是否有人知道如何检测用户是否有活动订阅,如果返回true,则跳过选择包的步骤

谢谢。

更新(2019)

  • 使用WooCommerce订阅的新条件函数
  • 新的条件函数使用了更轻的代码版本(SQL查询)
  • 基于改进的WP_查询的原始增强条件函数
以下自定义条件函数有一个可选参数
$user\u id
(定义的用户id),当当前用户(或定义的用户)具有活动订阅时,将返回
true

因此,现在可以使用3种不同的方法来实现这一点(它们可以做相同的事情):

1) 使用专用条件函数:


2) 更轻的SQL查询(于2019年3月添加)也是如此:

代码位于活动子主题(或主题)的function.php文件或任何插件文件中


3) 原始增强代码,也将执行相同的操作:

function has_active_subscription( $user_id=null ) {
    // When a $user_id is not specified, get the current user Id
    if( null == $user_id && is_user_logged_in() ) 
        $user_id = get_current_user_id();
    // User not logged in we return false
    if( $user_id == 0 ) 
        return false;

    // Get all active subscriptions for a user ID
    $active_subscriptions = get_posts( array(
        'numberposts' => 1, // Only one is enough
        'meta_key'    => '_customer_user',
        'meta_value'  => $user_id,
        'post_type'   => 'shop_subscription', // Subscription post type
        'post_status' => 'wc-active', // Active subscription
        'fields'      => 'ids', // return only IDs (instead of complete post objects)
    ) );

    return sizeof($active_subscriptions) == 0 ? false : true;
}
代码位于活动子主题(或主题)的function.php文件或任何插件文件中


用法更新:

1) 当前用户的用法:

if( has_active_subscription() ){ // Current user has an active subscription 
    // do something … here goes your code

    // Example of displaying something
    echo '<p>I have active subscription</p>';
}
如果(具有活动的订阅()){//当前用户具有活动的订阅
//做点什么…这是你的代码
//显示某物的示例
echo“我有活动订阅”

; }
2) 已定义用户ID的用法:

if( has_active_subscription(26) ){ // Defined User ID has an active subscription 
    // do something … here goes your code

    // Example of displaying something
    echo '<p>User ID "26" have an active subscription</p>';
}
if(具有活动订阅(26)){//定义的用户ID具有活动订阅
//做点什么…这是你的代码
//显示某物的示例
echo'用户ID“26”具有活动订阅

; }
这段代码经过测试,可以正常工作


有关答案:


使用
wcs\u用户拥有订阅()


多亏了Loic,代码似乎在工作,但问题是当我重定向页面时,出现以下错误警告:无法修改标题信息-标题已由/home2/xxx/xxxx/wp content/themes/jobsdojo/header.php:13)在/home2/xxx/public_html/quickextra/wp includes/pluggable.php第1174行发送。请再给我一个提示可以帮上忙谢谢@Loic TheAztec我试图绕过package-selection.php这段代码很有帮助,但是如果您有大的post meta表,请注意实现。由于缺少索引,它将执行全表扫描。我刚刚修复了一个复制/粘贴此内容的站点,并且在调用get_posts之前,必须对其进行修改,以设置并检查会话变量(如果他们有活动订阅),并检查用户id是否不是0。无论用户是否登录,他们都在页面上调用此功能以显示高级内容。获取\u当前\u用户\u id如果未登录,将始终返回0。在我的更改优化到200次/秒后,站点每秒发生2k次选择。我还为元键/值添加了索引。@mtg169谢谢(这是一个旧答案)…我用一些增强功能更新了函数代码,并添加了其他两种不同的方法:一种更轻的代码版本(使用SQL查询)和另一种基于wcs_user_has_subscription()条件函数的代码版本。
if( has_active_subscription() ){ // Current user has an active subscription 
    // do something … here goes your code

    // Example of displaying something
    echo '<p>I have active subscription</p>';
}
if( has_active_subscription(26) ){ // Defined User ID has an active subscription 
    // do something … here goes your code

    // Example of displaying something
    echo '<p>User ID "26" have an active subscription</p>';
}
$has_sub = wcs_user_has_subscription( '', '', 'active' );

if ( $has_sub) {
    // User have active subscription
}