首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WooCommerce:如果没有填写所有购物车项自定义字段,请避免签出

WooCommerce:如果没有填写所有购物车项自定义字段,请避免签出
EN

Stack Overflow用户
提问于 2021-03-12 10:00:48
回答 1查看 173关注 0票数 1

我编写了一个函数,在每个产品中的附加字段(在购物车中显示)尚未完成时禁用订购按钮(只有当购物车中有两个以上的项时,才会显示字段)。

代码语言:javascript
复制
function disable_checkout_button_no_shipping() {
    global $woocommerce;
    $quantity = $woocommerce->cart->cart_contents_count;        
 
    if( $quantity > 1 ){
        foreach ( WC()->cart->get_cart() as $cart_item ) {
            $item_name = $cart_item['data']->get_title();
            $notes = $cart_item['notes'];
            printf("[%s]\n",      $notes);

            if ( empty( $notes ) ) {
                remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 );
                printf(
                    '<div class="wc-cart-note-warning"><span>Przed złożeniem zamówienia dodaj informację dla kogo jest kartka!</span></div>',
                );
            }
        }
    }
}
add_action( 'woocommerce_proceed_to_checkout', 'disable_checkout_button_no_shipping', 1 );

但是,只有在浏览器中刷新页面时,它才能工作。

当在分配给产品的文本字段中输入某项内容时,如何使函数刷新,并使用ajax刷新带有order按钮的部分?

下面是负责添加注释的代码:

Javascrit代码保存在update-cart-item-ajax.js文件名下(自定义文件)

代码语言:javascript
复制
(function($) {
    // $(document).ready(function(){
    $('.prefix-cart-notes').on('change keyup paste', function() {
        $('.cart_totals').block({
            message: null,
            overlayCSS: {
                background: '#fff',
                opacity: 0.6
            }
        });
        var cart_id = $(this).data('cart-id');
        $.ajax({
            type: 'POST',
            url: prefix_vars.ajaxurl,
            data: {
                action: 'prefix_update_cart_notes',
                security: $('#woocommerce-cart-nonce').val(),
                notes: $('#cart_notes_' + cart_id).val(),
                cart_id: cart_id
            },
            success: function(response) {
                $('.cart_totals').unblock();
            }
        })
    });
});

PHP代码保存在活动主题functions.php文件中:

代码语言:javascript
复制
/**
 * Add a text field to each cart item
 */
function prefix_after_cart_item_name( $cart_item, $cart_item_key ) {
    $notes = isset( $cart_item['notes'] ) ? $cart_item['notes'] : '';
    global $woocommerce;
    $quantity = $woocommerce->cart->cart_contents_count;
    if( $quantity > 1 ){
        printf(
            '<div><textarea rows="1"  placeholder="Dla kogo jest kartka?" maxlength="30" class="%s" id="cart_notes_%s" data-cart-id="%s">%s</textarea></div>',
            'prefix-cart-notes',
            $cart_item_key,
            $cart_item_key,
            $notes
        );
    }
}
add_action( 'woocommerce_after_cart_item_name', 'prefix_after_cart_item_name', 10, 2 );

/**
 * Enqueue our JS file
 */
function prefix_enqueue_scripts() {
    //trailingslashit( plugin_dir_url( __FILE__ ) )
    wp_register_script( 'prefix-script', trailingslashit( get_home_url() ) . '/wp-content/themes/boomb_theme/assets/update-cart-item-ajax.js', array( 'jquery-blockui' ), time(), true );
    wp_localize_script(
        'prefix-script',
        'prefix_vars',
        array(
            'ajaxurl' => admin_url( 'admin-ajax.php' )
        )
    );
    wp_enqueue_script( 'prefix-script' );
}
add_action( 'wp_enqueue_scripts', 'prefix_enqueue_scripts' );

/**
 * Update cart item notes
 */
function prefix_update_cart_notes() {
    // Do a nonce check
    if( ! isset( $_POST['security'] ) || ! wp_verify_nonce( $_POST['security'], 'woocommerce-cart' ) ) {
        wp_send_json( array( 'nonce_fail' => 1 ) );
        exit;
    }

    // Save the notes to the cart meta
    $cart = WC()->cart->cart_contents;
    $cart_id = $_POST['cart_id'];
    $notes = $_POST['notes'];
    $cart_item = $cart[$cart_id];
    $cart_item['notes'] = $notes;
    WC()->cart->cart_contents[$cart_id] = $cart_item;
    WC()->cart->set_session();
    wp_send_json( array( 'success' => 1 ) );
    exit;
}
add_action( 'wp_ajax_prefix_update_cart_notes', 'prefix_update_cart_notes' );
add_action( 'wp_ajax_nopriv_prefix_update_cart_notes', 'prefix_update_cart_notes' );

function prefix_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {
    if( isset( $values['notes'] ) ) {
        $item->add_meta_data( 'notes', $values['notes'], true );
    }
}
add_action( 'woocommerce_checkout_create_order_line_item', 'prefix_checkout_create_order_line_item', 10, 4 );
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-12 11:23:03

在您的情况下,为了避免结帐,请使用woocommerce_checkout_process专用钩子,如下所示:

代码语言:javascript
复制
add_action( 'woocommerce_checkout_process', 'check_cart_notes_to_disable_checkout' );
function check_cart_notes_to_disable_checkout() {
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        if ( ! isset($cart_item['notes']) || empty($cart_item['notes']) ) {
            $button = '<a href="'. wc_get_cart_url() .'" tabindex="1" class="button wc-forward">'. __("Back to cart", "woocommerce") .'</a>';
            wc_add_notice( $button . __("Przed złożeniem zamówienia dodaj informację dla kogo jest kartka!", "woocommerce"), 'error' );
        }
    }
}

代码位于活动子主题(或活动主题)的functions.php文件中。测试和工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66597769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档