Цель состоит в том, чтобы изменить название элемента, поскольку оно передается нашему платежному шлюзу, но оставляйте его как есть для отображения на наших страницах продукта.
Я пробовал это в моих 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 );
Но, похоже, это не работает для меня. Я чувствую, что мне нужно передать фактический идентификатор предмета или что-то в этом роде. Я немного потерялся.
Любая информация о том, что я делаю неправильно здесь, будет очень признательна.
благодаря
woocommerce_order_item_name
фильтра woocommerce_order_item_name
является интерфейсным крюком и расположен в:
1) Шаблоны WooCommerce:
2) Основной файл WooCommerce:
Каждый из них имеет первый аргумент $ item_name, а другой для других аргументов.
См. Здесь для более подробной информации …
У вас есть 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 и getters).
Вот ваш новый код
add_filter( 'woocommerce_before_calculate_totals', 'custom_cart_items_prices', 10, 1 ); function custom_cart_items_prices( $cart_object ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // Iterating through cart items foreach ( $cart_object->get_cart() as $cart_item ) { // Get an instance of the WC_Product object $wc_product = $cart_item['data']; // Get the product name (WooCommerce versions 2.5.x to 3+) $original_name = method_exists( $wc_product, 'get_name' ) ? $wc_product->get_name() : $wc_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( $wc_product, 'set_name' ) ) $wc_product->set_name( $new_name ); else $wc_product->post->post_title = $new_name; } }
Код отправляется в любой php-файл вашей активной дочерней темы (или темы), а также в любой файл php-плагина.
Теперь вы меняете имена везде, кроме архивов магазинов и страниц продуктов …
Этот код протестирован и работает с версией WooCommerce с версии 2.5.x до 3.1+
Если вы хотите сохранить оригинальные имена элементов в корзине, вы должны добавить этот условный тег WooCommerce внутри функции:
if( ! is_cart() ){ // The code }
Этот ответ был обновлен 1 августа 2017 года, чтобы получить совместимость с предыдущими версиями woocommerce …