更改WooCommerce购物车项目名称

时间:2017-07-09 08:12:36

标签: php wordpress woocommerce checkout cart

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

我在我的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 个答案:

答案 0 :(得分:6)

woocommerce_order_item_name 过滤器挂钩是一个前端挂钩,位于:

1)WooCommerce模板:

  • 电子邮件/平纹/电子邮件阶items.php
  • 模板/顺序/次序-细节-item.php
  • 模板/结帐/形状pay.php
  • 模板/电子邮件/电子邮件阶items.php

2)WooCommerce核心文件:

  • 包括/类-WC-结构化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和吸气剂)。

这是您的新代码

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文件中。

现在除了Shop存档和产品页面之外,您已经更改了所有名称......

此代码已经过测试,适用于WooCommerce 2.5+和3 +

  

如果您希望仅将原始商品名称保留在购物车中,则应在功能中添加此conditional WooCommerce tag

if( ! is_cart() ){
    // The code
}

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