WordPress PaidMembershipsPro 跟踪会员日

WordPress PaidMembershipsPro track day of the membership

我正在寻找一个只允许付费会员访问某些 WP 页面并根据他们的课程日期显示内容的插件(课程有 200 天)。我使用了 PaidMembershipsPro,但我必须根据自己的需要对其进行修改,我 post 将它放在这里以防对其他人有用。

如果有人购买不同的 "membership level" 它会扩展它而不是覆盖它(我必须为 3 个付款计划制作 3 个级别,1/3/6 个月,我都给它们命名,但如果有人购买3 个月然后又一个月它会重置持续时间,因此下面有一个过滤器)。我已经在 SO 上问过了,但我没有得到答案,所以我自己编写了函数。虽然它可能有点草率。

table:

tt_subs s_id(int) s_user(int) s_months(int) s_since(timestamp)

这是将数据放入 table 的函数(它以天为单位计算持续时间,因为我所有的关卡都是以天为单位计时的)

add_action("pmpro_after_checkout", tt_AddToSubs);

 function tt_AddToSubs($user_id){ 
   global $wpdb, $current_user;
   $days = $current_user->data->membership_level->expiration_number; //get days from current order
   $months = ceil($days/30);
   $today = date('Y-m-d H:i:s',strtotime('today midnight'));
   $result = $wpdb->get_results("SELECT s_user, s_months, s_since FROM tt_subs WHERE s_user = $user_id", ARRAY_A);
   $rowCount = $wpdb->num_rows;
   if($rowCount == 0)//if it's a new user
   {
     $wpdb->insert('tt_subs',array('s_user' => $user_id,
                   's_months' => $months,'s_since' => $today),
        array('%s','%d','%s')
    );
   }
   else
   {
     $sincedays = ($result[0]['s_months']*30); //counted without the new month
     $since = strtotime("-$sincedays days", strtotime('today midnight'));
     $newsince = (strtotime($result[0]['s_since']) <= $since ? $since : strtotime($result[0]['s_since'])); //if membership has passed, shift s_since so user is back in his day
     $newsince = date('Y-m-d H:i:s', $newsince);
     $months += $result[0]['s_months']; //add months to the existing ones

     $wpdb->update('tt_subs',
     array('s_months' => $months,'s_since' => $newsince),
     array( 's_user' => $user_id ), //where array(
        '%d',   // value1
        '%s'    // value2
     ),
     array( '%d' ) //where format
     );
   }
 }

这是我发现的用于扩展成员资格而不是覆盖成员资格的过滤器

add_filter("pmpro_checkout_level", "level_extend_memberships");

 function level_extend_memberships($level)
  {
  global $pmpro_msg, $pmpro_msgt, $current_user;
  //does this level expire? are they an existing members with an expiration date?
  if(!empty($level) && !empty($level->expiration_number) && pmpro_hasMembershipLevel() && !empty($current_user->membership_level->enddate))
  {
  //get the current enddate of their membership
  $expiration_date = $current_user->membership_level->enddate;
  //calculate days left
  $todays_date = time();
  $time_left = $expiration_date - $todays_date;
  //time left?
  if($time_left > 0)
  {
  //convert to days and add to the expiration date (assumes expiration was 1 year)
  $days_left = floor($time_left/(60*60*24));
  //figure out days based on period
  if($level->expiration_period == "Day")
  $total_days = $days_left + $level->expiration_number;
  elseif($level->expiration_period == "Week")
  $total_days = $days_left + $level->expiration_number * 7;
  elseif($level->expiration_period == "Month")
  $total_days = $days_left + $level->expiration_number * 30;
  elseif($level->expiration_period == "Year")
  $total_days = $days_left + $level->expiration_number * 365;
  //update number and period
  $level->expiration_number = $total_days;
  $level->expiration_period = "Day";
  }
  }
  return $level;
}

最后是 returns 用户在

那天的功能
function tt_myDay()
{
   global $wpdb;
   if(current_user_can('add_users'))
   {
     return 999;
   }
   else
   {
     $resultq = $wpdb->get_results("SELECT s_since, s_months FROM tt_subs WHERE s_user = ".get_current_user_id(), ARRAY_A);
     $day = ceil((time() - strtotime($resultq[0]['s_since']))/86400);
     return ($day > ($resultq[0]['s_months']*30) ? ($resultq[0]['s_months']*30) : $day );
   }
}