Передать пользовательское текстовое поле продукта в качестве данных о товаре в корзине в WooCommerce

#php #wordpress #woocommerce #product #custom-fields

#php #wordpress #woocommerce #продукт #пользовательские поля

Вопрос:

Цель здесь — иметь текстовое поле на странице продукта.

Клиент заполняет его и добавляет в корзину. Текст добавляется к товару и включается в корзину, а также при оформлении заказа.

Поле работает, и проверка работает нормально, но текст не включен / перенесен в корзину, оформление заказа.

Вот код:

 add_action( 'woocommerce_before_add_to_cart_button', 'product_add_on', 9 );
function product_add_on() {
    $value = isset( $_POST['_custom_text_add_on'] ) ? sanitize_text_field( $_POST['_custom_text_add_on'] ) : '';
    echo '<div><label>Custom Text Add-On <abbr class="required" title="required">*</abbr></label><p><input name="_custom_text_add_on" value="' . $value . '"></p></div>';
}

add_filter( 'woocommerce_add_to_cart_validation', 'product_add_on_validation', 10, 3 ); 
function product_add_on_validation( $passed, $product_id, $qty ){
    if( isset( $_POST['_custom_text_add_on'] ) amp;amp; sanitize_text_field( $_POST['_custom_text_add_on'] ) == '' ) {
        wc_add_notice( 'Custom Text Add-On is a required field', 'error' );
        $passed = false;
    }
    return $passed;
}

add_filter( 'woocommerce_add_cart_item_data', 'product_add_on_cart_item_data', 10, 2 ); 
function product_add_on_cart_item_data( $cart_item, $product_id ){
    if( isset( $_POST['_custom_text_add_on'] ) ) {
        $cart_item['custom_text_add_on'] = sanitize_text_field( $_POST['custom_text_add_on'] );
    }
    return $cart_item;
}

add_filter( 'woocommerce_get_item_data', 'product_add_on_display_cart', 10, 2 ); 
function product_add_on_display_cart( $_data, $cart_item ) {
    if ( isset( $cart_item['custom_text_add_on'] ) ){
        $data[] = array(
            'name' => 'Custom Text Add-On',
            'value' => sanitize_text_field( $cart_item['custom_text_add_on'] )
        );
    }
    return $data;
}

add_action( 'woocommerce_add_order_item_meta', 'product_add_on_order_item_meta', 10, 2 ); 
function product_add_on_order_item_meta( $item_id, $values ) {
    if ( ! empty( $values['custom_text_add_on'] ) ) {
        wc_add_order_item_meta( $item_id, 'Custom Text Add-On', $values['custom_text_add_on'], true );
    }
}

add_filter( 'woocommerce_order_item_product', 'product_add_on_display_order', 10, 2 );
function product_add_on_display_order( $cart_item, $order_item ){
    if( isset( $order_item['custom_text_add_on'] ) ){
        $cart_item_meta['custom_text_add_on'] = $order_item['custom_text_add_on'];
    }
    return $cart_item;
}

add_filter( 'woocommerce_email_order_meta_fields', 'product_add_on_display_emails' ); 
function product_add_on_display_emails( $fields ) { 
    $fields['custom_text_add_on'] = 'Custom Text Add-On';
    return $fields; 
}
  

Ответ №1:

Я скопировал код и провел быстрый тест и обнаружил, что у вас отсутствует подчеркивание _ для имени поля в двух функциях. Вы использовали $_POST['custom_text_add_on'] вместо $_POST['_custom_text_add_on'] в product_add_on_cart_item_data функции. Это была просто ошибка.

 add_filter( 'woocommerce_add_cart_item_data', 'product_add_on_cart_item_data', 10, 2 ); 
function product_add_on_cart_item_data( $cart_item, $product_id ){
    if( isset( $_POST['_custom_text_add_on'] ) ) {
        $cart_item['custom_text_add_on'] = sanitize_text_field( $_POST['_custom_text_add_on'] );
    }
    return $cart_item;
}
  

Надеюсь, вы решили проблему

Комментарии:

1. спасибо 🙂 Черт возьми .. чувствую себя слепым сегодня. Спасибо за хороший взгляд.

2. Ошибки @TomRonin являются обычными. Не волнуйтесь 🙂