目标是在项目传递到我们的支付网关时更改项目的名称,但保留原样以便在我们的产品页面上显示。
我在我的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或者其他东西......我有点失落。
我非常感谢有关我在这里做错的任何信息。
答案 0 :(得分:6)
woocommerce_order_item_name
过滤器挂钩是一个前端挂钩,位于:
1)WooCommerce模板:
2)WooCommerce核心文件:
每个参数都有$ 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 ...