Пользовательское описание продукта для заказов WooCommerce и уведомлений по электронной почте

Мне нужно изменить описание продукта, чтобы оно отображалось во всех уведомлениях клиентов. Итак, я пробовал следующий код:

add_filter( 'woocommerce_get_item_data', 'wc_checkout_description_so_15127954', 10, 2 );
function wc_checkout_description_so_15127954( $other_data, $cart_item ) {
    $post_data = get_post( $cart_item['product_id'] );
    $custom = get_post_meta( get_the_ID(), 'order_description', true );        
    $other_data[] = array( 'name' =>  $post_data->$custom );
    return $other_data;
}

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

Примечание. Эта проблема связана с отображаемым описанием заказов, уведомлений по электронной почте, квитанций PayPal и CC. Описание может быть сгенерировано из описания продукта ИЛИ из краткого описания, поэтому любое решение должно фильтровать/изменять их оба только для отображения в заказах, уведомлениях по электронной почте, квитанциях PayPal и CC.


Обновление - добавление кода:

add_action( 'woocommerce_product_options_general_product_data', 'custom_description_custom_field' );
function custom_description_custom_field() {

    $args = array(
        'id' => 'order_description',
        'label' => __( 'Order Description', '$text_domain' ),
        'class' => 'product-description-field',
        'desc_tip' => true,
        'description' => __( 'Custom Order Description Shown on PayPal, Credit Card, reciept, checkout & order email.', '$text_domain' ),
    );

    woocommerce_wp_text_input( $args );
}

add_action( 'woocommerce_process_product_meta', 'save_custom_description_custom_field' );
function save_custom_description_custom_field( $post_id ) {
    $product = wc_get_product( $post_id );
    $title   = isset( $_POST['order_description'] ) ? $_POST['order_description'] : '';

    $product->update_meta_data( 'order_description', sanitize_text_field( $title ) );
    $product->save();
}

Я бы сначала проверил, не предлагают ли соответствующие шаблоны более конкретные хуки, которые можно было бы использовать для управления им только для этих мест. Если нет, то я полагаю, вам придется каким-то образом сделать свой код выше «контекстно-зависимым». Не уверен, как далеко могут продвинуться доступные условные теги — developer.wordpress.org/themes/basics/conditional-tags , woocommerce.com/document/conditional-tags, возможно, потребуется проверка определенных URL-адресов. также. (И тогда снова возникнет вопрос, как это будет работать, если что-то сработает в фоновом режиме через cron или что-то в этом роде.)

CBroe 07.07.2023 08:40

Я проверил оформление заказа, электронные письма и шаблоны заказов и даже не могу найти, где добавляется описание. Это может быть каким-то образом включено в переменную $order.

Michelle 07.07.2023 08:43

@LoicTheAztec Да, теперь я закодировал настраиваемые поля для ввода, но не уверен, какой хук следует использовать для изменения вывода по умолчанию для названия и описания продукта. Думал об использовании woocommerce_before_calculate_totals

Michelle 07.07.2023 20:40
Стоит ли изучать 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 и хотите разрабатывать...
2
3
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это пример в шаблоне:

// Optional: get the WC_product Object instance from the post ID
$product_id = $post->ID; // or get_the_id()
$product    = wc_get_product( $product_id );

// The product short description (for testing)
$new_short_description = "<strong>Here</strong> is is the product short 
description content."

$product->set_short_description( $new_short_description ); 
// Add/Set the new short description
$product->save(); // Store changes in database

Какой шаблон или фильтр находится здесь? Кроме того, как мне отредактировать описание, если не добавлено краткое описание?

Michelle 07.07.2023 10:42

Это не то, о чем спрашивает ОП. В своем коде ответа вы просто меняете краткое описание продукта, но не фильтруете его для позиций заказа в заказах / электронных письмах, в квитанциях PayPal и CC.

LoicTheAztec 07.07.2023 19:32
Ответ принят как подходящий

Я улучшил существующий код вашего дополнения, изменив поле ввода текста на текстовую область и изменив хук вашей последней функции:

add_action( 'woocommerce_product_options_general_product_data', 'custom_description_custom_field' );
function custom_description_custom_field() {

    $args = array(
        'id' => 'item_description',
        'label' => __( 'Custom description', '$text_domain' ),
        'class' => 'product-description-field',
        'desc_tip' => true,
        'description' => __( 'Custom Order Description Shown on PayPal, Credit Card, reciept, checkout & order email.', '$text_domain' ),

    );

    woocommerce_wp_text_input( $args );

}

add_action( 'woocommerce_admin_process_product_object', 'save_custom_description_custom_field' );
function save_custom_description_custom_field( $product ) {
    $title = isset( $_POST['order_description'] ) ? $_POST['item_description'] : '';
    $product->update_meta_data( 'item_description', sanitize_text_field( $title ) );
}

Теперь нам нужно сначала отобразить его на странице оформления заказа (по мере необходимости):

// Checkout: Display "Item description" custom field
add_filter( 'woocommerce_checkout_cart_item_quantity', 'checkout_custom_field_item_description_display', 10, 2 );
function checkout_custom_field_item_description_display( $item_qty, $cart_item ) {
    if ( $item_description = $cart_item['data']->get_meta('item_description') ) {
        $text_domain = 'woocommerce';
        $item_qty .= sprintf('<br>
        <div class = "item-description"><span>%s</span><br> 
        <small>%s</small></div>', __('Description:', $text_domain), $item_description );
    }
    return $item_qty;
}

Затем сохраните это настраиваемое поле «Описание товара» в качестве метаданных элемента заказа, что позволит отображать его во всех заказах и уведомлениях по электронной почте:

// Save "Item description" custom field value as order item metadata and display on orders / emails
add_action( 'woocommerce_checkout_create_order_line_item', 'save_custom_fields_as_order_item_metadata', 10, 4 );
function save_custom_fields_as_order_item_metadata( $item, $cart_item_key, $values, $order ) {
    if ( $item_description = $values['data']->get_meta('item_description') ) {
        $item->add_meta_data('item_description', $item_description);
    }
}

// Have a readable "meta key" label name replacement
add_filter( 'woocommerce_order_item_display_meta_key', 'filter_order_item_display_meta_key', 10, 3 );
function filter_order_item_display_meta_key( $display_key, $meta, $item ) {
    if ( $display_key === 'item_description' ) {
        $text_domain = 'woocommerce';
        $display_key = __('Description', $text_domain);
    }
    return $display_key;
}

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

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

Спасибо, но единственная проблема заключается в том, что описание продукта по умолчанию уже отображается на экране покупателей PayPal > Действия > Отправленные платежи > Детали транзакции > Детали заказа. Мне нужно отфильтровать или удалить это, так как ваш код добавляет собственное описание. Вот почему я подумал, что использование хука woocommerce_before_calculate_totals для изменения описания может сработать.

Michelle 08.07.2023 07:57

Правильный хук, который следует использовать для PayPal, это woocommerce_paypal_args... Вот список всех связанных тем — Итак, теперь вы можете найти несколько полезных ответов и попытаться сделать свою собственную попытку кода. Если это не сработает, задайте новый вопрос, предоставив этот код, постаравшись четко объяснить, с какой проблемой вы столкнулись, со всеми необходимыми подробностями. Хорошее кодирование.

LoicTheAztec 08.07.2023 09:59

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