在Woocommerce结帐部分,我试图添加一个添加其他产品的复选框。
我有一段工作代码,可以增加费用并在单击复选框时更新购物车,但是我希望它添加产品而不是附加费:
function cart_custom_fee( $cart ) {
if( !$_POST || ( is_admin() && ! is_ajax() ) ) {
return;
}
if( isset( $_POST['post_data'] ) ) {
parse_str( $_POST['post_data'], $post_data );
} else {
$post_data = $_POST;
}
if( isset( $post_data['add_test_item'] ) ) { // This is the checkbox name
WC()->cart->add_fee('Test Item', 35);
}
}
add_action( 'woocommerce_cart_calculate_fees', 'cart_custom_fee' );
这是复选框的代码
<script>
jQuery(document).ready(function(){
jQuery('#cp-checkbox').click(function() {
jQuery('body').trigger('update_checkout');
});
});
</script>
代码有效……
现在,我尝试更改代码以添加产品:
function add_item_checkout( $cart ) {
if( !$_POST || ( is_admin() && ! is_ajax() ) ) {
return;
}
if( isset( $_POST['post_data'] ) ) {
parse_str( $_POST['post_data'], $post_data );
} else {
$post_data = $_POST;
}
if( isset( $post_data['add_test_item'] ) ) { // This is the checkbox name
WC()->cart->add_to_cart( 123 ); // 123 is the product ID
}
}
add_action( 'woocommerce_calculate_totals', 'add_item_checkout' );
但是没有用。任何帮助将不胜感激。
答案 0 :(得分:2)
更新 (与您的评论有关)。
这只能使用Javascript(jQuery)和Ajax来完成,因为这是客户端事件,并且对结帐字段进行操作时不会提交任何内容。
当选中此复选框时,特定产品将添加到购物车中,以刷新结帐订单查看数据。如果客户未选中此复选框,它将删除特定产品,并刷新结帐订单查看数据。
更新更改:我更改了付款选项下的复选框,并轻轻更改了jQuery代码以处理该复选框的值,因为现在Ajax也刷新了。
代码:
// Display a custom checkout field
add_action( 'woocommerce_checkout_before_terms_and_conditions', 'custom_checkbox_checkout_field' );
function custom_checkbox_checkout_field() {
$value = WC()->session->get('add_a_product');
woocommerce_form_field( 'cb_add_product', array(
'type' => 'checkbox',
'label' => ' ' . __('Add a demo product to your order'),
'class' => array('form-row-wide'),
), $value == 'yes' ? true : false );
}
// The jQuery Ajax request
add_action( 'wp_footer', 'checkout_custom_jquery_script' );
function checkout_custom_jquery_script() {
// Only checkout page
if( is_checkout() && ! is_wc_endpoint_url() ):
// Remove "ship_different" custom WC session on load
if( WC()->session->get('add_a_product') ){
WC()->session->__unset('add_a_product');
}
if( WC()->session->get('product_added_key') ){
WC()->session->__unset('product_added_key');
}
// jQuery Ajax code
?>
<script type="text/javascript">
jQuery( function($){
if (typeof wc_checkout_params === 'undefined')
return false;
$('form.checkout').on( 'change', '#cb_add_product', function(){
var value = $(this).prop('checked') === true ? 'yes' : 'no';
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'add_a_product',
'add_a_product': value,
},
success: function (result) {
$('body').trigger('update_checkout');
console.log(result);
}
});
});
});
</script>
<?php
endif;
}
// The Wordpress Ajax PHP receiver
add_action( 'wp_ajax_add_a_product', 'checkout_ajax_add_a_product' );
add_action( 'wp_ajax_nopriv_add_a_product', 'checkout_ajax_add_a_product' );
function checkout_ajax_add_a_product() {
if ( isset($_POST['add_a_product']) ){
WC()->session->set('add_a_product', esc_attr($_POST['add_a_product']));
echo $_POST['add_a_product'];
}
die();
}
// Add remove free product
add_action( 'woocommerce_before_calculate_totals', 'adding_removing_specific_product' );
function adding_removing_specific_product( $cart ) {
if (is_admin() && !defined('DOING_AJAX'))
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// HERE the specific Product ID
$product_id = 53;
if( WC()->session->get('add_a_product') == 'yes' && ! WC()->session->get('product_added_key') )
{
$cart_item_key = $cart->add_to_cart( $product_id );
WC()->session->set('product_added_key', $cart_item_key);
}
elseif( WC()->session->get('add_a_product') == 'no' && WC()->session->get('product_added_key') )
{
$cart_item_key = WC()->session->get('product_added_key');
$cart->remove_cart_item( $cart_item_key );
WC()->session->__unset('product_added_key');
}
}
代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试和工作。
1)付款方式下的订单商品和复选框自定义字段
2)启用该复选框时,该产品即被添加并显示在订单项中: