Добавьте поле примечания к продукту на страницах отдельных продуктов в Woocommerce

Я хочу создать примечание индивидуального заказа на странице сведений о один продукт для пользователя. Это можно сделать с помощью php без плагина. Я приложил снимок экрана и URL сайта для справки.

Они пытались использовать этот код в function.php, чтобы он работал на странице оформления заказа, а не на странице информация о продукте. Кто-нибудь поможет мне добиться этого.

add_action('woocommerce_after_order_notes', 'customise_checkout_field');

    function customise_checkout_field($checkout)
    {
    echo '<div id = "customise_checkout_field"><h2>' . __('Heading') . '</h2>';
    woocommerce_form_field('customised_field_name', array(
    'type' => 'text',
    'class' => array(
    'my-field-class form-row-wide'
    ) ,
    'label' => __('Customise Additional Field') ,
    'placeholder' => __('Guidence') ,
    'required' => true,
    ) , $checkout->get_value('customised_field_name'));
    echo '</div>';
    }

URL веб-сайта

Добавьте поле примечания к продукту на страницах отдельных продуктов в Woocommerce

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
7 563
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вы используете крючок именно для страницы оформления заказа. Вот наглядное руководство Хуков для страницы товара.

По категориям доступны 2 крючка:

  • woocommerce_product_meta_end
  • woocommerce_share

Итак, просто замените

woocommerce_after_order_notes

с участием

woocommerce_product_meta_end

в вашем add_action ()

add_action('woocommerce_product_meta_end', 'customise_checkout_field');

function customise_checkout_field($checkout)
{
echo '<div id = "customise_checkout_field"><h2>' . __('Heading') . '</h2>';
woocommerce_form_field('customised_field_name', array(
'type' => 'text',
'class' => array(
'my-field-class form-row-wide'
) ,
'label' => __('Customise Additional Field') ,
'placeholder' => __('Guidence') ,
'required' => true,
) , $checkout->get_value('customised_field_name'));
echo '</div>';
}

вы проверили визуальное руководство? ваша функция создает ошибку?

Tobias 29.05.2018 08:58

я проверил этот хук ... он работает нормально, возможно, ваша функция делает ошибки

Tobias 29.05.2018 09:06

Не уверен в этом. Просто заменил твой код. в любом случае спасибо за ваши усилия

Saravana 29.05.2018 09:23

