231 lines
9.7 KiB
PHP
231 lines
9.7 KiB
PHP
<?php
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) exit;
|
|
|
|
if( !is_plugin_active( 'paid-memberships-pro/paid-memberships-pro.php' ) ){
|
|
return;
|
|
}
|
|
|
|
if( substr( PMPRO_VERSION, 0, 1 ) == "2" )
|
|
return;
|
|
|
|
class ACUI_PMPro{
|
|
var $fields;
|
|
|
|
function __construct(){
|
|
$this->fields = array(
|
|
"membership_id",
|
|
"membership_code_id",
|
|
"membership_discount_code",
|
|
"membership_initial_payment",
|
|
"membership_billing_amount",
|
|
"membership_cycle_number",
|
|
"membership_cycle_period",
|
|
"membership_billing_limit",
|
|
"membership_trial_amount",
|
|
"membership_trial_limit",
|
|
"membership_status",
|
|
"membership_startdate",
|
|
"membership_enddate",
|
|
"membership_subscription_transaction_id",
|
|
"membership_payment_transaction_id",
|
|
"membership_order_status",
|
|
"membership_gateway",
|
|
"membership_affiliate_id",
|
|
"membership_timestamp"
|
|
);
|
|
}
|
|
|
|
function bootstrap(){
|
|
add_filter( 'acui_restricted_fields', array( $this, 'fields' ), 10, 1 );
|
|
add_action( 'acui_documentation_after_plugins_activated', array( $this, 'doc' ) );
|
|
add_action( 'acui_post_import_single_user', array( $this, 'import' ), 10, 3 );
|
|
}
|
|
|
|
function fields( $acui_restricted_fields ) {
|
|
return array_merge( $acui_restricted_fields, $this->fields );
|
|
}
|
|
|
|
function doc(){
|
|
?>
|
|
<tr valign="top">
|
|
<th scope="row"><?php _e( "Paid Membership Pro v3 is activated", 'import-users-from-csv-with-meta' ); ?></th>
|
|
<td>
|
|
<?php _e( "You can use the columns in the CSV in order to import data from Paid Membership Pro plugin.", 'import-users-from-csv-with-meta' ); ?>.
|
|
<ul style="list-style:disc outside none; margin-left:2em;">
|
|
<?php foreach ( acui_pmpro_fields() as $key => $value): ?>
|
|
<li><?php echo $value; ?></li>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<?php
|
|
}
|
|
|
|
function import( $headers, $row, $user_id ){
|
|
global $wpdb;
|
|
|
|
$keys = $this->fields;
|
|
$columns = array();
|
|
|
|
foreach ( $keys as $key ) {
|
|
$pos = array_search( $key, $headers );
|
|
|
|
if( $pos !== FALSE ){
|
|
$columns[ $key ] = $pos;
|
|
$$key = $row[ $columns[ $key ] ];
|
|
}
|
|
}
|
|
|
|
wp_cache_delete($user_id, 'users');
|
|
$user = get_userdata($user_id);
|
|
|
|
// Fix date formats.
|
|
if ( ! empty( $membership_startdate ) ) {
|
|
$membership_startdate = date( 'Y-m-d H:i:s', strtotime( $membership_startdate, current_time( 'timestamp' ) ) );
|
|
} else {
|
|
$membership_startdate = current_time( 'mysql' );
|
|
}
|
|
|
|
if ( ! empty( $membership_enddate ) ) {
|
|
$membership_enddate = date( 'Y-m-d H:i:s', strtotime( $membership_enddate, current_time( 'timestamp' ) ) );
|
|
} else {
|
|
$membership_enddate = 'NULL';
|
|
}
|
|
|
|
if ( ! empty( $membership_timestamp ) ) {
|
|
$membership_timestamp = date( 'Y-m-d H:i:s', strtotime($membership_timestamp, current_time( 'timestamp' ) ) );
|
|
}
|
|
|
|
if ( ! empty( $membership_discount_code ) && empty( $membership_code_id ) ) {
|
|
$membership_code_id = $wpdb->get_var(
|
|
$wpdb->prepare( "
|
|
SELECT id
|
|
FROM $wpdb->pmpro_discount_codes
|
|
WHERE `code` = %s
|
|
LIMIT 1
|
|
", $membership_discount_code )
|
|
);
|
|
}
|
|
|
|
// Check whether the member may already have been imported.
|
|
if( pmpro_hasMembershipLevel( $membership_id, $user_id ) ){
|
|
return;
|
|
}
|
|
|
|
// Look up discount code.
|
|
if ( ! empty( $membership_discount_code ) && empty( $membership_code_id ) ) {
|
|
$membership_code_id = $wpdb->get_var( "SELECT id FROM $wpdb->pmpro_discount_codes WHERE `code` = '" . esc_sql( $membership_discount_code ) . "' LIMIT 1" );
|
|
}
|
|
|
|
// Look for a subscription transaction id and gateway.
|
|
$membership_subscription_transaction_id = $user->import_membership_subscription_transaction_id;
|
|
$membership_payment_transaction_id = $user->import_membership_payment_transaction_id;
|
|
$membership_order_status = $user->import_membership_order_status;
|
|
$membership_affiliate_id = $user->import_membership_affiliate_id;
|
|
$membership_gateway = $user->import_membership_gateway;
|
|
|
|
if( !empty( $membership_subscription_transaction_id ) && ( $membership_status == 'active' || empty( $membership_status ) ) && !empty( $membership_enddate ) ){
|
|
return;
|
|
}
|
|
|
|
// Process level changes if membership_id is set.
|
|
if ( isset( $membership_id ) && ( $membership_id === '0' || ! empty( $membership_id ) ) ) {
|
|
// Cancel all memberships if membership_id is set to 0.
|
|
if ( $membership_id === '0' ) {
|
|
pmpro_changeMembershipLevel( 0, $user_id );
|
|
} else {
|
|
// Give the user the membership level.
|
|
$custom_level = array(
|
|
'user_id' => $user_id,
|
|
'membership_id' => $membership_id,
|
|
'code_id' => $membership_code_id,
|
|
'initial_payment' => $membership_initial_payment,
|
|
'billing_amount' => $membership_billing_amount,
|
|
'cycle_number' => $membership_cycle_number,
|
|
'cycle_period' => $membership_cycle_period,
|
|
'billing_limit' => $membership_billing_limit,
|
|
'trial_amount' => $membership_trial_amount,
|
|
'trial_limit' => $membership_trial_limit,
|
|
'status' => $membership_status,
|
|
'startdate' => $membership_startdate,
|
|
'enddate' => $membership_enddate
|
|
);
|
|
|
|
if ( ! pmpro_changeMembershipLevel( $custom_level, $user_id ) ) {
|
|
return;
|
|
}
|
|
|
|
// If membership was in the past make it inactive.
|
|
if($membership_status === "inactive" || (!empty($membership_enddate) && $membership_enddate !== "NULL" && strtotime($membership_enddate, current_time('timestamp')) < current_time('timestamp')))
|
|
{
|
|
$sqlQuery = "UPDATE $wpdb->pmpro_memberships_users SET status = 'inactive' WHERE user_id = '" . $user_id . "' AND membership_id = '" . $membership_id . "'";
|
|
$wpdb->query($sqlQuery);
|
|
$membership_in_the_past = true;
|
|
}
|
|
|
|
if($membership_status === "active" && (empty($membership_enddate) || $membership_enddate === "NULL" || strtotime($membership_enddate, current_time('timestamp')) >= current_time('timestamp')))
|
|
{
|
|
$sqlQuery = $wpdb->prepare("UPDATE {$wpdb->pmpro_memberships_users} SET status = 'active' WHERE user_id = %d AND membership_id = %d ORDER BY id DESC LIMIT 1", $user_id, $membership_id);
|
|
$wpdb->query($sqlQuery);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This logic adds an order for two specific cases:
|
|
* - So the gateway can locate the correct user when new subscription payments are received (importing active subscriptions), or
|
|
* - So the discount code use (if imported) can be tracked.
|
|
*/
|
|
|
|
// Are we creating an order? Assume no.
|
|
$create_order = false;
|
|
|
|
// Create an order if we have both a membership_subscription_transaction_id and membership_gateway.
|
|
if ( ! empty( $membership_subscription_transaction_id ) && ! empty( $membership_gateway ) ) {
|
|
$create_order = true;
|
|
}
|
|
|
|
// Create an order to track the discount code use if we have a membership_code_id.
|
|
if ( ! empty( $membership_code_id ) ) {
|
|
$create_order = true;
|
|
}
|
|
|
|
// Create the order.
|
|
if ( $create_order ) {
|
|
$order = new MemberOrder();
|
|
$order->user_id = $user_id;
|
|
$order->membership_id = $membership_id;
|
|
$order->InitialPayment = $membership_initial_payment;
|
|
$order->payment_transaction_id = $membership_payment_transaction_id;
|
|
$order->subscription_transaction_id = $membership_subscription_transaction_id;
|
|
$order->affiliate_id = $membership_affiliate_id;
|
|
$order->gateway = $membership_gateway;
|
|
|
|
if ( ! empty( $membership_order_status ) ) {
|
|
$order->status = $membership_order_status;
|
|
} elseif ( ! empty( $membership_in_the_past ) ) {
|
|
$order->status = 'cancelled';
|
|
} else {
|
|
$order->status = 'success';
|
|
}
|
|
|
|
$order->saveOrder();
|
|
|
|
// Maybe update timestamp of order if the import includes the membership_timestamp.
|
|
if(!empty($membership_timestamp))
|
|
{
|
|
$timestamp = strtotime($membership_timestamp, current_time('timestamp'));
|
|
$order->updateTimeStamp(date("Y", $timestamp), date("m", $timestamp), date("d", $timestamp), date("H:i:s", $timestamp));
|
|
}
|
|
}
|
|
|
|
// Add code use if we have the membership_code_id and there is an order to attach to.
|
|
if(!empty($membership_code_id) && !empty($order) && !empty($order->id))
|
|
$wpdb->query("INSERT INTO $wpdb->pmpro_discount_codes_uses (code_id, user_id, order_id, timestamp) VALUES('" . esc_sql($membership_code_id) . "', '" . esc_sql($user_id) . "', '" . intval($order->id) . "', now())");
|
|
|
|
}
|
|
}
|
|
|
|
$acui_pmpro = new ACUI_PMPro();
|
|
$acui_pmpro->bootstrap();
|