-
-
Save labsecrets/3065164 to your computer and use it in GitHub Desktop.
Adding Shipping Address to Paid Memberships Pro
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Plugin Name: PMPro Shipping | |
Plugin URI: https://gist.github.com/gists/1894897/ | |
Description: Add shipping to the checkout page and other updates. | |
Version: .2.1 | |
Author: Stranger Studios | |
Author URI: http://www.strangerstudios.com | |
Note that this plugin requires PMPro 1.3.19 or higher to function fully. | |
*/ | |
//add a shipping address field to the checkout page with "sameas" checkbox | |
function my_pmpro_checkout_boxes() | |
{ | |
global $pmpro_states, $sfirstname, $slastname, $saddress1, $saddress2, $scity, $sstate, $szipcode, $shipping_address, $pmpro_requirebilling; | |
?> | |
<h2 id="userlogin">Shipping Address</h2> | |
<p style="margin-left:130px; "><input type="checkbox" id="sameasbilling" name="sameasbilling" value="1" <?php if(!empty($sameasbilling)) { ?>checked="checked"<?php } ?> />Ship to the billing address used above. </p> | |
<div id="shipping-fields"> | |
<div> | |
<label for="sfirstname"><span class="red">*</span>First Name</label> | |
<input id="sfirstname" name="sfirstname" type="text" class="input" size="20" value="<?php echo esc_attr($sfirstname);?>" /> | |
</div> | |
<div> | |
<label for="slastname"><span class="red">*</span>Last Name</label> | |
<input id="slastname" name="slastname" type="text" class="input" size="20" value="<?php echo esc_attr($slastname);?>" /> | |
</div> | |
<div> | |
<label for="saddress1"><span class="red">*</span>Address 1</label> | |
<input id="saddress1" name="saddress1" type="text" class="input" size="20" value="<?php echo esc_attr($saddress1);?>" /> | |
</div> | |
<div> | |
<label for="saddress2">Address 2</label> | |
<input id="saddress2" name="saddress2" type="text" class="input" size="20" value="<?php echo esc_attr($saddress2);?>" /> <small class="lite">(optional)</small> | |
</div> | |
<div> | |
<label for="scity_state_zip"><span class="red">*</span>City, State Zip</label> | |
<input id="scity" name="scity" type="text" class="input" size="14" style="width: 125px;" value="<?php echo esc_attr($scity)?>" />, | |
<?php /* | |
<input id="sstate" name="sstate" type="text" class="input" size="2" value="<?php echo esc_attr($sstate)?>" /> | |
*/ ?> | |
<select name="sstate"> | |
<option value="">--</option> | |
<?php | |
$sstate = get_user_meta($user->ID, 'pmpro_sstate', true); | |
foreach($pmpro_states as $ab => $st) | |
{ | |
?> | |
<option value="<?=$ab?>" <?php if($ab == $sstate) { ?>selected="selected"<?php } ?>><?=$st?></option> | |
<?php } ?> | |
</select> | |
<input id="szipcode" name="szipcode" type="text" class="input" size="5" style="width: 75px" value="<?php echo esc_attr($szipcode)?>" /> | |
</div> | |
</div> | |
<?php if($pmpro_requirebilling) { ?> | |
<script> | |
jQuery('#sameasbilling').change(function() { | |
if(jQuery('#sameasbilling').attr('checked')) | |
{ | |
jQuery('#shipping-fields').hide(); | |
} | |
else | |
{ | |
jQuery('#shipping-fields').show(); | |
} | |
}); | |
</script> | |
<?php } ?> | |
<?php | |
} | |
add_action("pmpro_checkout_after_billing_fields", "my_pmpro_checkout_boxes"); | |
//update a user meta value on checkout | |
function my_pmpro_after_checkout($user_id) | |
{ | |
if(!empty($_REQUEST['sameasbilling'])) | |
$sameasbilling = true; //we'll get the fields further down below | |
elseif(!empty($_REQUEST['saddress1'])) | |
{ | |
//grab the fields entered by the user at checkout | |
$sfirstname = $_REQUEST['sfirstname']; | |
$slastname = $_REQUEST['slastname']; | |
$saddress1 = $_REQUEST['saddress1']; | |
if(!empty($_REQUEST['saddress2'])) { | |
$saddress2 = $_REQUEST['saddress2']; | |
} | |
$scity = $_REQUEST['scity']; | |
$sstate = $_REQUEST['sstate']; | |
$szipcode = $_REQUEST['szipcode']; | |
} | |
elseif(!empty($_SESSION['sameasbilling'])) | |
{ | |
//coming back from PayPal. same as billing | |
$sameasbilling = true; | |
unset($_SESSION['sameasbilling']); | |
} | |
elseif(!empty($_SESSION['saddress1'])) | |
{ | |
//coming back from PayPal. grab the fields from session | |
$sfirstname = $_SESSION['sfirstname']; | |
$slastname = $_SESSION['slastname']; | |
$saddress1 = $_SESSION['saddress1']; | |
if(!empty($_SESSION['saddress2'])) { | |
$saddress2 = $_SESSION['saddress2']; | |
} | |
$scity = $_SESSION['scity']; | |
$sstate = $_SESSION['sstate']; | |
$szipcode = $_SESSION['szipcode']; | |
//unset the session vars | |
unset($_SESSION['sfirstname']); | |
unset($_SESSION['slastname']); | |
unset($_SESSION['saddress1']); | |
if(!empty($_SESSION['saddress2'])) { | |
unset($_SESSION['saddress2']); | |
} | |
unset($_SESSION['scity']); | |
unset($_SESSION['sstate']); | |
unset($_SESSION['szipcode']); | |
} | |
if(!empty($sameasbilling)) | |
{ | |
//set the shipping fields to be the same as the billing fields | |
$sfirstname = get_user_meta($user_id, "pmpro_bfirstname", true); | |
$slastname = get_user_meta($user_id, "pmpro_blastname", true); | |
$saddress1 = get_user_meta($user_id, "pmpro_baddress1", true); | |
$saddress2 = get_user_meta($user_id, "pmpro_baddress2", true); | |
$scity = get_user_meta($user_id, "pmpro_bcity", true); | |
$sstate = get_user_meta($user_id, "pmpro_bstate", true); | |
$szipcode = get_user_meta($user_id, "pmpro_bzipcode", true); | |
} | |
if(!empty($saddress1)) | |
{ | |
//update the shipping user meta | |
update_user_meta($user_id, "pmpro_sfirstname", $sfirstname); | |
update_user_meta($user_id, "pmpro_slastname", $slastname); | |
update_user_meta($user_id, "pmpro_saddress1", $saddress1); | |
update_user_meta($user_id, "pmpro_saddress2", $saddress2); | |
update_user_meta($user_id, "pmpro_scity", $scity); | |
update_user_meta($user_id, "pmpro_sstate", $sstate); | |
update_user_meta($user_id, "pmpro_szipcode", $szipcode); | |
} | |
} | |
add_action("pmpro_after_checkout", "my_pmpro_after_checkout"); | |
//show the shipping address in the profile | |
function my_show_extra_profile_fields($user) | |
{ | |
global $pmpro_states; | |
?> | |
<h3>Shipping Address</h3> | |
<table class="form-table"> | |
<tr> | |
<th>First Name</th> | |
<td> | |
<input id="sfirstname" name="sfirstname" type="text" class="regular-text" value="<?php echo esc_attr( get_user_meta($user->ID, 'pmpro_sfirstname', true) ); ?>" /> | |
</td> | |
</tr> | |
<tr> | |
<th>Last Name</th> | |
<td> | |
<input id="slastname" name="slastname" type="text" class="regular-text" value="<?php echo esc_attr( get_user_meta($user->ID, 'pmpro_slastname', true) ); ?>" /> | |
</td> | |
</tr> | |
<tr> | |
<th>Address 1</th> | |
<td> | |
<input id="saddress1" name="saddress1" type="text" class="regular-text" value="<?php echo esc_attr( get_user_meta($user->ID, 'pmpro_saddress1', true) ); ?>" /> | |
</td> | |
</tr> | |
<tr> | |
<th>Address 2</th> | |
<td> | |
<input id="saddress2" name="saddress2" type="text" class="regular-text" value="<?php echo esc_attr( get_user_meta($user->ID, 'pmpro_saddress2', true) ); ?>" /> | |
</td> | |
</tr> | |
<tr> | |
<th>City</th> | |
<td> | |
<input id="scity" name="scity" type="text" class="regular-text" value="<?php echo esc_attr( get_user_meta($user->ID, 'pmpro_scity', true) ); ?>" /> | |
</td> | |
</tr> | |
<tr> | |
<th>State</th> | |
<td> | |
<select id="sstate" name="sstate"> | |
<option value="">--</option> | |
<?php | |
$sstate = get_user_meta($user->ID, 'pmpro_sstate', true); | |
foreach($pmpro_states as $ab => $st) | |
{ | |
?> | |
<option value="<?=$ab?>" <?php if($ab == $sstate) { ?>selected="selected"<?php } ?>><?=$st?></option> | |
<?php } ?> | |
</select> | |
<?php /* | |
<input id="sstate" name="sstate" type="text" class="regular-text" value="<?php echo esc_attr( get_user_meta($user->ID, 'pmpro_sstate', true) ); ?>" /> | |
*/ ?> | |
</td> | |
</tr> | |
<tr> | |
<th>Zip</th> | |
<td> | |
<input id="szipcode" name="szipcode" type="text" class="regular-text" value="<?php echo esc_attr( get_user_meta($user->ID, 'pmpro_szipcode', true) ); ?>" /> | |
</td> | |
</tr> | |
</table> | |
<?php | |
} | |
add_action( 'show_user_profile', 'my_show_extra_profile_fields' ); | |
add_action( 'edit_user_profile', 'my_show_extra_profile_fields' ); | |
function my_save_extra_profile_fields( $user_id ) | |
{ | |
if ( !current_user_can( 'edit_user', $user_id ) ) | |
return false; | |
update_usermeta( $user_id, 'pmpro_sfirstname', $_POST['sfirstname'] ); | |
update_usermeta( $user_id, 'pmpro_slastname', $_POST['slastname'] ); | |
update_usermeta( $user_id, 'pmpro_saddress1', $_POST['saddress1'] ); | |
update_usermeta( $user_id, 'pmpro_saddress2', $_POST['saddress2'] ); | |
update_usermeta( $user_id, 'pmpro_scity', $_POST['scity'] ); | |
update_usermeta( $user_id, 'pmpro_sstate', $_POST['sstate'] ); | |
update_usermeta( $user_id, 'pmpro_szipcode', $_POST['szipcode'] ); | |
} | |
add_action( 'personal_options_update', 'my_save_extra_profile_fields' ); | |
add_action( 'edit_user_profile_update', 'my_save_extra_profile_fields' ); | |
/* | |
These bits are required for PayPal Express only. | |
*/ | |
function my_pmpro_paypalexpress_session_vars() | |
{ | |
//save our added fields in session while the user goes off to PayPal | |
$_SESSION['sameasbilling'] = $_REQUEST['sameasbilling']; | |
//assume the request is set | |
$_SESSION['saddress1'] = $_REQUEST['saddress1']; | |
$_SESSION['sfirstname'] = $_REQUEST['sfirstname']; | |
$_SESSION['slastname'] = $_REQUEST['slastname']; | |
$_SESSION['sstate'] = $_REQUEST['sstate']; | |
$_SESSION['scity'] = $_REQUEST['scity']; | |
$_SESSION['szipcode'] = $_REQUEST['szipcode']; | |
//check this one cause it's optional | |
if(!empty($_REQUEST['saddress2'])) | |
$_SESSION['saddress2'] = $_REQUEST['saddress2']; | |
else | |
$_SESSION['saddress2'] = ""; | |
} | |
add_action("pmpro_paypalexpress_session_vars", "my_pmpro_paypalexpress_session_vars"); | |
/* | |
Require the shipping fields (optional) | |
*/ | |
function my_pmpro_registration_checks($okay) | |
{ | |
//only check if we're okay so far | |
if($okay) | |
{ | |
global $pmpro_msg, $pmpro_msgt; | |
if(empty($_REQUEST['sameasbilling']) && (empty($_REQUEST['saddress1']) || empty($_REQUEST['scity']) || empty($_REQUEST['sstate']) || empty($_REQUEST['szipcode']))) | |
{ | |
$pmpro_msg = "Please enter a shipping address, city, state, and zipcode."; | |
$pmpro_msgt = "pmpro_error"; | |
$okay = false; | |
} | |
} | |
return $okay; | |
} | |
add_filter("pmpro_registration_checks", "my_pmpro_registration_checks"); | |
//adding shipping address to confirmation page | |
function my_pmpro_confirmation_message($confirmation_message, $pmpro_invoice) | |
{ | |
global $current_user; | |
//does the user have a shipping address? | |
$sfirstname = get_user_meta($current_user->ID, "pmpro_sfirstname", true); | |
$slastname = get_user_meta($current_user->ID, "pmpro_slastname", true); | |
$saddress1 = get_user_meta($current_user->ID, "pmpro_saddress1", true); | |
$saddress2 = get_user_meta($current_user->ID, "pmpro_saddress2", true); | |
$scity = get_user_meta($current_user->ID, "pmpro_scity", true); | |
$sstate = get_user_meta($current_user->ID, "pmpro_sstate", true); | |
$szipcode = get_user_meta($current_user->ID, "pmpro_szipcode", true); | |
if(!empty($scity) && !empty($sstate)) | |
{ | |
$shipping_address = $sfirstname . " " . $slastname . "<br />" . $saddress1 . "<br />"; | |
if($saddress2) | |
$shipping_address .= $saddress2 . "<br />"; | |
$shipping_address .= $scity . ", " . $sstate . " " . $szipcode; | |
$confirmation_message .= "<br /><h2 id='userlogin'>Shipping Information:<h2><p>" . $shipping_address; | |
} | |
return $confirmation_message; | |
} | |
add_filter("pmpro_confirmation_message", "my_pmpro_confirmation_message", 10, 2); | |
//adding shipping address to confirmation email | |
function my_pmpro_email_body($body, $pmpro_email) | |
{ | |
global $wpdb; | |
//get the user_id from the email | |
$user_id = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_email = '" . $pmpro_email->email . "' LIMIT 1"); | |
if(!empty($user_id)) | |
{ | |
//does the user being emailed have a shipping address? | |
$sfirstname = get_user_meta($user_id, "pmpro_sfirstname", true); | |
$slastname = get_user_meta($user_id, "pmpro_slastname", true); | |
$saddress1 = get_user_meta($user_id, "pmpro_saddress1", true); | |
$saddress2 = get_user_meta($user_id, "pmpro_saddress2", true); | |
$scity = get_user_meta($user_id, "pmpro_scity", true); | |
$sstate = get_user_meta($user_id, "pmpro_sstate", true); | |
$szipcode = get_user_meta($user_id, "pmpro_szipcode", true); | |
if(!empty($scity) && !empty($sstate)) | |
{ | |
$shipping_address = $sfirstname . " " . $slastname . "<br />" . $saddress1 . "<br />"; | |
if($saddress2) | |
$shipping_address .= $saddress2 . "<br />"; | |
$shipping_address .= $scity . ", " . $sstate . " " . $szipcode; | |
} | |
if(!empty($shipping_address)) | |
{ | |
//squeeze the shipping address above the billing information or above the log link | |
if(strpos($body, "Billing Information:")) | |
$body = str_replace("Billing Information:", "Shipping Address:<br />" . $shipping_address . "<br /><br />Billing Information:", $body); | |
else | |
$body = str_replace("Log in to your membership", "Shipping Address:<br />" . $shipping_address . "<br /><br />Log in to your membership", $body); | |
} | |
} | |
return $body; | |
} | |
add_filter("pmpro_email_body", "my_pmpro_email_body", 10, 2); | |
//use a dropdown for state in the billing fields | |
function my_pmpro_state_dropdowns($use) | |
{ | |
return true; | |
} | |
add_filter("pmpro_state_dropdowns", "my_pmpro_state_dropdowns"); | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment