Мне нужно изменить описание продукта, чтобы оно отображалось во всех уведомлениях клиентов. Итак, я пробовал следующий код:
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();
}
Я проверил оформление заказа, электронные письма и шаблоны заказов и даже не могу найти, где добавляется описание. Это может быть каким-то образом включено в переменную $order.
@LoicTheAztec Да, теперь я закодировал настраиваемые поля для ввода, но не уверен, какой хук следует использовать для изменения вывода по умолчанию для названия и описания продукта. Думал об использовании woocommerce_before_calculate_totals






Это пример в шаблоне:
// 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
Какой шаблон или фильтр находится здесь? Кроме того, как мне отредактировать описание, если не добавлено краткое описание?
Это не то, о чем спрашивает ОП. В своем коде ответа вы просто меняете краткое описание продукта, но не фильтруете его для позиций заказа в заказах / электронных письмах, в квитанциях PayPal и CC.
Я улучшил существующий код вашего дополнения, изменив поле ввода текста на текстовую область и изменив хук вашей последней функции:
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 для изменения описания может сработать.
Правильный хук, который следует использовать для PayPal, это woocommerce_paypal_args... Вот список всех связанных тем — Итак, теперь вы можете найти несколько полезных ответов и попытаться сделать свою собственную попытку кода. Если это не сработает, задайте новый вопрос, предоставив этот код, постаравшись четко объяснить, с какой проблемой вы столкнулись, со всеми необходимыми подробностями. Хорошее кодирование.
Я бы сначала проверил, не предлагают ли соответствующие шаблоны более конкретные хуки, которые можно было бы использовать для управления им только для этих мест. Если нет, то я полагаю, вам придется каким-то образом сделать свой код выше «контекстно-зависимым». Не уверен, как далеко могут продвинуться доступные условные теги — developer.wordpress.org/themes/basics/conditional-tags , woocommerce.com/document/conditional-tags, возможно, потребуется проверка определенных URL-адресов. также. (И тогда снова возникнет вопрос, как это будет работать, если что-то сработает в фоновом режиме через cron или что-то в этом роде.)