我需要修改产品说明以显示在所有客户通知上.因此,我try 了以下代码:

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;
}

但这段代码在任何地方都会更改描述.我only需要它更改后的产品已购买,以显示在订单邮箱和付款收据等定制描述…不更改产品说明或简短说明

Note :此问题与订单、邮箱通知、PayPal和抄送收据上显示的说明有关.描述可以从产品描述或简短描述中生成,因此任何解决方案都应该过滤/修改它们,以便在订单、邮箱通知、PayPal和抄送收据中显示.


更新-代码添加:

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();
}

推荐答案

我改进了添加的现有代码,用文本区域更改了文本输入字段,并更改了最后一个函数的钩子:

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 页面上显示它(根据需要):

// 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;
}

然后将"Item Description"自定义字段保存为订单项目元数据,以便在所有订单和邮箱通知中显示它:

// 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;
}

对 checkout 、订单和邮箱通知进行测试和工作.

Remaining (untested):你需要在贝宝和抄送收据上测试这一点.如果对这些不起作用,你应该问一个新的问题,特别是关于贝宝和抄送收据的问题.

Php相关问答推荐

在AJX请求中使用简写后,FormData出现非法调用错误

Postgrid Webhook不叫laravel

根据在WooCommerce购物车和 checkout 中 Select 的送货方式显示快捷代码内容

如何减少Laravel分页中的链接数

在内部API请求之后,在响应客户端之前,是否忘记了PHP中的Header()?

如何删除Foreach语句中的重复值?

Mod_重写子目录中相应的php文件

将部分产品排除在WooCommerce的计算附加费之外

在WooCommerce中添加特定产品类型的百分比费用和固定费用

限制联系人页面仅允许在WooCommerce中登录的用户

以编程方式同步 WPML 翻译更改 Woocommerce 产品销售价格

需要以一种形式执行两个操作

用于更新 WooCommerce 管理产品列表中库存数量的自定义输入字段

如何限制 woocommerce 中相关产品的标题长度

如何设置Mailersend PHP API 模板变量?

.htaccess环境变量条件不被判断

Woocommerce API 的 PHP Curl 附加参数

如何在 laravel 中的同一个 slug 上显示不同的内容?

将变量从中间件传递到控制器 Laravel

Laravel 10 单元测试看不到来自 Artisan Command 的数据库更改