diff --git a/pages/manage-sites.php b/pages/manage-sites.php index b73e42c..340b7e7 100644 --- a/pages/manage-sites.php +++ b/pages/manage-sites.php @@ -43,7 +43,7 @@ function pmpron_manage_sites_shortcode($atts, $content=null, $code="") { if ( pmpron_checkSiteName( $sitename, $sitetitle ) ) { $blog_id = pmpron_addSite( $sitename, $sitetitle ); - if ( is_wp_error( $blog_id ) ) { + if ( is_wp_error( $blog_id ) || empty( $blog_id ) ) { $pmpro_msg = __( 'Error creating site.', 'pmpro-network' ); $pmpro_msgt = "pmpro_error"; } else { diff --git a/pmpro-network.php b/pmpro-network.php index d7aa1df..dd3e8a2 100644 --- a/pmpro-network.php +++ b/pmpro-network.php @@ -91,13 +91,8 @@ function pmpron_pmpro_checkout_boxes() if(!empty($_REQUEST['sitename'])) { - $sitename = $_REQUEST['sitename']; - $sitetitle = $_REQUEST['sitetitle']; - } - elseif(!empty($_SESSION['sitename'])) - { - $sitename = $_SESSION['sitename']; - $sitetitle = $_SESSION['sitetitle']; + $sitename = sanitize_text_field( wp_unslash( $_REQUEST['sitename'] ) ); + $sitetitle = sanitize_text_field( wp_unslash( $_REQUEST['sitetitle'] ) ); } else { $sitename = ''; @@ -182,70 +177,63 @@ function pmpron_pmpro_checkout_boxes() } add_action('pmpro_checkout_boxes', 'pmpron_pmpro_checkout_boxes'); -//update the user after checkout -function pmpron_update_site_after_checkout( $user_id, $order ) -{ - global $current_user, $current_site, $pmpro_network_non_site_levels; - - if(isset($_REQUEST['sitename'])) - { - //new site, on-site checkout - $sitename = $_REQUEST['sitename']; - $sitetitle = $_REQUEST['sitetitle']; - if(!empty($_REQUEST['blog_id'])) - $blog_id = intval($_REQUEST['blog_id']); +/** + * Update the user after checkout + * + * @since unknown + * @since TBD Site details are pulled from $_REQUEST (which PMPro core repopulates from order meta on offsite/delayed checkout returns). + * + * @param int $user_id The ID of the user who completed checkout. + * @param MemberOrder $order The order object. + */ +function pmpron_update_site_after_checkout( $user_id, $order ) { + global $pmpro_network_non_site_levels; + + // If we don't have an order, bail. + if ( empty( $order ) || empty( $order->id ) ) { + return; } - elseif(isset($_REQUEST['blog_id'])) - { - //reclaiming, on-site checkout - $blog_id = intval($_REQUEST['blog_id']); - } - elseif(isset($_SESSION['sitename'])) - { - //new site, off-site checkout - $sitename = $_SESSION['sitename']; - $sitetitle = $_SESSION['sitetitle']; - if(!empty($_SESSION['blog_id'])) - $blog_id = intval($_SESSION['blog_id']); - } - elseif(isset($_SESSION['blog_id'])) - { - //reclaiming, off-site checkout - $blog_id = intval($_SESSION['blog_id']); + + // Membership level ID not set, or completed checkout is for a non-network site level, bail. + if ( empty( $order->membership_id ) || ( is_array( $pmpro_network_non_site_levels ) && in_array( $order->membership_id, $pmpro_network_non_site_levels ) ) ) { + return; } - - $r = false; //default return value - - if(!empty($blog_id)) - { - //reclaiming, first check that this id is associated with the user - $all_blog_ids = pmpron_getBlogsForUser($user_id); - if(in_array($blog_id, $all_blog_ids)) - { - //activate the blog + + // Pull site details from $_REQUEST. For offsite/delayed checkout flows, PMPro core + // repopulates $_REQUEST from order meta via pmpro_pull_checkout_data_from_order() + // before pmpro_after_checkout fires. + $sitename = ! empty( $_REQUEST['sitename'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['sitename'] ) ) : ''; + $sitetitle = ! empty( $_REQUEST['sitetitle'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['sitetitle'] ) ) : ''; + $blog_id = ! empty( $_REQUEST['blog_id'] ) ? absint( $_REQUEST['blog_id'] ) : 0; + + // No network site details in the request, bail. + if ( empty( $sitename ) && empty( $blog_id ) ) { + return; + } + + if ( ! empty( $blog_id ) ) { + // Reclaiming, first check that this id is associated with the user. + $all_blog_ids = pmpron_getBlogsForUser( $user_id ); + if ( in_array( $blog_id, $all_blog_ids ) ) { + // Activate the blog. update_blog_status( $blog_id, 'deleted', '0' ); do_action( 'activate_blog', $blog_id ); - $r = true; - } - else - { - //uh oh, were they trying to claim someone else's blog? - $r = new WP_Error('pmpron_reactivation_failed', __('ERROR: Site reactivation failed.')); + } else { + // Someone else's blog, not reactivated. Write to order notes. + /* translators: %d: Numeric Blog ID. */ + $order->notes .= sprintf( __( 'Site reactivation failed. Blog ID: %d.', 'pmpro-network' ), $blog_id ) . "\n"; + $order->saveOrder(); + } + } elseif ( pmpron_getSiteCredits( $order->membership_id ) > 0 ) { + $blog_id = pmpron_addSite( $sitename, $sitetitle, $user_id ); + if ( is_wp_error( $blog_id ) ) { + $order->notes .= sprintf( __( 'Site creation error: %s', 'pmpro-network' ), $blog_id->get_error_message() ) . "\n"; + $order->saveOrder(); + } elseif ( empty( $blog_id ) ) { + $order->notes .= __( 'Site creation failed: User not found.', 'pmpro-network' ) . "\n"; + $order->saveOrder(); } } - elseif( ! empty( $order->membership_id ) && ! in_array( $order->membership_id, $pmpro_network_non_site_levels ) && pmpron_getSiteCredits( $order->membership_id ) > 0 ) - { - $blog_id = pmpron_addSite($sitename, $sitetitle); - if(is_wp_error($blog_id)) - $r = $blog_id; - } - - //clear session vars - unset($_SESSION['sitename']); - unset($_SESSION['sitetitle']); - unset($_SESSION['blog_id']); - - return $r; } add_action( 'pmpro_after_checkout', 'pmpron_update_site_after_checkout', 10, 2 ); @@ -355,67 +343,76 @@ function pmpron_pmpro_membership_level_after_other_settings() { } add_action( 'pmpro_membership_level_after_other_settings', 'pmpron_pmpro_membership_level_after_other_settings' ); -/* - Function to add a site. - Takes sitename and sitetitle - Returns blog_id -*/ -function pmpron_addSite($sitename, $sitetitle) -{ +/** + * Function to add a site. + * + * @since unknown + * @since TBD Added $user_id arg. + * + * @param string $sitename The name of the site to add. + * @param string $sitetitle The title of the site to add. + * @param int $user_id The user ID. + * + * @return mixed blog id (int) on success, WP_Error on blog creation failure, false if no valid user. + */ +function pmpron_addSite( $sitename, $sitetitle, $user_id = null ) { global $current_user, $current_site; - - //figure out the new domain + + // If no user ID was provided, default to the current user. + if ( empty( $user_id ) ) { + $user = $current_user; + } else { + $user = get_userdata( $user_id ); + } + + // No user, bail. + if ( empty( $user ) ) { + return false; + } + + // Figure out the new domain. $site_domain = preg_replace( '|^www\.|', '', $current_site->domain ); - if ( !is_subdomain_install() ) - { + if ( ! is_subdomain_install() ) { $site = $current_site->domain; $path = $current_site->path . $sitename; - } - else - { + } else { $site = $sitename . '.' . $site_domain; $path = $current_site->path; } - //alright create the blog - $meta = apply_filters('signup_create_blog_meta', array ('lang_id' => 'en', 'public' => 0)); - $blog_id = wpmu_create_blog($site, $path, $sitetitle, $current_user->ID, $meta); - - do_action("pmpro_network_new_site", $blog_id, $current_user->ID); + // Alright create the blog. + $meta = apply_filters( + 'signup_create_blog_meta', + array( + 'lang_id' => 'en', + 'public' => 0, + ) + ); + $blog_id = wpmu_create_blog( $site, $path, $sitetitle, $user->ID, $meta ); - if ( is_a($blog_id, "WP_Error") ) { - return new WP_Error('blogcreate_failed', __('ERROR: Site creation failed.')); + if ( is_a( $blog_id, 'WP_Error' ) ) { + return new WP_Error( 'blogcreate_failed', __( 'ERROR: Site creation failed.', 'pmpro-network' ) ); } - - //save array of all blog ids - $blog_ids = pmpron_getBlogsForUser($current_user->ID); - if(!in_array($blog_id, $blog_ids)) - { + + do_action( 'pmpro_network_new_site', $blog_id, $user->ID ); + + // Save array of all blog ids. + $blog_ids = pmpron_getBlogsForUser( $user->ID ); + if ( ! in_array( $blog_id, $blog_ids ) ) { $blog_ids[] = $blog_id; - update_user_meta($current_user->ID, "pmpron_blog_ids", $blog_ids); - - //if this is the first site, set it as the main site - if(count($blog_ids) == 1) - update_user_meta($current_user->ID, "pmpron_blog_id", $blog_id); - } - - do_action('wpmu_activate_blog', $blog_id, $current_user->ID, $current_user->user_pass, $sitetitle, $meta); - - return $blog_id; -} + update_user_meta( $user->ID, 'pmpron_blog_ids', $blog_ids ); -/* -These bits are required for PayPal Express only. -*/ -function pmpron_pmpro_paypalexpress_session_vars() -{ - //save our added fields in session while the user goes off to PayPal - $_SESSION['sitename'] = $_REQUEST['sitename']; - $_SESSION['sitetitle'] = $_REQUEST['sitetitle']; - $_SESSION['blog_id'] = $_REQUEST['blog_id']; + // If this is the first site, set it as the main site. + if ( count( $blog_ids ) === 1 ) { + update_user_meta( $user->ID, 'pmpron_blog_id', $blog_id ); + } + } + + do_action( 'wpmu_activate_blog', $blog_id, $user->ID, $user->user_pass, $sitetitle, $meta ); + + return $blog_id; } -add_action("pmpro_paypalexpress_session_vars", "pmpron_pmpro_paypalexpress_session_vars"); //require the fields and check for dupes function pmpron_pmpro_registration_checks($pmpro_continue_registration)