【问题标题】:Slow ajax add to cart for variable products Woocommerce将慢速 ajax 添加到购物车以获取可变产品 Woocommerce
【发布时间】:2014-02-26 10:34:55
【问题描述】:

我有一个使用 ajax 将产品添加到购物车的 woocommerce 安装,但是将产品添加到购物车需要很长时间(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(有数千行但我不能全部发布):

FROM wp_icl_translations
        WHERE element_id='1354' AND element_type='post_product'
     1935 Query SELECT post_type FROM wp_posts WHERE ID=1354
     1935 Query SELECT post_type FROM wp_posts WHERE ID=1354
     1935 Query SELECT post_type FROM wp_posts WHERE ID=1354
     1935 Query SELECT post_type FROM wp_posts WHERE ID=162
     1935 Query SELECT * FROM wp_posts WHERE ID = 1639 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1639)
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1442)
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1443)
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1444)
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1445)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1694 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1694)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1726 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1726)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1603 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1603)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1695 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1695)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1442 LIMIT 1
     1935 Query SELECT * FROM wp_posts WHERE ID = 1446 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1446)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1443 LIMIT 1
     1935 Query SELECT * FROM wp_posts WHERE ID = 1444 LIMIT 1
     1935 Query SELECT * FROM wp_posts WHERE ID = 1445 LIMIT 1
     1935 Query SELECT post_type FROM wp_posts WHERE ID=1441
     1935 Query SELECT trid, language_code, source_language_code
        FROM wp_icl_translations
        WHERE element_id='1441' AND element_type='post_product'
     1935 Query SELECT post_type FROM wp_posts WHERE ID=1441
     1935 Query SELECT post_type FROM wp_posts WHERE ID=1441
     1935 Query SELECT post_type FROM wp_posts WHERE ID=1441
     1935 Query SELECT post_type FROM wp_posts WHERE ID=162
     1935 Query SELECT * FROM wp_posts WHERE ID = 1652 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1652)
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1530)
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1531)
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1532)
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1533)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1696 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1696)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1716 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1716)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1577 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1577)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1697 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1697)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1530 LIMIT 1
     1935 Query SELECT * FROM wp_posts WHERE ID = 1564 LIMIT 1
     1935 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1564)
     1935 Query SELECT * FROM wp_posts WHERE ID = 1531 LIMIT 1
     1935 Query SELECT * FROM wp_posts WHERE ID = 1532 LIMIT 1
     1935 Query SELECT * FROM wp_posts WHERE ID = 1533 LIMIT 1

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

【问题讨论】:

    标签: jquery sql ajax wordpress woocommerce


    【解决方案1】:

    在几个小时后设法找到解决方案,问题是 woocommerce 在添加到购物车后对索引页面进行了 GET,这需要花费所有时间来加载。我注释掉了重定向,它现在运行得非常快。

    在 woocommerce-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;
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      在我的例子中,我正在使用带有可变产品详细信息的模式弹出窗口,并且需要通过 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;
          });
      

      【讨论】:

        【解决方案3】:

        wp_postmeta 的索引可以按此处所述加快:

        http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

        wp_icl_translations 是否在element_id _和element_type 上有一个复合索引? (任意顺序)

        究竟为什么 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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-21
          • 2021-08-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多