Admin-ajax.php在子域上无法正常工作

时间:2017-06-28 作者:Soothsayer92

我试图将产品价格(从数据库中提取)乘以cookie存储的货币,对应于切换语言。为了实现这一点,我使用了AJAX脚本和几种方法。问题在于方法currencyRates();

尽管在测试环境中,一切都很正常(我使用的是子文件夹而不是子域),但在生产级方法上currencyRates(); 只是返回值1(在方法开始时初始化,当var_dump $rate 在foreach循环中,它给了我期望的值,但当我尝试返回时,它总是在开始变量处初始化的值$rate = 1).

发生了什么事?子域如何影响这种类型的脚本?数据库中的值正确,问题仅限于currencyRates(); 在foreach循环中使用return时返回初始值或零。

我尝试将整个方法移动到get_original_price(); 方法,但AJAX响应返回0,而不是product_price 乘以货币。

看一看,如果您需要更多的代码,我可以粘贴,但我几乎可以肯定其他一切都正常工作(我得到了响应,只乘以1,因为$rate = 1).

    public function get_original_price() {
        global $post;
        $variation_id = $_POST[\'variation_id\'];
        $original_price = get_post_meta($variation_id, "_regular_price", true);

        $ratesCurrency = $this->currencyRates();
        $priceAfterCurrency = $original_price*$ratesCurrency;
        echo $priceAfterCurrency;
        wp_die();

    }

        private function currencyRates() {

        global $wpdb;
        $rate = 1;

        $currency = $_COOKIE[\'wcumcs_user_currency_session\'];

        $name = \'wcumcs_exchange_rate_\'.$currency;

        $selectRate = $wpdb->get_results("SELECT option_value FROM ".$wpdb->prefix."options WHERE option_name=\'".$name."\' LIMIT 1;");

        foreach ($selectRate as $row) {
          $rate = $row->option_value;    
        }
        return $rate;
    }

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

不要为复杂的cookie/ajax胡说八道而烦恼,使用REST API吧!

我们将使用依赖注入和RESTful API来删除cookie并简化AJAX代码。

首先,让我们将其转换为REST API:

class Stuff {
    public function __construct() {
        add_action( \'rest_api_init\', function () {
                register_rest_route( \'soothsayer/v1\', \'/current_rate/\', array(
                        \'methods\' => \'GET\',
                        \'callback\' => [ $this, \'get_original_price\' ]
                ) );
        } );
    }

    public function get_original_price( $request ) {
        $variation_id = $request[\'variation_id\'];
        $original_price = get_post_meta( $variation_id, "_regular_price", true);

        $currency = $request[\'currency\'];

        $ratesCurrency = $this->currencyRates( $currency );
        $priceAfterCurrency = $original_price*$ratesCurrency;
        return $priceAfterCurrency;
    }

    private function currencyRates( $currency ) {
        global $wpdb;
        $rate = 1;

        $name = \'wcumcs_exchange_rate_\'.$currency;
        $selectRate = $wpdb->get_results("SELECT option_value FROM ".$wpdb->prefix."options WHERE option_name=\'".$name."\' LIMIT 1;");

        foreach ($selectRate as $row) {
            $rate = $row->option_value;    
        }
        return $rate;
    }
}
现在我们有了一个REST端点!注意我如何:

修正了缩进,或者更确切地说,我的编辑器不费吹灰之力就自动完成了,你的也应该如此currencyRates 不需要知道货币值来自何处,它是作为参数传递的,现在它将适用于任何货币,无论它是如何获得的,而不仅仅是cookie中设置的货币现在是一个参数,javascript可以很好地读取cookie,现在您的请求是100%可缓存的。现在性能提高了1000%,请注意$request 对象传递到get_original_price, 这将为您提供所有详细信息,我如何使用它

jQuery.get(
    \'https://example.com/wp-json/soothsayer/v1/current_rate\',
    {
        \'variation_id\' => 1,
        \'currency\' => \'USD\'
    },
    function( data ) {
        // success?
    }
);
甚至通过访问https://example.com/wp-json/soothsayer/v1/current_rate?variation_id=1&currency=USD

优化不是从选项表中获取选项的方式:

    global $wpdb;
    $rate = 1;

    $name = \'wcumcs_exchange_rate_\'.$currency;
    $selectRate = $wpdb->get_results("SELECT option_value FROM ".$wpdb->prefix."options WHERE option_name=\'".$name."\' LIMIT 1;");
以下是您的操作方式:

$rate = get_option( \'wcumcs_exchange_rate_\'.$currency, 1 );
如果需要获取多个选项,可以通过get_option 没有参数来获取数组

结束

相关推荐

如何传递jQuery AJAX URL值

我是WordPress的新手。我有一个这样的jQuery代码。。。在我的header.php 文件jQuery(document).ready(function(){ jQuery(\"#wp-submit\").click(function(){ username=jQuery(\"#userName\").val(); password=jQuery(\"#passWord\").val(); jQuery.ajax({&#