【问题标题】:Woocommerce Ajax add to cart programmaticallyWoocommerce Ajax 以编程方式添加到购物车
【发布时间】:2016-02-12 21:49:37
【问题描述】:

我有这个按钮:

<a href="http://my-site/checkout/" target="_blank" class="dt-sc-button">bla bla</a>

此按钮位于我的主页上,由页面构建器生成。我想要完成的是当有人点击按钮时,它会将他们带到结账处,并将产品添加到购物车中。我知道这可以通过 URL 来完成,但我还需要让这个按钮做其他事情(客户想法)。

所以现在我被困在这里:

jQuery

jQuery(document).ready(function($){     
$(".remove-all").click(function(){
    $.ajax({
        url: "wp-admin/admin-ajax.php",
        data: 'myajax'
    });
  });
});

PHP

add_action('wp_ajax_myajax', 'myajax');
add_action('wp_ajax_nopriv_myajax', 'myajax');

    function myajax() {
        global $woocommerce;
        $product_id = 264;
    $woocommerce->cart->add_to_cart($product_id);
    die();
    }

我是 javascript 菜鸟,所以请您指出正确的方向,或者给我提示一下我做错了什么。

提前致谢!

【问题讨论】:

  • 目前发生了什么?您是否收到某种错误?
  • 不,我不知道。当我检查控制台时,没有警告或错误,我唯一注意到的是:单击按钮后,它会加载指向 example.com/checkout 的链接,而不是直接进入购物车而不添加产品。有意义吗?
  • 友情提醒客户可以想出一些愚蠢的东西。作为专业人士,指导他们是我们的工作。 :) 也就是说,$(".remove-all") 作为选择器与 &lt;a&gt; 元素上的类不匹配,因此不会发生任何事情。此外,WooCommerce 具有 ajax 添加到购物车功能,请参阅here 和here。无需重新发明轮子。
  • 哦,PS-如果 JS 被禁用,该链接只会将某人带到结帐处,而不会实际将任何内容添加到购物车中。

标签: ajax wordpress woocommerce


【解决方案1】:

您可能需要取消/阻止单击链接的默认操作,然后在 AJAX 调用完成后重定向(这只是一种方法):

jQuery(document).ready(function($){     
  $(".remove-all").click(function(e){
    e.preventDefault();  // Prevent the click from going to the link
    var $redirect = $(this).attr('href');        

    $.ajax({
        url: "wp-admin/admin-ajax.php",
        data: 'myajax',
        success: function () {
          window.location.href = $redirect;
        }
    });
  });
});

PHP

add_action('wp_ajax_myajax', 'myajax');
add_action('wp_ajax_nopriv_myajax', 'myajax');

function myajax() {
    $product_id = 264;
    // Avoid using the global $woocommerce object
    WC()->cart->add_to_cart($product_id);
    die();
}

【讨论】:

  • 我仍然得到相同的行为。它确实阻止了按钮的默认操作,但我仍然没有将产品添加到购物车中
  • 您确定您的 AJAX URL 正确指向 admin-ajax.php?
  • 我想是的。老实说,我不知道如何检查 AJAX URL 是否正确指向 admin-ajax.php,但我的主题中有一个变量 ajaxurl:'example.com/wp-admin/admin-ajax.php ,我用 ajaxurl 替换了 wp-admin/admin-ajax.php 并且我没有看到任何变化.
  • 通常情况下,最好通过wp_localize_script() 传递ajaxurl,但WooCommerce 已经这样做了,因此您可以通过wc_add_to_cart_params.ajax_url 访问它,只要您在WooCommerce 加载后将您的自定义脚本加入队列它的add-to-cart.js 脚本。
  • PS-@rnevius 小心,您的回调中没有验证。
【解决方案2】:

正如我在 cmets 中提到的,您几乎可以借鉴 WooCommerce 的核心功能。

首先,这是我们将尝试 ajaxify 的按钮:

<a href="http://local.wordpress.dev/checkout/" class="button test-button">bla bla</a>

其次,我们将加载我们的自定义脚本并将重要的变量传递给它,例如管理 ajax 和结帐 url。

add_action( 'wp_enqueue_scripts', 'so_load_script', 20 );
function so_load_script(){
    wp_enqueue_script( 'so_test', plugins_url( 'js/test.js', __FILE__ ) );
    $i18n = array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'checkout_url' => get_permalink( wc_get_page_id( 'checkout' ) ) );
    wp_localize_script( 'so_test', 'SO_TEST_AJAX', $i18n );
}

现在我们将编写我们的 ajax 回调,它几乎是从 WooCommerce 核心中逐字复制的,只做了一些小的修改:

add_action('wp_ajax_myajax', 'myajax_callback');
add_action('wp_ajax_nopriv_myajax', 'myajax_callback');

    /**
     * AJAX add to cart.
     */
function myajax_callback() {        
        ob_start();

        //$product_id        = 264;
        $product_id        = 34;
        $quantity          = 1;
        $passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity );
        $product_status    = get_post_status( $product_id );

        if ( $passed_validation && WC()->cart->add_to_cart( $product_id, $quantity ) && 'publish' === $product_status ) {

            do_action( 'woocommerce_ajax_added_to_cart', $product_id );

            wc_add_to_cart_message( $product_id );

        } else {

            // If there was an error adding to the cart, redirect to the product page to show any errors
            $data = array(
                'error'       => true,
                'product_url' => apply_filters( 'woocommerce_cart_redirect_after_error', get_permalink( $product_id ), $product_id )
            );

            wp_send_json( $data );

        }

        die();

}

最后是test.js的内容:

jQuery(document).ready(function($){     
  $(".test-button").click(function(e){ 
    e.preventDefault();  // Prevent the click from going to the link

    $.ajax({
        url: wc_add_to_cart_params.ajax_url,
        method: 'post',
        data: { 
            'action': 'myajax'
        }
    }).done( function (response) {
          if( response.error != 'undefined' && response.error ){
            //some kind of error processing or just redirect to link
            // might be a good idea to link to the single product page in case JS is disabled
            return true;
          } else {
            window.location.href = SO_TEST_AJAX.checkout_url;
          }
    });

  });

});

【讨论】:

  • 这会刷新页面吗?或“添加到购物车”将通过 ajax 发生。 @helgatheviking
  • @mehmoodkhan 我不知道 5 年前的代码是否可以工作,但 window.location.href = SO_TEST_AJAX.checkout_url; 建议我的努力是尝试在添加到购物车部分成功时重定向到结帐。跨度>
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多