使用 AJAX 从 WooCommerce 结帐页面删除产品(项目)
Remove product (item) from WooCommerce checkout page using AJAX
我已在每个产品的结帐处添加了删除项 link。这部分工作正常。问题是;删除后,页面“滚动到顶部”。
我想通过在删除过程中添加 AJAX 来更改此设置。我试过了,但没有成功。换一种说法;单击删除 link 时,刷新应在后台进行,客户停留在同一部分。
这是我正在使用的代码:
add_filter( 'woocommerce_checkout_cart_item_quantity', 'link_to_remove_item_from_checkout', 20, 3 );
function link_to_remove_item_from_checkout( $quantity_html, $cart_item, $cart_item_key ) {
$remove_item = apply_filters( 'woocommerce_cart_item_remove_link', sprintf (
'<a style="text-decoration:underline" href="%s" rel="nofollow" title="Remove from Order" class="remove-product-from-checkout">Remove</a>',
esc_url(wc_get_cart_remove_url($cart_item_key)),
__('Remove from Order', 'woocommerce'),
esc_attr($cart_item['product_id']),
esc_attr($cart_item['data']->get_sku())
), $cart_item_key);
return '<br><strong class="product-quantity">' . sprintf('<b>Qty:</b> %s', $cart_item['quantity']) . '</strong> '.$remove_item.'<br clear="all">';
}
add_action('wp_ajax_woo_get_ajax_data', 'remove_product_from_checkout');
add_action('wp_ajax_nopriv_woo_get_ajax_data', 'remove_product_from_checkout');
function remove_product_from_checkout() {
if ( isset( $_POST['$remove_item']) ) {
$remove_product = sanitize_key( $_POST['$remove_item']);
WC()->session->set('product_id', $remove_product);
echo json_encode($remove_item);
}
die();
}
这是脚本,我不确定如何修改以使其与 link 一起工作。
add_action('wp_footer', 'script_for_removing_product_on_checkout', 10, 0);
function script_for_removing_product_on_checkout(){
if (!is_checkout()) return;
?>
<script type="text/javascript">
jQuery( function($){
$('form.checkout').on('change', 'remove_product', function(e){
e.preventDefault();
var p = $(this).val();
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data:{
'action': 'woo_get_ajax_data',
'packing': p,
},
success: function (result){
$('body').trigger('update_checkout');
},
error: function(error){
}
});
});
});
</script>
<?php
}
您的代码包含一些错误。
要使用 AJAX 从结帐中删除产品(项目),您可以使用:
// Concatenate remove link after item qty
function filter_woocommerce_checkout_cart_item_quantity( $item_qty, $cart_item, $cart_item_key ) {
$remove_link = apply_filters('woocommerce_cart_item_remove_link',
sprintf(
'<a href="#" class="remove" aria-label="%s" data-product_id="%s" data-product_sku="%s" data-cart_item_key="%s">×</a>',
__( 'Remove this item', 'woocommerce' ),
esc_attr( $cart_item['product_id'] ),
esc_attr( $cart_item['data']->get_sku() ),
esc_attr( $cart_item_key )
),
$cart_item_key );
// Return
return $item_qty . $remove_link;
}
add_filter( 'woocommerce_checkout_cart_item_quantity', 'filter_woocommerce_checkout_cart_item_quantity', 10, 3 );
// jQuery - Ajax script
function action_wp_footer() {
// Only checkout page
if ( ! is_checkout() )
return;
?>
<script type="text/javascript">
jQuery( function($) {
$( 'form.checkout' ).on( 'click', '.cart_item a.remove', function( e ) {
e.preventDefault();
var cart_item_key = $( this ).attr( "data-cart_item_key" );
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'woo_product_remove',
'cart_item_key': cart_item_key,
},
success: function ( result ) {
$( 'body' ).trigger( 'update_checkout' );
//console.log( 'response: ' + result );
},
error: function( error ) {
//console.log( error );
}
});
});
});
</script>
<?php
}
add_action( 'wp_footer', 'action_wp_footer', 10, 0 );
// Php Ajax
function woo_product_remove() {
if ( isset( $_POST['cart_item_key'] ) ) {
$cart_item_key = sanitize_key( $_POST['cart_item_key'] );
// Remove cart item
WC()->cart->remove_cart_item( $cart_item_key );
}
// Alway at the end (to avoid server error 500)
die();
}
add_action( 'wp_ajax_woo_product_remove', 'woo_product_remove' );
add_action( 'wp_ajax_nopriv_woo_product_remove', 'woo_product_remove' );
我已在每个产品的结帐处添加了删除项 link。这部分工作正常。问题是;删除后,页面“滚动到顶部”。
我想通过在删除过程中添加 AJAX 来更改此设置。我试过了,但没有成功。换一种说法;单击删除 link 时,刷新应在后台进行,客户停留在同一部分。
这是我正在使用的代码:
add_filter( 'woocommerce_checkout_cart_item_quantity', 'link_to_remove_item_from_checkout', 20, 3 );
function link_to_remove_item_from_checkout( $quantity_html, $cart_item, $cart_item_key ) {
$remove_item = apply_filters( 'woocommerce_cart_item_remove_link', sprintf (
'<a style="text-decoration:underline" href="%s" rel="nofollow" title="Remove from Order" class="remove-product-from-checkout">Remove</a>',
esc_url(wc_get_cart_remove_url($cart_item_key)),
__('Remove from Order', 'woocommerce'),
esc_attr($cart_item['product_id']),
esc_attr($cart_item['data']->get_sku())
), $cart_item_key);
return '<br><strong class="product-quantity">' . sprintf('<b>Qty:</b> %s', $cart_item['quantity']) . '</strong> '.$remove_item.'<br clear="all">';
}
add_action('wp_ajax_woo_get_ajax_data', 'remove_product_from_checkout');
add_action('wp_ajax_nopriv_woo_get_ajax_data', 'remove_product_from_checkout');
function remove_product_from_checkout() {
if ( isset( $_POST['$remove_item']) ) {
$remove_product = sanitize_key( $_POST['$remove_item']);
WC()->session->set('product_id', $remove_product);
echo json_encode($remove_item);
}
die();
}
这是脚本,我不确定如何修改以使其与 link 一起工作。
add_action('wp_footer', 'script_for_removing_product_on_checkout', 10, 0);
function script_for_removing_product_on_checkout(){
if (!is_checkout()) return;
?>
<script type="text/javascript">
jQuery( function($){
$('form.checkout').on('change', 'remove_product', function(e){
e.preventDefault();
var p = $(this).val();
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data:{
'action': 'woo_get_ajax_data',
'packing': p,
},
success: function (result){
$('body').trigger('update_checkout');
},
error: function(error){
}
});
});
});
</script>
<?php
}
您的代码包含一些错误。
要使用 AJAX 从结帐中删除产品(项目),您可以使用:
// Concatenate remove link after item qty
function filter_woocommerce_checkout_cart_item_quantity( $item_qty, $cart_item, $cart_item_key ) {
$remove_link = apply_filters('woocommerce_cart_item_remove_link',
sprintf(
'<a href="#" class="remove" aria-label="%s" data-product_id="%s" data-product_sku="%s" data-cart_item_key="%s">×</a>',
__( 'Remove this item', 'woocommerce' ),
esc_attr( $cart_item['product_id'] ),
esc_attr( $cart_item['data']->get_sku() ),
esc_attr( $cart_item_key )
),
$cart_item_key );
// Return
return $item_qty . $remove_link;
}
add_filter( 'woocommerce_checkout_cart_item_quantity', 'filter_woocommerce_checkout_cart_item_quantity', 10, 3 );
// jQuery - Ajax script
function action_wp_footer() {
// Only checkout page
if ( ! is_checkout() )
return;
?>
<script type="text/javascript">
jQuery( function($) {
$( 'form.checkout' ).on( 'click', '.cart_item a.remove', function( e ) {
e.preventDefault();
var cart_item_key = $( this ).attr( "data-cart_item_key" );
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'woo_product_remove',
'cart_item_key': cart_item_key,
},
success: function ( result ) {
$( 'body' ).trigger( 'update_checkout' );
//console.log( 'response: ' + result );
},
error: function( error ) {
//console.log( error );
}
});
});
});
</script>
<?php
}
add_action( 'wp_footer', 'action_wp_footer', 10, 0 );
// Php Ajax
function woo_product_remove() {
if ( isset( $_POST['cart_item_key'] ) ) {
$cart_item_key = sanitize_key( $_POST['cart_item_key'] );
// Remove cart item
WC()->cart->remove_cart_item( $cart_item_key );
}
// Alway at the end (to avoid server error 500)
die();
}
add_action( 'wp_ajax_woo_product_remove', 'woo_product_remove' );
add_action( 'wp_ajax_nopriv_woo_product_remove', 'woo_product_remove' );