admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'pc_membership_nonce' ), 'stripe_key' => $publishable_key, 'i18n' => array( 'processing' => __( 'Processing...', 'pc-membership-abc123' ), 'selectPlan' => __( 'Please select a plan', 'pc-membership-abc123' ), 'error' => __( 'An error occurred. Please try again.', 'pc-membership-abc123' ), 'success' => __( 'Success!', 'pc-membership-abc123' ), 'cancel' => __( 'Cancel Subscription', 'pc-membership-abc123' ), 'confirmCancel'=> __( 'Are you sure you want to cancel your subscription?', 'pc-membership-abc123' ), ), ) ); } private static function is_membership_page() { if ( ! is_singular() && ! is_page() ) { return false; } $options = get_option( 'pc_membership_options', array() ); $page_ids = array( isset( $options['checkout_page_id'] ) ? $options['checkout_page_id'] : 0, isset( $options['login_page_id'] ) ? $options['login_page_id'] : 0, isset( $options['register_page_id'] ) ? $options['register_page_id'] : 0, isset( $options['account_page_id'] ) ? $options['account_page_id'] : 0, isset( $options['success_page_id'] ) ? $options['success_page_id'] : 0, isset( $options['cancel_page_id'] ) ? $options['cancel_page_id'] : 0, ); return in_array( get_the_ID(), array_filter( $page_ids ) ); } public static function checkout_shortcode( $atts ) { ob_start(); self::render_checkout_page(); return ob_get_clean(); } public static function render_checkout_page() { global $wpdb; $plans = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}pc_membership_plans ORDER BY price ASC" ); if ( empty( $plans ) ) { echo '
'; esc_html_e( 'No membership plans available at this time.', 'pc-membership-abc123' ); echo '
'; return; } $options = get_option( 'pc_membership_options' ); $mode = isset( $options['mode'] ) ? $options['mode'] : 'test'; echo '
'; echo '
'; foreach ( $plans as $plan ) { $benefits = array_filter( array_map( 'trim', explode( "\n", $plan->benefits ) ) ); $billing_label = $plan->is_subscription ? sprintf( '%s / %s', pc_membership_format_price( $plan->price ), $plan->billing_interval ) : pc_membership_format_price( $plan->price ); echo '
'; echo '
'; echo '

' . esc_html( $plan->name ) . '

'; echo '
'; echo '' . esc_html( pc_membership_format_price( $plan->price ) ) . ''; if ( $plan->is_subscription ) { echo ' / ' . esc_html( $plan->billing_interval ) . ''; } echo '
'; if ( $plan->trial_days > 0 ) { echo '
'; printf( esc_html__( '%d Day Free Trial', 'pc-membership-abc123' ), $plan->trial_days ); echo '
'; } echo '
'; if ( $plan->description ) { echo '
' . wp_kses_post( $plan->description ) . '
'; } if ( ! empty( $benefits ) ) { echo '
    '; foreach ( $benefits as $benefit ) { echo '
  • ' . esc_html( $benefit ) . '
  • '; } echo '
'; } echo ''; echo '
'; } echo '
'; echo ''; echo '
'; } public static function login_shortcode( $atts ) { if ( is_user_logged_in() ) { $account_page = self::get_page_url( 'account' ); if ( $account_page ) { wp_redirect( $account_page ); exit; } } ob_start(); self::render_login_form(); return ob_get_clean(); } public static function render_login_form() { $options = get_option( 'pc_membership_options' ); $register_page = isset( $options['register_page_id'] ) ? get_permalink( $options['register_page_id'] ) : false; $account_page = self::get_page_url( 'account' ); ?>

ID ); ?>

display_name ) ); ?>

get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}pc_membership_plans WHERE id = %d", $subscription->plan_id ) ); ?>

: name ) : esc_html__( 'Unknown', 'pc-membership-abc123' ); ?>
: status ) ); ?>
: started_at ) ) ); ?>
expires_at ) : ?>
: expires_at ) ) ); ?>
status === 'active' && $plan && $plan->is_subscription ) : ?>

