Добавьте пользовательский вводимый текст продукта в качестве данных позиции заказа в WooCommerce - PullRequest
2 голосов
/ 30 сентября 2019

Я бы хотел добиться этого, не покупая плагин.

К сожалению, я не могу пройти этап проверки.

Вот мои шаги:

//1 Создание атрибута

add_action( 'woocommerce_product_options_general_product_data', 'create_custom_attribute' );

function create_custom_attribute() {
  $args = array(
    'id'            => 'attribute-embroided-text',
    'label'         => __( 'Embroided Text', 'woocommerce' ),
    'class'                 => 'myclass',
    'value'                 => 'placeholder',
    'desc_tip'      => true,
    'custom_attributes' => array('readonly' => 'readonly'),
  );
  woocommerce_wp_text_input( $args );

// 2 Сохранение атрибута

add_action( 'woocommerce_process_product_meta', 'save_custom_attribute' );

function cfwc_save_custom_field( $post_id ) {
    $product = wc_get_product( $post_id );
    $embroided_text = isset( $_POST['attribute-embroided-text'] ) ? $_POST['attribute-embroided-text'] : '';
    $product->update_meta_data( 'attribute-embroided-text', sanitize_text_field( $embroided_text ) );
}

// 3 Отображение атрибута в интерфейсе

add_action( 'woocommerce_before_single_variation', 'display_custom_attribute' );

function display_custom_attribute() {
    global $post;
    ...
    printf('<div class="">
              <h4 class="" for="attribute-embroided-text">Embroided Text/i</h4>
              <input class="form-control" type="text" id="attribute-embroided-text" name="attribute-embroided-text" value="">
            </div>');
    ...
}

// 4 Проверить атрибут


add_filter( 'woocommerce_add_to_cart_validation', 'validate_custom_attribute', 10, 4 );

function validate_custom_attribute( $passed, $product_id, $quantity ) {
    if(empty( $_POST['attribute-embroided-text'] ) ) {
        $passed = false;
        wc_add_notice( __( 'Field cannot be empty', 'woocommerce' ), 'error' );
    }
    return $passed;
}

// 5 Добавить атрибут в корзину

add_filter( 'woocommerce_add_cart_item_data', 'add_custom_attribute_to_cart', 10, 4 );

function add_custom_attribute_to_cart( $cart_item_data, $product_id, $variation_id, $quantity ) {
    if( ! empty( $_POST['attribute-embroided-text'] ) ) {
        $cart_item_data['attribute_embroided_text'] = $_POST['attribute-embroided-text'];
    } 
    return $cart_item_data;
}

// 6 Показать атрибут в корзине

add_filter( 'woocommerce_cart_item_name', 'display_custom_attribute_into_cart', 10, 3 );

function display_custom_attribute_into_cart( $name, $cart_item, $cart_item_key ) {
    if( isset( $cart_item['attribute_embroided_text'] ) ) {
        $name .= sprintf('<dl class="variation"><dt>Embroided Text/i:</dt><dd>%s</dd></dl>', esc_html( 
    $cart_item['attribute_embroided_text'] ));
    }
    return $name;
}

Таким образом, клиент сможет увидеть поле на странице товара, заполнить его и добавить товарв корзину и увидеть свой собственный текст на странице корзины. Все хорошо до сих пор.

Но потом, при выезде, я потерял информацию о вышитом тексте и не смог передать ее. Я не вижу его на странице резюме при отъезде. А на заднем плане у меня его нет в новом «заказе», который я только что получил.

Мои вопросы:

  • Есть ли объект "order", похожий на $ cart_item?

  • Как я могу получить к нему доступ? Как обычный массив? (например, $ cart_item ['attribute_embroided_text'])

  • Какие зацепки обрабатывают заказ? (интерфейс и фон )

  • Я все делаю неправильно? Вместо этого следует использовать варианты? (Я пытался, но я пришел к той же проблеме на кассе)

Вся проблема может быть обобщена в " как добавить дополнительные данные взаказ", но я не нашел много примеров или документации по нему.

Спасибо

1 Ответ

0 голосов
/ 01 октября 2019

Отсутствует следующая часть, которая сохранит данные вашей пользовательской корзины как данные позиции заказа и отобразит их везде в заказах и электронных письмах (даже в админке). ) :

add_action('woocommerce_checkout_create_order_line_item', 'save_custom_order_item_metadata', 10, 4 );
function save_custom_order_item_metadata( $item, $cart_item_key, $values, $order ) {
    if( isset( $cart_item['attribute_embroided_text'] ) ) 
        $item->update_meta_data( __( 'Embroided Text', 'woocommerce' ), $cart_item['attribute_embroided_text'] );
}

Код помещается в файл functions.php вашей активной дочерней темы (или активной темы). Это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...