在分配用户的辅助角色的X天后使其过期

时间:2015-10-17 作者:Pete

下面的代码片段将用户的Easy Digital Download(EDD)下载付款链接到为该用户分配辅助用户角色。

根据下面的示例。。。

如果用户购买了下载ID为340的EDD下载,则该用户将被分配一个“买方”的辅助用户角色。。。或者,如果用户购买了下载ID为240的EDD下载,则该用户将被分配一个“other\\u role”的辅助用户角色我希望在EDD支付成功后X天内,从每个用户中取消分配每个辅助用户角色。

function pw_edd_run_when_purchase_complete( $payment_id, $new_status, $old_status ) {
        if ( $old_status == \'publish\' || $old_status == \'complete\' ) {
            return;
        } // Make sure that payments are only completed once

        // Make sure the payment completion is only processed when new status is complete
        if ( $new_status != \'publish\' && $new_status != \'complete\' ) {
            return;
        }

        $downloads = edd_get_payment_meta_downloads( $payment_id );
        $user_id   = edd_get_payment_user_id( $payment_id );

        if ( is_array( $downloads ) ) {
            // Increase purchase count and earnings
            foreach ( $downloads as $download ) {
                $user = new WP_User( $user_id );
                if(!$user )
                    continue;

                if( $download[\'id\'] == 340 ) {
                     // Add custom role
                     // Change 340 to the download id of the product that a certain role corresponds
                    $user->add_role( \'buyer\' );
                    //also change buyer depending on your role that you created in User Role Editor


                } elseif( $download[\'id\'] == 240 ) {
                     // Add custom role
                      // Change 340 to the download id of the product that a certain role corresponds
                    $user->add_role( \'other_role\' );
                    //also change other_role depending on your role that you created in User Role Editor
                }
            }
        }
    }

    add_action( \'edd_update_payment_status\', \'pw_edd_run_when_purchase_complete\', 100, 3 );

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

作为cron作业的替代,您可以使用“及时”删除角色。

i、 e.当用户登录时,您可以检查其是否具有要过期的角色,将当前日期与下载日期核对,并相应地更新用户。

这假设您能够获取(至少)用户最后一次下载的日期或时间戳。

我不熟悉EDD,但这是一个概念代码教授:

add_action( \'wp_login\', function($username, $user) {

   $toExpire = [ \'buyer\', \'other_role\' ];

   $toRemove = array_intersect($user->roles, $toExpire);

   if (count($user->roles) < 2 || empty($toRemove)) {
     // nothing to do if the user has just 1 role or none of the roles you want to expire
     return;
   }

   // the function below does NOT exists
   // I think in EDD you should be able to get the date or timestamp of an user last download
   $downloadTimestamp = get_last_download_timestamp_for_user($user->ID);

   $dayLimit = 30 * DAY_IN_SECONDS; // expire after 30 days

   if ((time() - $dayLimit) < $paymentTimestamp) {
     // do nothing if not enough time passed
     return;
   }

   if (! array_diff($toExpire, $toRemove)) {
     // if an user has ONLY roles that might expire, keep the first role
     array_shift($toRemove);
   }

   // remove expired roles
   foreach($toRemove as $role) {
     $user->remove_role($role);
   }


}, 1, 2);
这样做不需要设置cron作业,而且更容易实现。

但是,使用此方法,您可能会在系统中看到具有“过期”角色的用户,因为他们在角色过期后没有登录。如果您有(或想要)这方面的统计数据,您需要将其考虑在内。

SO网友:Luke Seall

您需要使用wp_cron 作用

我将设置一个自定义用户字段,其中包含添加辅助角色的日期。然后,当cron作业启动时,将该日期与今天的日期进行核对。如果到期,则删除辅助用户角色。

你是这个意思吗?

相关推荐