Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Woocommerce签出页面中将产品添加到购物车的复选框字段_Php_Jquery_Ajax_Wordpress_Woocommerce - Fatal编程技术网

Php 在Woocommerce签出页面中将产品添加到购物车的复选框字段

Php 在Woocommerce签出页面中将产品添加到购物车的复选框字段,php,jquery,ajax,wordpress,woocommerce,Php,Jquery,Ajax,Wordpress,Woocommerce,在Woocommerce结帐部分,我试图添加一个复选框,以添加其他产品 我有一段代码,可以添加费用并在单击复选框时更新购物车,但我希望它添加产品而不是附加费: function cart_custom_fee( $cart ) { if( !$_POST || ( is_admin() && ! is_ajax() ) ) { return; } if( isset( $_POST['post_data'] ) ) {

在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>
但它不起作用。任何帮助都将不胜感激。

更新(与您的评论相关)

这只能通过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'         => '&nbsp;&nbsp;' . __('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 custom WC session variables 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');
    }
}
//显示自定义签出字段
添加_操作('woocommerce_checkout_before_terms_和_conditions','custom_checkbox_checkout_field');
函数自定义\复选框\签出\字段(){
$value=WC()->session->get('add_a_product');
woocommerce\u form\u字段('cb\u add\u product',数组(
'键入'=>'复选框',
“标签”=>”。_uu(“向订单中添加演示产品”),
'class'=>array('form-row-wide'),
),$value==“是”?真:假);
}
//jqueryajax请求
添加操作('wp_footer'、'checkout_custom_jquery_script');
函数签出\自定义\ jquery\脚本(){
//仅签出页面
如果(is_checkout()&&!is_wc_endpoint_url()):
//在加载时删除自定义WC会话变量
如果(WC()->session->get('add_a_product')){
WC()->session->unset(“添加产品”);
}
如果(WC()->session->get('product\u added\u key')){
WC()->session->uu unset('product_added_key');
}
//jQuery Ajax代码
?>
jQuery(函数($){
if(wc\u checkout\u参数的类型==“未定义”)
返回false;
$('form.checkout')。在('change','cb#u add_product',函数()上{
var value=$(this.prop('checked')==true?'yes':'no';
$.ajax({
键入:“POST”,
url:wc_checkout_params.ajax_url,
数据:{
“操作”:“添加产品”,
“添加产品”:值,
},
成功:功能(结果){
$('body')。触发器('update_checkout');
控制台日志(结果);
}
});
});
});
更新(与您的评论相关)

这只能通过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'         => '&nbsp;&nbsp;' . __('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 custom WC session variables 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');
    }
}
//显示自定义签出字段
添加_操作('woocommerce_checkout_before_terms_和_conditions','custom_checkbox_checkout_field');
函数自定义\复选框\签出\字段(){
$value=WC()->session->get('add_a_product');
woocommerce\u form\u字段('cb\u add\u product',数组(
'键入'=>'复选框',
“标签”=>”。_uu(“向订单中添加演示产品”),
'class'=>array('form-row-wide'),
),$value==“是”?真:假);
}
//jqueryajax请求
添加操作('wp_footer'、'checkout_custom_jquery_script');
函数签出\自定义\ jquery\脚本(){
//仅签出页面
如果(is_checkout()&&!is_wc_endpoint_url()):
//在加载时删除自定义WC会话变量
如果(WC()->session->get('add_a_product')){
WC()->session->unset(“添加产品”);
}
如果(WC()->session->get('product\u added\u key')){
WC()->session->uu unset('product_added_key');
}
//jQuery Ajax代码
?>
jQuery(函数($){
if(wc\u checkout\u参数的类型==“未定义”)
返回false;
$('form.checkout')。在('change','cb#u add_product',函数()上{
var value=$(this.prop('checked')==true?'yes':'no';
$.ajax({
键入:“POST”,
url:wc_checkout_params.ajax_url,
数据:{
“操作”:“添加产品”,
“添加产品”:值,
},
成功:功能(结果){
$('body')。触发器('update_checkout');
控制台日志(结果);
}
});
});
});

我很难让这段代码正常工作。我的复选框位于付款选项下面。如果我注释掉If(WC()->session->get('add_a_product))在Remove ship_“加载不同的自定义WC会话”下,它会停止无休止的渲染。我已更新了代码,做了一些小更改:我已将复选框移到“付款方式”下,并在与该复选框相关的jQuery侦听器中做了一些小更改。它工作得非常完美,没有任何错误或无休止的渲染。@user251566答案有效,并且正在回答您的初始问题,请接受它,如果您喜欢/想要投票。然后您可以告诉我您想在哪里添加此复选框,在问题末尾添加一个屏幕截图…然后通知我,我将在我的答案中进行必要的更改。它有效,谢谢您的支持