Jquery 缓慢的ajax添加到购物车,用于各种商品

Jquery 缓慢的ajax添加到购物车,用于各种商品,jquery,sql,ajax,wordpress,woocommerce,Jquery,Sql,Ajax,Wordpress,Woocommerce,我有一个woocommerce安装,它使用ajax将产品添加到购物车,但是将产品添加到购物车需要很长时间(7-10秒) 我开始记录日志,并意识到每次将产品添加到购物车时都会运行数百个SQL查询,而这正是花费所有时间的原因。我相信,在不运行太多查询的情况下,应该可以将产品添加到购物车 我注意到WPML可能是罪魁祸首,但我并不擅长SQL 使用AJAX添加产品有没有更好的方法?这是我今天使用的代码: // AJAX buy button for variable products function s

我有一个woocommerce安装,它使用ajax将产品添加到购物车,但是将产品添加到购物车需要很长时间(7-10秒)

我开始记录日志,并意识到每次将产品添加到购物车时都会运行数百个SQL查询,而这正是花费所有时间的原因。我相信,在不运行太多查询的情况下,应该可以将产品添加到购物车

我注意到WPML可能是罪魁祸首,但我并不擅长SQL

使用AJAX添加产品有没有更好的方法?这是我今天使用的代码:

// AJAX buy button for variable products
function setAjaxButtons() {
   $('.single_add_to_cart_button').click(function(e) {
      var target = e.target;
      loading(); // loading
      e.preventDefault();
      var dataset = $(e.target).closest('form');
      var product_id = $(e.target).closest('form').find("input[name*='product_id']");
      values = dataset.serialize();
        $.ajax({
          type: 'POST',
          url: window.location.hostname+'/?post_typ=product&add-to-cart='+product_id.val(),
          data: values,
          success: function(response, textStatus, jqXHR){
                loadPopup(target); // function show popup
                updateCartCounter();
            },
        });    
      return false;
   });    

}
下面是每次运行的一些SQL(有数千行,但我不能全部发布):

140226 11:34:04 1935查询

SELECT post_type FROM wp_posts WHERE ID=1529
     1935 Query SELECT trid, language_code, source_language_code
        FROM wp_icl_translations
        WHERE element_id='1529' AND element_type='post_product'
     1935 Query SELECT post_type FROM wp_posts WHERE ID=1529
     1935 Query SELECT post_type FROM wp_posts WHERE ID=1529
     1935 Query SELECT post_type FROM wp_posts WHERE ID=1529
     1935 Query SELECT post_type FROM wp_posts WHERE ID=162
     1935 Query SELECT * FROM wp_posts WHERE ID = 1638 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1638)
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1342)
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1343)
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1344)
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1345)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1698 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1698)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1727 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1727)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1628 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1628)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1699 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1699)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1342 LIMIT 1
     1935 Query SELECT * FROM wp_posts WHERE ID = 1352 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1352)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1343 LIMIT 1
     1935 Query SELECT * FROM wp_posts WHERE ID = 1344 LIMIT 1
     1935 Query SELECT * FROM wp_posts WHERE ID = 1345 LIMIT 1
     1935 Query SELECT post_type FROM wp_posts WHERE ID=1340
     1935 Query SELECT trid, language_code, source_language_code

在数小时后设法找到了解决方案,问题是woocommerce在添加到购物车后对索引页进行了获取,这需要花费所有的时间来加载。我注释掉了重定向,现在它可以超高速工作了

在woodcommerce-functions.php中

if ( $was_added_to_cart ) {

    $url = apply_filters( 'add_to_cart_redirect', $url );

    // If has custom URL redirect there
    if ( $url ) {
        wp_safe_redirect( $url );
        exit;
    }

    // Redirect to cart option
    elseif ( get_option('woocommerce_cart_redirect_after_add') == 'yes' && $woocommerce->error_count() == 0 ) {
        wp_safe_redirect( $woocommerce->cart->get_cart_url() );
        exit;
    }

    // Redirect to page without querystring args
    elseif ( wp_get_referer() ) {
        // Commented the line below
        //wp_safe_redirect( add_query_arg( 'added-to-cart', implode( ',', $added_to_cart ), remove_query_arg( array( 'add-to-cart', 'quantity', 'product_id' ), wp_get_referer() ) ) );
        exit;
    }

}

在我的例子中,我使用的是带有可变产品详细信息的模式弹出窗口,需要通过AJAX使“添加到购物车”按钮工作,而不是重定向到产品页面。因为我对扩展WooCommerce的功能相当陌生,所以我使用上面的daklock代码来派生我的解决方案:

// AJAX Add To Cart button for variable products
    $(document).on('click', '.single_add_to_cart_button', function(e) {

        // stop default action of Add To Cart button
        e.preventDefault();

        // find/set the form in the DOM and the product_id
        var dataset = $(e.target).closest('form');
        var product_id = $(e.target).closest('form').find("input[name*='product_id']");

        // do all your data serialization and make POST the AJAX request
        values = dataset.serialize();
        $.ajax({
          type: 'POST',
          url: '/?post_type=product&add-to-cart='+product_id.val(),
          data: values,
          success: function(response, textStatus, jqXHR){
                console.log('product was added to cart!');
            },
        });    
        return false;
    });

wp_postmeta
的索引速度可以加快,如下所述:

wp\u icl\u翻译
是否在
元素id
\u和
元素类型
上有复合索引?(任一命令)

为什么WP使用2个查询而不是1个查询来执行此操作

SELECT * FROM wp_posts WHERE ID =       1628 LIMIT 1
SELECT post_id, meta_key, meta_value
     FROM wp_postmeta WHERE post_id IN (1628)
SELECT * FROM wp_posts WHERE ID =       1628 LIMIT 1
SELECT post_id, meta_key, meta_value
     FROM wp_postmeta WHERE post_id IN (1628)