更改 WooCommerce 购物车项目名称

Posted

技术标签:

【中文标题】更改 WooCommerce 购物车项目名称【英文标题】:Changing WooCommerce cart item names 【发布时间】:2017-12-13 03:27:19 【问题描述】:

我们的目标是在商品传递到我们的支付网关时更改它的名称,但保持原样以显示在我们的产品页面上。

我已经在我的 functions.php 中尝试过这个:

function change_item_name( $item_name, $item ) 
    $item_name = 'mydesiredproductname';
    return $item_name;

add_filter( 'woocommerce_order_item_name', 'change_item_name', 10, 1 );

但这似乎对我不起作用。我觉得我应该传递一个实际的项目 ID 或其他东西……我有点迷茫。

任何关于我在这里做错的信息将不胜感激。

【问题讨论】:

【参考方案1】:

woocommerce_order_item_name过滤钩子是前端钩子,位于:

1) WooCommerce 模板:

emails/plain/email-order-items.php templates/order/order-details-item.php templates/checkout/form-pay.php 模板/电子邮件/email-order-items.php

2)WooCommerce 核心文件:

包括/class-wc-structured-data.php

它们每个都有 $item_name 共同的第一个参数,而其他参数则不同。 详情请见Here...

您在函数中设置了 2 个参数(第二个参数并非对所有模板都正确),并且您在钩子中只声明了一个。我已经测试了下面的代码:

add_filter( 'woocommerce_order_item_name', 'change_orders_items_names', 10, 1 );
function change_orders_items_names( $item_name ) 
    $item_name = 'mydesiredproductname';
    return $item_name;

它适用于

订单接收(谢谢)页面, 电子邮件通知 和我的帐户订单 > 单个订单详细信息

但不在购物车、结帐和后端订单编辑页面中。

因此,如果您需要使其在 Cart 和 Checkout 上运行,您应该使用其他钩子,例如 woocommerce_before_calculate_totals。 然后您可以使用 WC_Product methods(setter 和 getter)。

这是你的新代码

add_action( 'woocommerce_before_calculate_totals', 'custom_cart_items_prices', 10, 1 );
function custom_cart_items_prices( $cart ) 

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item ) 

        // Get an instance of the WC_Product object
        $product = $cart_item['data'];

        // Get the product name (Added Woocommerce 3+ compatibility)
        $original_name = method_exists( $product, 'get_name' ) ? $product->get_name() : $product->post->post_title;

        // SET THE NEW NAME
        $new_name = 'mydesiredproductname';

        // Set the new name (WooCommerce versions 2.5.x to 3+)
        if( method_exists( $product, 'set_name' ) )
            $product->set_name( $new_name );
        else
            $product->post->post_title = $new_name;
    

代码进入活动子主题(或主题)的任何 php 文件或任何插件 php 文件中。

现在除了商店档案和产品页面之外,您可以在任何地方更改名称……

此代码经过测试,可在 WooCommerce 2.5+ 和 3+ 上运行

如果您希望仅将原始商品名称保留在购物车中,您应该在函数中添加 conditional WooCommerce tag:

if( ! is_cart() )
    // The code

此答案已于 2017 年 8 月 1 日更新,以获得 woocommerce 兼容性之前的版本......

【讨论】:

谢谢!这仍然有效。但是,如果您希望它仅在管理员查看订单时在后端站点上进行更改,而不是在购物车/结帐/电子邮件等中更改呢? 您可能也在寻找 woocommerce_cart_item_name

以上是关于更改 WooCommerce 购物车项目名称的主要内容,如果未能解决你的问题,请参考以下文章

php [WooCommerce Core]每行更改产品数量(Woo主题)

php [WooCommerce Core]每行更改产品数量(Woo主题)

在 WooCommerce 中添加到购物车之前清空购物车

将 JavaScript 变量传递给 PHP,然后传递给 woo commerce 支持的电子商务网站中的购物车和订单项

在 WooCommerce 中更改特定的支付网关标题

WordPress Woocommerce中具有单独价格的产品项目