Ниже приведен полный алгоритм добавления настраиваемого поля на страницу продукта, и это значение будет сохранено, отображено в деталях заказа и по электронной почте.

  // Display custom field on single product page
    function d_extra_product_field(){
        $value = isset( $_POST['extra_product_field'] ) ? sanitize_text_field( $_POST['extra_product_field'] ) : '';
        printf( '<label>%s</label><input name = "extra_product_field" value = "%s" />', __( 'Enter your custom text' ), esc_attr( $value ) );
    }
    add_action( 'woocommerce_before_add_to_cart_button', 'd_extra_product_field', 9 );

    // validate when add to cart
    function d_extra_field_validation($passed, $product_id, $qty){

        if ( isset( $_POST['extra_product_field'] ) && sanitize_text_field( $_POST['extra_product_field'] ) == '' ){
            $product = wc_get_product( $product_id );
            wc_add_notice( sprintf( __( '%s cannot be added to the cart until you enter some text.' ), $product->get_title() ), 'error' );
            return false;
        }

        return $passed;

    }
    add_filter( 'woocommerce_add_to_cart_validation', 'd_extra_field_validation', 10, 3 );

     // add custom field data in to cart
    function d_add_cart_item_data( $cart_item, $product_id ){

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

        return $cart_item;

    }
    add_filter( 'woocommerce_add_cart_item_data', 'd_add_cart_item_data', 10, 2 );

    // load data from session
    function d_get_cart_data_f_session( $cart_item, $values ) {

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

        return $cart_item;

    }
    add_filter( 'woocommerce_get_cart_item_from_session', 'd_get_cart_data_f_session', 20, 2 );


    //add meta to order
    function d_add_order_meta( $item_id, $values ) {

        if ( ! empty( $values['extra_product_field'] ) ) {
            woocommerce_add_order_item_meta( $item_id, 'extra_product_field', $values['extra_product_field'] );           
        }
    }
    add_action( 'woocommerce_add_order_item_meta', 'd_add_order_meta', 10, 2 );

    // display data in cart
    function d_get_itemdata( $other_data, $cart_item ) {

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

            $other_data[] = array(
                'name' => __( 'Your extra field text' ),
                'value' => sanitize_text_field( $cart_item['extra_product_field'] )
            );

        }

        return $other_data;

    }
    add_filter( 'woocommerce_get_item_data', 'd_get_itemdata', 10, 2 );


    // display custom field data in order view
    function d_dis_metadata_order( $cart_item, $order_item ){

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

        return $cart_item;

    }
    add_filter( 'woocommerce_order_item_product', 'd_dis_metadata_order', 10, 2 );


    // add field data in email
    function d_order_email_data( $fields ) { 
        $fields['extra_product_field'] = __( 'Your extra field text' ); 
        return $fields; 
    } 
    add_filter('woocommerce_email_order_meta_fields', 'd_order_email_data');

    // again order
    function d_order_again_meta_data( $cart_item, $order_item, $order ){

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

        return $cart_item;

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

можно добавить произвольный текст над крючком woocommerce_product_meta_end?

Saravana 29.05.2018 09:33

Я тоже нашел частично использующий этот kathyisawesome.com/add-a-custom-field-to-woocommerce-product‌. Я хочу, чтобы пользовательский текст был после мета продукта

Saravana 29.05.2018 09:34

Да, это основано на приведенной выше ссылке, которую вы можете добавить в функцию d_extra_product_field после поля.

dipmala 29.05.2018 09:36

Да. Но мне нужно добавить в заметку раздел под артикулом и категориями в соответствии с моим снимком экрана.

Saravana 29.05.2018 09:54

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

dipmala 29.05.2018 09:57
Ответ принят как подходящий

Чтобы заставить его работать так, как вы хотите, попробуйте следующий код, в котором ваше примечание о продукте будет отображаться на странице продукта под мета продукта. В моем коде я добавил скрытое поле в форму добавления в корзину, а некоторый код jQuery добавит содержимое поля textarea в скрытое поле на лету. Таким образом, информация о продукте может быть впоследствии сохранена в элементе корзины как пользовательские данные.

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

// Add a custom product note below product meta in single product pages
add_action('woocommerce_single_product_summary', 'custom_product_note', 100 );
function custom_product_note() {

    echo '<br><div>';

    woocommerce_form_field('customer_note', array(
        'type' => 'textarea',
        'class' => array( 'my-field-class form-row-wide') ,
        'label' => __('Product note') ,
        'placeholder' => __('Add your note here, please…') ,
        'required' => false,
    ) , '');

    echo '</div>';

    //
    ?>
    <script type = "text/javascript">
    jQuery( function($){
        $('#customer_note').on( 'input blur', function() {
            $('#product_note').val($(this).val());
        });
     });
    </script>

    <?php
}

// Custom hidden field in add to cart form
add_action( 'woocommerce_before_add_to_cart_button', 'hidden_field_before_add_to_cart_button', 5 );
function hidden_field_before_add_to_cart_button(){
    echo '<input type = "hidden" name = "product_note" id = "product_note" value = "">';
}

// Add customer note to cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_product_note_to_cart_item_data', 20, 2 );
function add_product_note_to_cart_item_data( $cart_item_data, $product_id ){
    if ( isset($_POST['product_note']) && ! empty($_POST['product_note']) ){
        $product_note = sanitize_textarea_field( $_POST['product_note'] );
        $cart_item_data['product_note'] = $product_note;
    }
    return $cart_item_data;
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). Проверено и работает.


Если вы хотите отобразить это поле после кнопки добавления в корзину, вы будете использовать этот более короткий код:

// Add a custom product note after add to cart button in single product pages
add_action('woocommerce_after_add_to_cart_button', 'custom_product_note', 10 );
function custom_product_note() {

    echo '<br><div>';

    woocommerce_form_field('product_note', array(
        'type' => 'textarea',
        'class' => array( 'my-field-class form-row-wide') ,
        'label' => __('Product note') ,
        'placeholder' => __('Add your note here, please…') ,
        'required' => false,
    ) , '');

    echo '</div>';
}

// Add customer note to cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_product_note_to_cart_item_data', 20, 2 );
function add_product_note_to_cart_item_data( $cart_item_data, $product_id ){
    if ( isset($_POST['product_note']) && ! empty($_POST['product_note']) ){
        $product_note = sanitize_textarea_field( $_POST['product_note'] );
        $cart_item_data['product_note'] = $product_note;
    }
    return $cart_item_data;
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). Проверено и работает.


Данные этого настраиваемого элемента корзины доступны следующим образом:

foreach( WC()->cart->get_cart() as $cart_item ){
    if ( isset($cart_item['product_note']) )
       echo $cart_item['product_note'];
}

Чтобы добавить информацию, расположение textarea находится за пределами form, следовательно, для решения проблемы необходим jQuery. :)

Reigel 29.05.2018 10:37

@LoicTheAztec: добавленный текст не отображается на странице заказа и корзины

Saravana 31.05.2018 05:06

@LoicTheAztec Я хочу отобразить на странице сведений о продукте, но дело в том, что введенные данные будут отображаться на странице корзины и оформления заказа, и, наконец, данные могут быть видны из раздела заказа на панели инструментов.

Saravana 31.05.2018 08:03

@LoicTheAztec хорошо

Saravana 31.05.2018 10:19

Другие вопросы по теме