get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}pc_membership_subscriptions WHERE user_id = %d AND status = 'active' ORDER BY id DESC LIMIT 1", $user_id ) ); } public static function ajax_create_checkout() { check_ajax_referer( 'pc_membership_nonce', 'nonce' ); $plan_id = isset( $_POST['plan_id'] ) ? absint( $_POST['plan_id'] ) : 0; if ( ! $plan_id ) { wp_send_json_error( __( 'Invalid plan', 'pc-membership-abc123' ) ); } if ( ! class_exists( 'PC_Membership_Stripe' ) ) { require_once PC_MEMBERSHIP_PLUGIN_DIR . 'includes/stripe-handler.php'; } $result = PC_Membership_Stripe::create_checkout_session( $plan_id ); if ( is_wp_error( $result ) ) { wp_send_json_error( $result->get_error_message() ); } wp_send_json_success( array( 'url' => $result->url ) ); } public static function ajax_cancel_subscription() { check_ajax_referer( 'pc_membership_nonce', 'nonce' ); if ( ! is_user_logged_in() ) { wp_send_json_error( __( 'Must be logged in', 'pc-membership-abc123' ) ); } $subscription_id = isset( $_POST['subscription_id'] ) ? absint( $_POST['subscription_id'] ) : 0; if ( ! $subscription_id ) { wp_send_json_error( __( 'Invalid subscription', 'pc-membership-abc123' ) ); } global $wpdb; $subscription = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}pc_membership_subscriptions WHERE id = %d AND user_id = %d", $subscription_id, get_current_user_id() ) ); if ( ! $subscription ) { wp_send_json_error( __( 'Subscription not found', 'pc-membership-abc123' ) ); } if ( ! class_exists( 'PC_Membership_Stripe' ) ) { require_once PC_MEMBERSHIP_PLUGIN_DIR . 'includes/stripe-handler.php'; } $result = PC_Membership_Stripe::cancel_subscription( $subscription->stripe_subscription_id ); if ( is_wp_error( $result ) ) { wp_send_json_error( $result->get_error_message() ); } $wpdb->update( $wpdb->prefix . 'pc_membership_subscriptions', array( 'status' => 'cancelled' ), array( 'id' => $subscription_id ) ); wp_send_json_success(); } public static function ajax_update_payment_method() { check_ajax_referer( 'pc_membership_nonce', 'nonce' ); if ( ! is_user_logged_in() ) { wp_send_json_error( __( 'Must be logged in', 'pc-membership-abc123' ) ); } if ( ! class_exists( 'PC_Membership_Stripe' ) ) { require_once PC_MEMBERSHIP_PLUGIN_DIR . 'includes/stripe-handler.php'; } $result = PC_Membership_Stripe::create_portal_session(); if ( is_wp_error( $result ) ) { wp_send_json_error( $result->get_error_message() ); } wp_send_json_success( array( 'url' => $result->url ) ); } public static function ajax_login() { check_ajax_referer( 'pc_membership_login', 'nonce' ); $user_login = isset( $_POST['user_login'] ) ? sanitize_text_field( wp_unslash( $_POST['user_login'] ) ) : ''; $user_password = isset( $_POST['user_password'] ) ? $_POST['user_password'] : ''; if ( empty( $user_login ) || empty( $user_password ) ) { wp_send_json_error( __( 'Please enter username and password', 'pc-membership-abc123' ) ); } $user = wp_authenticate_username_password( null, $user_login, $user_password ); if ( is_wp_error( $user ) ) { wp_send_json_error( $user->get_error_message() ); } wp_set_auth_cookie( $user->ID, true ); $redirect_url = self::get_page_url( 'account' ); wp_send_json_success( array( 'redirect' => $redirect_url ) ); } public static function ajax_register() { check_ajax_referer( 'pc_membership_register', 'nonce' ); $user_login = isset( $_POST['user_login'] ) ? sanitize_text_field( wp_unslash( $_POST['user_login'] ) ) : ''; $user_email = isset( $_POST['user_email'] ) ? sanitize_email( wp_unslash( $_POST['user_email'] ) ) : ''; $user_password = isset( $_POST['user_password'] ) ? $_POST['user_password'] : ''; $user_password_confirm = isset( $_POST['user_password_confirm'] ) ? $_POST['user_password_confirm'] : ''; if ( empty( $user_login ) || empty( $user_email ) || empty( $user_password ) ) { wp_send_json_error( __( 'All fields are required', 'pc-membership-abc123' ) ); } if ( ! is_email( $user_email ) ) { wp_send_json_error( __( 'Invalid email address', 'pc-membership-abc123' ) ); } if ( $user_password !== $user_password_confirm ) { wp_send_json_error( __( 'Passwords do not match', 'pc-membership-abc123' ) ); } if ( strlen( $user_password ) < 8 ) { wp_send_json_error( __( 'Password must be at least 8 characters', 'pc-membership-abc123' ) ); } if ( username_exists( $user_login ) ) { wp_send_json_error( __( 'Username already exists', 'pc-membership-abc123' ) ); } if ( email_exists( $user_email ) ) { wp_send_json_error( __( 'Email already registered', 'pc-membership-abc123' ) ); } $user_id = wp_create_user( $user_login, $user_password, $user_email ); if ( is_wp_error( $user_id ) ) { wp_send_json_error( $user_id->get_error_message() ); } wp_update_user( array( 'ID' => $user_id, 'display_name' => $user_login, ) ); $user = get_userdata( $user_id ); $user->set_role( 'subscriber' ); wp_set_auth_cookie( $user_id, true ); do_action( 'pc_membership_user_registered', $user_id, $user_login, $user_email ); $redirect_url = self::get_page_url( 'account' ); wp_send_json_success( array( 'redirect' => $redirect_url ) ); } public static function ajax_update_profile() { check_ajax_referer( 'pc_membership_update_profile', 'nonce' ); if ( ! is_user_logged_in() ) { wp_send_json_error( __( 'Must be logged in', 'pc-membership-abc123' ) ); } $display_name = isset( $_POST['display_name'] ) ? sanitize_text_field( wp_unslash( $_POST['display_name'] ) ) : ''; if ( empty( $display_name ) ) { wp_send_json_error( __( 'Display name is required', 'pc-membership-abc123' ) ); } $result = wp_update_user( array( 'ID' => get_current_user_id(), 'display_name' => $display_name, ) ); if ( is_wp_error( $result ) ) { wp_send_json_error( $result->get_error_message() ); } wp_send_json_success(); } public static function handle_stripe_return() { if ( ! isset( $_GET['session_id'] ) ) { return; } $session_id = sanitize_text_field( wp_unslash( $_GET['session_id'] ) ); if ( ! class_exists( 'PC_Membership_Stripe' ) ) { require_once PC_MEMBERSHIP_PLUGIN_DIR . 'includes/stripe-handler.php'; } $session = PC_Membership_Stripe::retrieve_session( $session_id ); if ( is_wp_error( $session ) ) { return; } $success_page = self::get_page_url( 'success' ); if ( $success_page ) { wp_redirect( $success_page ); exit; } } }