I am trying to create a page which calculates pricing dependant on country. I have two pricing tiers and want to update the pricing in two separate input fields when the country is selected. I could do this by repeating the JQuery and business_plan_calculation function twice but wanted to know if there was a way of doing it with one function?
Here is the code I am using to do it with two functions
function country_selector() {
global $wpdb;
$results = $wpdb->get_results("SELECT country FROM master_country ORDER BY country ASC");
foreach ($results as $rows) :
$option .= '<option value="'.$rows->country.'">';
$option .= $rows->country;
$option .= '</option>';
endforeach;
?>
<script type="text/javascript">
jQuery( document ).ready( function() {
jQuery( '#country_selector' ).change( function() {
var countryPOP = jQuery( '#country_selector' ).val();
jQuery.ajax( {
url: "<?php bloginfo( 'wpurl' ); ?>/wp-admin/admin-ajax.php",
type: 'POST',
data: 'action=business_plan_calculation&countryID=' + countryPOP,
success: function( results ) {
jQuery( '#business_plus_price' ).empty();
jQuery( '#business_plus_price' ).val( results );
}
});
jQuery.ajax( {
url: "<?php bloginfo( 'wpurl' ); ?>/wp-admin/admin-ajax.php",
type: 'POST',
data: 'action=enterprise_calculation&countryID=' + countryPOP,
success: function( results ) {
jQuery( '#enterprise_price' ).empty();
jQuery( '#enterprise_price' ).val( results );
}
});
});
});
</script> <?php
return '<select id="country_selector"><option value="0" disabled selected>Select Your Country</option>'.$option.'</select>';
}
add_shortcode('country-selector', 'country_selector');
function business_plan_calculation() {
if(isset($_POST['countryID'])) :
$parentCat=$_POST['countryID'];
global $wpdb;
$results = $wpdb->get_row( "SELECT currency_alpha, ppp_conversion FROM master_country WHERE country='$parentCat'" );
$endpoint = 'convert';
$access_key = '3a8c6c408b87705bde661d3d17b938ed';
$user_currency = $results->currency_alpha;
$chGBPUSD = curl_init('https://apilayer.net/api/'.$endpoint.'?access_key='.$access_key.'&from=GBP&to=USD&amount=1');
$chUSERGBP = curl_init('https://apilayer.net/api/'.$endpoint.'?access_key='.$access_key.'&from='.$user_currency.'&to=GBP&amount=1');
curl_setopt($chGBPUSD, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chUSERGBP, CURLOPT_RETURNTRANSFER, true);
$mh = curl_multi_init();
curl_multi_add_handle($mh, $chGBPUSD);
curl_multi_add_handle($mh, $chUSERGBP);
$active = null;
do {
curl_multi_exec($mh, $active);
} while ($active);
$GBPUSD = curl_multi_getcontent($chGBPUSD);
$USERGBP = curl_multi_getcontent($chUSERGBP);
curl_multi_close($mh);
$conversionResultGBPUSD = json_decode($GBPUSD, true);
$conversionResultUSERGBP = json_decode($USERGBP, true);
$GBPUSDresults = $conversionResultGBPUSD['result'];
$USERGBPresults = $conversionResultUSERGBP['result'];
$ppp = $results->ppp_conversion;
$business_plus = ( 65 * $GBPUSDresults * $ppp * $USERGBPresults );
echo '£'.number_format((float)$business_plus, 2, '.', '').' per year';
die();
endif;
}
add_action('wp_ajax_nopriv_business_plan_calculation', business_plan_calculation);
add_action('wp_ajax_business_plan_calculation', business_plan_calculation);
function enterprise_calculation() {
if(isset($_POST['countryID'])) :
$parentCat=$_POST['countryID'];
global $wpdb;
$results = $wpdb->get_row( "SELECT currency_alpha, ppp_conversion FROM master_country WHERE country='$parentCat'" );
$endpoint = 'convert';
$access_key = '3a8c6c408b87705bde661d3d17b938ed';
$user_currency = $results->currency_alpha;
$chGBPUSD = curl_init('https://apilayer.net/api/'.$endpoint.'?access_key='.$access_key.'&from=GBP&to=USD&amount=1');
$chUSERGBP = curl_init('https://apilayer.net/api/'.$endpoint.'?access_key='.$access_key.'&from='.$user_currency.'&to=GBP&amount=1');
curl_setopt($chGBPUSD, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chUSERGBP, CURLOPT_RETURNTRANSFER, true);
$mh = curl_multi_init();
curl_multi_add_handle($mh, $chGBPUSD);
curl_multi_add_handle($mh, $chUSERGBP);
$active = null;
do {
curl_multi_exec($mh, $active);
} while ($active);
$GBPUSD = curl_multi_getcontent($chGBPUSD);
$USERGBP = curl_multi_getcontent($chUSERGBP);
curl_multi_close($mh);
$conversionResultGBPUSD = json_decode($GBPUSD, true);
$conversionResultUSERGBP = json_decode($USERGBP, true);
$GBPUSDresults = $conversionResultGBPUSD['result'];
$USERGBPresults = $conversionResultUSERGBP['result'];
$ppp = $results->ppp_conversion;
$enterprise = ( 120 * $GBPUSDresults * $ppp * $USERGBPresults );
echo '£'.number_format((float)$enterprise, 2, '.', '').' per year';
die();
endif;
}
add_action('wp_ajax_nopriv_enterprise_calculation', enterprise_calculation);
add_action('wp_ajax_enterprise_calculation', enterprise_calculation);
This is actually fairly simple to accomplish.
Change your AJAX PHP function to return BOTH values, and return a JSON encoded array.
Then, in your javascript AJAX success callback, get the two pieces of data, and put them into the two separate inputs.
Changes below are commented to explain what's going on:
function country_selector() {
global $wpdb;
$results = $wpdb->get_results("SELECT country FROM master_country ORDER BY country ASC");
foreach ($results as $rows) {
$option .= '<option value="'.$rows->country.'">';
$option .= $rows->country;
$option .= '</option>';
} ?>
<script>
// no-conflict safe shorthand document ready
jQuery( function($) {
// now $ is safe to use inside this function
$( '#country_selector' ).change( function() {
var countryPOP = $( '#country_selector' ).val();
$.ajax( {
// use the WP function admin_url() here...
url: '<?php echo admin_url( 'admin-ajax.php') ?>',
type: 'POST',
// tell jQuery we expect JSON back so it auto-parses to JSON
dataType: 'json',
data: 'action=country_calculations&countryID=' + countryPOP,
success: function( results ) {
// NOTE: Should do something here if results is NOT what is expected
// clear BOTH inputs
$( '#business_plus_price, #enterprice_price' ).empty();
// access the business_plus results, put into input
$( '#business_plus_price' ).val( results.business_plus );
// access the enterprise results, put into input
$( '#enterprise_price' ).val( results.enterprise );
}
});
});
</script>
<?php
return '<select id="country_selector"><option value="0" disabled selected>Select Your Country</option>'.$option.'</select>';
}
// new AJAX function that gets and returns BOTH price calculations
function ajax_country_price_calculations() {
$data = country_price_calculations();
// NOTE: should do something here in case $data is empty / FALSE
// this function json_encodes, outputs, and dies
wp_send_json( $data );
}
// SIMPLIFIED your two functions into a single function.
// This reduces duplicate code, AND reduces CURL calls.
function country_price_calculations() {
if( isset( $_POST['countryID'] ) ) {
$parentCat = $_POST['countryID'];
global $wpdb;
$results = $wpdb->get_row( "SELECT currency_alpha, ppp_conversion FROM master_country WHERE country='$parentCat'" );
$endpoint = 'convert';
$access_key = '3a8c6c408b87705bde661d3d17b938ed';
$user_currency = $results->currency_alpha;
$chGBPUSD = curl_init('https://apilayer.net/api/'.$endpoint.'?access_key='.$access_key.'&from=GBP&to=USD&amount=1');
$chUSERGBP = curl_init('https://apilayer.net/api/'.$endpoint.'?access_key='.$access_key.'&from='.$user_currency.'&to=GBP&amount=1');
curl_setopt($chGBPUSD, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chUSERGBP, CURLOPT_RETURNTRANSFER, true);
$mh = curl_multi_init();
curl_multi_add_handle($mh, $chGBPUSD);
curl_multi_add_handle($mh, $chUSERGBP);
$active = null;
do {
curl_multi_exec($mh, $active);
} while ($active);
$GBPUSD = curl_multi_getcontent($chGBPUSD);
$USERGBP = curl_multi_getcontent($chUSERGBP);
curl_multi_close($mh);
$conversionResultGBPUSD = json_decode($GBPUSD, true);
$conversionResultUSERGBP = json_decode($USERGBP, true);
$GBPUSDresults = $conversionResultGBPUSD['result'];
$USERGBPresults = $conversionResultUSERGBP['result'];
$ppp = $results->ppp_conversion;
$business_plus = ( 65 * $GBPUSDresults * $ppp * $USERGBPresults );
$enterprise = ( 120 * $GBPUSDresults * $ppp * $USERGBPresults );
// RETURN the results instead of echo now...
// assign calculations to an associative array
return array(
'business_plus' => '£'.number_format((float)$business_plus, 2, '.', '').' per year',
'enterprise' => '£'.number_format((float)$enterprise, 2, '.', '').' per year'
);
}
// NOTE: Should return SOMETHING (such as FALSE) if this fails...
}
// Now you only need one AJAX endpoint
add_action('wp_ajax_nopriv_country_price_calculations', 'ajax_country_price_calculations' );
add_action('wp_ajax_country_price_calculations', 'ajax_country_price_calculations' );
NOTE: After working through the code in the question, there's many typos and other problems. The question is not about fixing / improving those issues, so I've stuck to showning you the pattern for how to do what you want. If it does not work for you, you will need to troubleshoot the issues that exist in the code.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With