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 '';
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 );
?>
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;
}
}
}