duanran3115 2019-02-26 18:09
浏览 103

Woocommerce:为ajax请求添加自定义字段

i have one problem and i can't solve it myself.

I use a custom input field for the customer to enter personal text. If i don't use Ajax request it works prefect but else not.

Here is the Custom input field code

    /*
 * Display input on single product page
 * @return html
 */
function olikdesign_Wunschtext(){
    global $post;
    $terms = wp_get_post_terms( $post->ID, 'product_cat' );
    foreach ( $terms as $term ) $categories[] = $term->slug;
    $woocommerce;
    $value = isset( $_POST['_Wunschtext'] ) ? sanitize_text_field( $_POST['_Wunschtext'] ) : '';


// Wunschtext Textfeld anzeigen, sofern der Artikel sich in der Kategorie Custom befindet.

    if ( in_array( 'individuell', $categories ) ) {
         printf( '<div class="variations wunschtext"><label for="wunschtext">%s</label><input type="text" id="wunschtext" name="wunschtext" class="input-text-custom_text" maxlength="25" data-attribute_name="attribute_wunschtext" value="%s" /><small class="custom_text_description">Schreibe hier deinen Wunschtext hinein &mdash; Max. 25 Zeichen.</small>




         </div>', __( 'Wunschtext', 'olikdesign-plugin-textdomain' ), esc_attr( $value ) );
    } else {
         //Nichts anzeigen
    }


}
add_action( 'woocommerce_single_variation', 'olikdesign_Wunschtext', 5 );
/*
 * Validate when adding to cart
 * @param bool $passed
 * @param int $product_id
 * @param int $quantity
 * @return bool
 */
function olikdesign_add_to_cart_validation($passed, $product_id, $qty){

    if( isset( $_POST['_Wunschtext'] ) && sanitize_text_field( $_POST['_Wunschtext'] ) == '' ){
        $product = wc_get_product( $product_id );
        wc_add_notice( sprintf( __( '&rdquo;%s&rdquo; konnte nicht hinzugef&uuml;gt werden. Schreibe einen Wunschtext.', 'olikdesign-plugin-textdomain' ), $product->get_title() ), 'error' );
        return false;
    }

    return $passed;

}
add_filter( 'woocommerce_add_to_cart_validation', 'olikdesign_add_to_cart_validation', 10, 3 );
 /*
 * Add custom data to the cart item
 * @param array $cart_item
 * @param int $product_id
 * @return array
 */
function olikdesign_add_cart_item_data( $cart_item, $product_id ){

    if( isset( $_POST['_Wunschtext'] ) ) {
        $cart_item['Wunschtext'] = sanitize_text_field( $_POST['_Wunschtext'] );
    }

    return $cart_item;

}
add_filter( 'woocommerce_add_cart_item_data', 'olikdesign_add_cart_item_data', 10, 2 );
/*
 * Load cart data from session
 * @param array $cart_item
 * @param array $other_data
 * @return array
 */
function olikdesign_get_cart_item_from_session( $cart_item, $values ) {

    if ( isset( $values['Wunschtext'] ) ){
        $cart_item['Wunschtext'] = $values['Wunschtext'];
    }

    return $cart_item;

}
add_filter( 'woocommerce_get_cart_item_from_session', 'olikdesign_get_cart_item_from_session', 20, 2 );
/*
 * Add meta to order item
 * @param int $item_id
 * @param array $values
 * @return void
 */
function olikdesign_add_order_item_meta( $item_id, $values ) {

    if ( ! empty( $values['Wunschtext'] ) ) {
        woocommerce_add_order_item_meta( $item_id, 'Wunschtext', $values['Wunschtext'] );           
    }
}
add_action( 'woocommerce_add_order_item_meta', 'olikdesign_add_order_item_meta', 10, 2 );
/*
 * Get item data to display in cart
 * @param array $other_data
 * @param array $cart_item
 * @return array
 */
function olikdesign_get_item_data( $other_data, $cart_item ) {

    if ( isset( $cart_item['Wunschtext'] ) ){

        $other_data[] = array(
            'name' => __( 'Wunschtext', 'olikdesign-plugin-textdomain' ),
            'value' => sanitize_text_field( $cart_item['Wunschtext'] )
        );

    }

    return $other_data;

}
add_filter( 'woocommerce_get_item_data', 'olikdesign_get_item_data', 10, 2 );
/*
 * Show custom field in order overview
 * @param array $cart_item
 * @param array $order_item
 * @return array
 */
function olikdesign_order_item_product( $cart_item, $order_item ){

    if( isset( $order_item['Wunschtext'] ) ){
        $cart_item_meta['Wunschtext'] = $order_item['Wunschtext'];
    }

    return $cart_item;

}
add_filter( 'woocommerce_order_item_product', 'olikdesign_order_item_product', 10, 2 );
/* 
 * Add the field to order emails 
 * @param array $keys 
 * @return array 
 */ 
function olikdesign_email_order_meta_fields( $fields ) { 
    $fields['custom_field'] = __( 'Wunschtext', 'olikdesign-plugin-textdomain' ); 
    return $fields; 
} 
add_filter('woocommerce_email_order_meta_fields', 'olikdesign_email_order_meta_fields');
/*
 * Order Again
 * @param array $cart_item
 * @param array $order_item
 * @param obj $order
 * @return array
 */
function olikdesign_order_again_cart_item_data( $cart_item, $order_item, $order ){

    if( isset( $order_item['Wunschtext'] ) ){
        $cart_item_meta['Wunschtext'] = $order_item['Wunschtext'];
    }

    return $cart_item;

}
add_filter( 'woocommerce_order_again_cart_item_data',   'olikdesign_order_again_cart_item_data', 10, 3 );

So now i want to add this field to my ajax request but i cant solve it.

Here is my ajax code:

jQuery( function( $ ) {

    $(".single_add_to_cart_button").addClass("ajax_add_to_cart");

    $( ".post-type-archive-product" ).on( "click", ".quantity input", function() {
        return false;
        });

        $( ".archive" ).on( "change input", ".quantity .qty", function() {
            var add_to_cart_button = $( this ).parents( ".product" ).find( ".add_to_cart_button" );
            // For AJAX add-to-cart actions
            add_to_cart_button.data( "quantity", $( this ).val() );
            // For non-AJAX add-to-cart actions
            add_to_cart_button.attr( "href", "?add-to-cart=" + add_to_cart_button.attr( "data-product_id" ) + "&quantity=" + $( this ).val() );
                        $( '#mini-cart, .mini-cart-inner' ).addClass('active').fadeIn(1000);
                        $("body").addClass("overflow-hidden");
        });

        $(".input-text.qty.text").bind('keyup mouseup', function () {
            var value = $(this).val();
        $(".product_quantity").val(value)
        });

        if ( typeof wc_add_to_cart_params === 'undefined' )
            return false;



        $( document ).on( 'click', '.ajax_add_to_cart', function(e) {
            e.preventDefault();
            var $thisbutton = $(this);          
            var $variation_form = $( this ).closest( '.variations_form' );
            var var_id = $variation_form.find( 'input[name=variation_id]' ).val();
            $( '.ajaxerrors' ).remove();
            var item = {},
                check = true;
                variations = $variation_form.find( 'select[name^=attribute]' );
                if ( !variations.length) {
                    variations = $variation_form.find( '[name^=attribute]:checked' );
                }
                if ( !variations.length) {
                    variations = $variation_form.find( 'input[name^=attribute]' );
                }


            variations.each( function() {
                var $this = $( this ),
                    attributeName = $this.attr( 'name' ),
                    attributevalue = $this.val(),
                    index,
                    attributeTaxName;
                    $this.removeClass( 'error' );
                if ( attributevalue.length === 0 ) {
                    index = attributeName.lastIndexOf( '_' );
                    attributeTaxName = attributeName.substring( index + 1 );
                    $this
                        .addClass( 'required error' )
                        .before( '<div class="ajaxerrors"><p><i class="fas fa-exclamation-triangle"></i> Bitte ausw&auml;hlen:</p></div>' )
                    check = false;
                } else {
                    item[attributeName] = attributevalue;
                }
            } );
            if ( !check ) {
                return false;
            }

            if ( $thisbutton.is( '.ajax_add_to_cart' ) ) {
                $thisbutton.removeClass( 'added' );
                $(".cart-contents").removeClass("newadded");
                $thisbutton.addClass( 'loading' );
                if ($( this ).parents(".variations_form")[0]){
                var product_id = $variation_form.find('input[name=product_id]').val();
                var quantity = $variation_form.find( 'input[name=quantity]' ).val();

                                var data = {
                                action: 'olikdesign_ajax_add_to_cart_woo',
                                product_id: product_id,
                                quantity: quantity,
                                variation_id: var_id,
                                variation: item
                                };
                } else {
                var product_id = $(this).parent().find(".product_id").val();
                var quantity = $(this).parent().find(".qty").val();
                var data = {
                action: 'olikdesign_ajax_add_to_cart_woo_single',
                product_id: product_id,
                quantity: quantity
                };
                }

                $( 'body' ).trigger( 'adding_to_cart', [ $thisbutton, data ] );
                $.post( wc_add_to_cart_params.ajax_url, data, function( response ) {
                    if ( ! response )
                        return;
                    var this_page = window.location.toString();
                    this_page = this_page.replace( 'add-to-cart', 'added-to-cart' );
                    if ( response.error && response.product_url ) {
                        window.location = response.product_url;
                        return;
                    }
                    if ( wc_add_to_cart_params.cart_redirect_after_add === 'yes' ) {
                        window.location = wc_add_to_cart_params.cart_url;
                        return;
                    } else {
                        $thisbutton.removeClass( 'loading' );
                        var fragments = response.fragments;
                        var cart_hash = response.cart_hash;
                        if ( fragments ) {
                            $.each( fragments, function( key ) {
                                $( key ).addClass( 'updating' );
                            });
                        }
                        $( '#mini-cart, .mini-cart-inner' ).addClass('active').fadeIn(1000);
                        $("body").addClass("overflow-hidden");
                        $thisbutton.addClass( 'added' );
                        $(".cart-contents").addClass("newadded");
                        if ( fragments ) {
                            $.each( fragments, function( key, value ) {
                                $( key ).replaceWith( value );
                            });
                        }
                        $( '.widget_shopping_cart, .updating' ).stop( true ).css( 'opacity', '1' ).unblock();
                        $( '.shop_table.cart' ).load( this_page + ' .shop_table.cart:eq(0) &gt; *', function() {
                        $( '.shop_table.cart' ).stop( true ).css( 'opacity', '1' ).unblock();
                        $( document.body ).trigger( 'cart_page_refreshed' );
                        });
                        $( '.cart_totals' ).load( this_page + ' .cart_totals:eq(0) &gt; *', function() {
                        $( '.cart_totals' ).stop( true ).css( 'opacity', '1' ).unblock();
                    });
                    }
                });
                return false;
            } else {
                return true;
            }
        });
    });

I think it can be solved really easy but i cant see the solution. I think that this "$cart_item['Wunschtext']" has to save into my ajax as value but how?

Also i want to get the error message to work if the input is not entered.

I hope someone can help me.

Much love <3 for your time.

  • 写回答

1条回答 默认 最新

  • dounao2829 2019-02-26 20:28
    关注

    Added some code but it does not save the value:

    To my function:

        function olikdesign_ajax_add_to_cart_woo_callback() {
    

    // after ob_start();

        $wunschtext = $_POST['_wunschtext']; // Wunschtext
    
    
      error_log("Variation Product", 0);
      $passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity, $wunschtext);
    
      if ( $passed_validation && WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variation, $wunschtext  ) ) {
        do_action( 'woocommerce_ajax_added_to_cart', $product_id );
        if ( get_option( 'woocommerce_cart_redirect_after_add' ) == 'yes' ) {
          wc_add_to_cart_message( $product_id );
        }
    
        // Return fragments
        WC_AJAX::get_refreshed_fragments();
      }
    

    into my Ajax i added

    var wunschtext = $variation_form.find( 'input[name=_wunschtext]' ).val(); //Wunschtext
    

    and

     var data = {
                                action: 'olikdesign_ajax_add_to_cart_woo',
                                product_id: product_id,
                                quantity: quantity,
                                variation_id: var_id,
                                variation: item,
                                wunschtext: wunschtext  // Wunschtext
                                };
    

    I found this question already existing, but cant figure out where i need to add the underdash (_). Same issue here

    Hope you understand me.

    评论

报告相同问题?

悬赏问题

  • ¥15 matlab中使用gurobi时报错
  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