Filling multiple input fields from php function
I am trying to create a page that calculates a country specific price. I have two price levels and want to update prices in two separate input fields when a country is selected. I could do this by repeating the JQuery function and business_plan_calculation twice, but wanted to know if there is a way to do this with a single function?
Here is the code I am using to do 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);
source to share
It's actually pretty simple.
Modify the PHP AJAX function to return BOTH values ββand return a JSON encoded array.
Then, in your JavaScript AJAX-enabled callback, get the two pieces of data and put them in two separate inputs.
The changes are listed below 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 : Having worked through the code in the question, there are many typos and other issues. The question is not about fixing / improving these issues, so I stuck with showing you a sample of how to do what you want. If this does not work for you, then you need to troubleshoot existing problems in your code.
source to share