WordPress以更智能的方式使用单个AJAX代替多个AJAX请求

时间:2015-02-02 作者:NewUser

在wordpress中,我有这样的数据库表

product name

id product_name

1   A
2   B
3   C
4   D

product_buying_price

id product_name  product_buying_price
1   A                               10
2   B                           12
3   C                               15
4   D                               18

product_selling_price

id product_name product_selling_price
1   A                               12
2   B                           13
3   C                               19
4   D                               23
所以我有一个这样的下拉列表

<select name="product_name" id="product_name">
    <option value="">Products</option>
    <option value="A">A</option>
    <option value="B">B</option>
    <option value="C">C</option>
    <option value="D">D</option>
</select>
我想在这样的表格中显示产品购买价格和产品销售价格的值

<table>
    <tr>
        <td>
            <select name="product_name" id="product_name">
                <option value="">Products</option>
                <option value="A">A</option>
                <option value="B">B</option>
                <option value="C">C</option>
                <option value="D">D</option>
            </select>
        </td>
        <td class="product_buying_price"></td>
        <td class="product_selling_price"></td>
    </tr>
</table>
像这样,我有3-4个这样的字段,我想得到产品的值。

在js文件中,我制作了如下ajax

$(\'body\').on(\'change\',\'#product_name\', function() {
    var selected = $(this).val;

    //Get product buying price
    $.post( test.ajaxUrl, { \'selected\' : selected,  \'action\' : \'get_product_buying_price\' }, function(data){
        data = $.parseJSON(data);
        selected.find(\'td.product_buying_price\').html(data);
    });

    //Get product selling price
    $.post( test.ajaxUrl, { \'selected\' : selected,  \'action\' : \'get_product_selling_price\' }, function(data){
        data = $.parseJSON(data);
        selected.find(\'td.product_selling_price\').html(data);
    }); 
});
内部函数我有这样的函数

function get_product_buying_price() {
    global $wpdb;
    $selected_product = $_POST[\'selected\'];
    $get_product_price = $wpdb->get_row("SELECT `product_buying_price` FROM `product_buying_price` WHERE `product_name` = \'.$selected_product.\' ");
    $product_buying_price = $get_product_price->product_buying_price;
    echo json_encode($product_buying_price);
    exit;
}

function get_product_selling_price() {
    global $wpdb;
    $selected_product = $_POST[\'selected\'];
    $get_product_price = $wpdb->get_row("SELECT `product_selling_price` FROM `product_selling_price` WHERE `product_name` = \'.$selected_product.\' ");
    $product_selling_price = $get_product_price->product_selling_price;
    echo json_encode($product_selling_price);
    exit;
}
这里很好用。但是,您不认为一次单击就执行多个ajax请求会使速度变慢吗?我有大约3-4个要求更改的请求。有人能告诉我一些更聪明的方法来实现这一点吗?任何帮助和建议都是值得赞赏的。谢谢

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

我很感激你的问题已经很老了,毫无疑问你已经有了自己的解决方案,但希望这可以帮助其他人。

您可以替换javascriptpost 调用一个函数,该函数提取数据的两部分并将其作为对象返回。

$(\'body\').on(\'change\',\'#product_name\', function() {
    //Get product prices
    $.post( test.ajaxUrl, {
            \'selected\' : $(this).val(),
            \'action\' : \'get_product_prices\'
         }, function(data){
             data = $.parseJSON(data);
             $(this).parent(\'tr\').find(\'td.product_buying_price\').text(data.buying)
             .end().find(\'td.product_selling_price\').text(data.selling);
    });
});
那么您的php函数将如下所示。

function get_product_prices(){
    global $wpdb;
    $returnData = array();
    $selected_product =  esc_sql($_POST[\'selected\']);
    // please see the notes on your database structure
    $get_product_price = $wpdb->get_row("SELECT `product_buying_price` FROM `product_buying_price` WHERE `product_name` = \'.$selected_product.\' ");
    $returnData[\'buying\'] = $get_product_price->product_buying_price;
    $get_product_price = $wpdb->get_row("SELECT `product_selling_price` FROM `product_selling_price` WHERE `product_name` = \'.$selected_product.\' ");
    $returnData[\'selling\'] = $get_product_price->product_selling_price;
    echo json_encode($returnData);
    exit;
}
我对wpdb类不是很熟悉;可以用这样的单个查询替换sql查询

SELECT `product_buying_price`.`product_buying_price`,  `product_selling_price`.`product_selling_price`
FROM `product_buying_price`
INNER JOIN `product_selling_price`
ON `product_buying_price`.`product_name` = `product_selling_price`.`product_name`
WHERE `product_buying_price`.`product_name` = \'.$selected_product.\'"
然而,从数据库表的外观来看,您似乎有不必要的表数量,最好只将所有数据存储在一个表中

product_data

id   product_name  product_selling_price  product_buying_price
1    A             12                     10
2    B             13                     12
3    C             19                     15
4    D             23                     18
我还将在PHP和Javascript中应用一些检查,以确保您拥有输入html表所需的所有数据。

结束