#wordpress #woocommerce #attributes
#wordpress #woocommerce woocommerce #атрибуты
Вопрос:
По умолчанию WooCommerce показывает атрибут переменного продукта в названии, и я использую этот код для отображения атрибута под заголовком на страницах корзины и оформления заказа:
add_filter( 'woocommerce_product_variation_title_include_attributes', '__return_false' );
add_filter( 'woocommerce_is_attribute_in_product_name', '__return_false' );
Но это не работает на странице «Моя учетная запись», пользователи видят полное название продукта без атрибута.
Чтобы исправить это, я использую приведенный ниже код для отображения атрибута в названии продукта:
function show_attributes_outside_title_1( $enabled ) {
if ( !is_account_page() ) {
$enabled = false;
}
return $enabled;
}
add_filter( 'woocommerce_product_variation_title_include_attributes', 'show_attributes_outside_title_1' );
function show_attributes_outside_title_2( $enabled ) {
if ( !is_account_page() ) {
$enabled = false;
}
return $enabled;
}
add_filter( 'woocommerce_is_attribute_in_product_name', 'show_attributes_outside_title_2' );
Но я хотел бы показать атрибут под заголовком (или новый столбец), его легче читать и он соответствует тому же дизайну, который вы видите на страницах корзины и оформления заказа.
Комментарии:
1. Вы можете переопределить шаблон WooCommerce
order-details-item.php
, расположенный в/plugins/woocommerce/order/order-details-item.php
. woocommerce.github.io/code-reference/files /…2. Я только что проверил этот файл, но правильный
order-downloads.php
. Но я бы хотел изменить это с помощью функции, чтобы по возможности не возиться с шаблонами.
Ответ №1:
В начальной части вопроса есть некоторая путаница.
Вы говорите, что хотите отобразить атрибут под названием продукта на странице корзины и оформления заказа, но затем вернетесь __return_false
, собираетесь ли вы сделать наоборот?
РЕШЕНИЕ №1
Вы можете отменить проверку, чтобы убедиться, что выбранный вами атрибут варианта продукта отображается под названием продукта на странице вашей учетной записи в разделе «Загрузки » (о чем свидетельствует ваш комментарий выше):
add_filter( 'woocommerce_product_variation_title_include_attributes', '__return_false' );
add_filter( 'woocommerce_is_attribute_in_product_name', '__return_false' );
add_filter( 'woocommerce_product_variation_title_include_attributes', 'show_attributes_outside_title_1' );
function show_attributes_outside_title_1( $enabled ) {
if ( is_account_page() ) {
$enabled = true;
}
return $enabled;
}
add_filter( 'woocommerce_is_attribute_in_product_name', 'show_attributes_outside_title_2' );
function show_attributes_outside_title_2( $enabled ) {
if ( ! is_account_page() ) {
$enabled = false;
}
return $enabled;
}
РЕШЕНИЕ № 2
Если вы хотите оставить код в своем вопросе без изменений, вы можете использовать woocommerce_account_downloads_column_download-product
хук, где download-product
находится идентификатор столбца «название продукта » (на странице / my-account / downloads / ). Вот документация.
Наконец, с wc_get_formatted_variation
помощью функции вы можете получить название выбранного варианта. Для получения дополнительной информации о параметрах ознакомьтесь с документацией.
// shows the variation chosen in the product name in the download table of the my-account page
add_action( 'woocommerce_account_downloads_column_download-product', 'change_product_download_name', 10, 1 );
function change_product_download_name( $download ) {
// gets the product object
$product = wc_get_product( $download['product_id'] );
// gets the name of the produc
$product_name = $download['product_name'];
// if the product is a variation
if ( $product->is_type( 'variation' ) ) {
// gets the name of the product with the chosen variation
$product_name = $product->get_name() . " - " . wc_get_formatted_variation( $product, true, false, false );
}
// print the product name (with or without product url)
if ( $download['product_url'] ) {
echo '<a href="' . esc_url( $download['product_url'] ) . '">' . esc_html( $product_name ) . '</a>';
} else {
echo esc_html( $product_name );
}
}
Код был протестирован и работает. Добавьте его в свою активную тему functions.php .
Комментарии:
1. Я тестировал ваш код, и я получал повторяющиеся атрибуты , поэтому я немного изменил его и получил его так же, как он выглядит в моей корзине . Я добавлю код в качестве нового ответа на случай, если он кому-нибудь еще понадобится. Спасибо за вашу помощь!
Ответ №2:
Я немного изменил ответ Винченцо, чтобы он выглядел так же, как я вижу атрибуты на страницах «Моя корзина» и «Оформить заказ». Вот код на случай, если он кому-нибудь еще понадобится:
// Shows the variation chosen in the product name in the download table of the my-account page
add_action( 'woocommerce_account_downloads_column_download-product', 'change_product_download_name', 10, 1 );
function change_product_download_name( $download ) {
// gets the product object
$product = wc_get_product( $download['product_id'] );
// gets the name of the product
$product_name = $download['product_name'];
// define variable
$product_attributes = '';
// if the product is a variation
if ( $product->is_type( 'variation' ) ) {
// gets the name of the product with the chosen variation
$product_name = $product->get_name();
$product_attributes = wc_get_formatted_variation( $product, true, true, false );
}
// print the product name (with or without product url)
if ( $download['product_url'] ) {
echo '<a href="' . esc_url( $download['product_url'] ) . '">' . esc_html( $product_name ) . '</a><p>' . esc_html( $product_attributes ) . '</p>';
} else {
echo esc_html( $product_name ) . '<p>' . esc_html( $product_attributes ) . '</p>';
}
}
// Shows variation outside title in cart and checkout pages
add_filter( 'woocommerce_product_variation_title_include_attributes', '__return_false' );
add_filter( 'woocommerce_is_attribute_in_product_name', '__return_false' );
Последние два фильтра заменяют мой код, а первая часть решает проблему на странице «Загрузки».
Комментарии:
1. Перед проверкой типа продукта
if ( $product->is_type( 'variation' ) ) {
вы должны инициализировать переменную$product_attributes
, иначе вы получите уведомлениеNotice: Undefined variable: product_attributes
, потому что переменная имеет значение только в том случае, если продукт является вариантом.2. Спасибо за предупреждение, я только что обновил код с учетом вашего предложения.