从php函数填充多个输入框

从php函数填充多个输入框,php,jquery,wordpress,Php,Jquery,Wordpress,我试图创建一个页面,计算价格取决于国家。我有两个定价层,希望在选择国家/地区时在两个单独的输入字段中更新定价。我可以通过重复JQuery和business_plan_计算函数两次来实现这一点,但我想知道是否有一种方法可以用一个函数实现这一点 下面是我用两个函数实现的代码 function country_selector() { global $wpdb; $results = $wpdb->get_results("SELECT country FROM master

我试图创建一个页面,计算价格取决于国家。我有两个定价层,希望在选择国家/地区时在两个单独的输入字段中更新定价。我可以通过重复JQuery和business_plan_计算函数两次来实现这一点,但我想知道是否有一种方法可以用一个函数实现这一点

下面是我用两个函数实现的代码

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

这实际上相当容易实现

更改AJAX PHP函数以返回这两个值,并返回JSON编码的数组

然后,在javascript AJAX成功回调中,获取两个数据片段,并将它们放入两个单独的输入中

下面对更改进行了注释,以解释发生的情况:

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' );
注:
在处理完问题中的代码后,出现了许多拼写错误和其他问题。问题不在于解决/改进这些问题,因此我坚持向您展示如何做您想要的事情的模式。如果它不适用于您,您需要对代码中存在的问题进行故障排除。

非常感谢您的回答。我已经尝试过实现这个,但我无法让它工作。我对编码非常陌生,这可能就是原因。你说我的原始代码有打字错误和其他问题。你能给我举个例子吗?这样我就可以试着先解决这些问题了?我的原始代码运行正常,所以我不确定在哪里可以找到错误。感谢您的示例,该行无法工作:添加\u操作'wp\u ajax\u nopriv\u enterprise\u calculation',enterprise\u calculation;-第二个参数必须是字符串或数组。