3

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);

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you very much for your answer. I've tried to implement this but I can't get it to work. I'm very new to coding which is probably why. You say my original code had typos and other problems in. Are you able to give me an example please so I can try fix these first? My original code worked so I'm not really sure where to find the errors. Thanks
For example, this line could not work: add_action('wp_ajax_nopriv_enterprise_calculation', enterprise_calculation); - the second argument needs to be a string or array.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.