Показать название выбранного варианта под названием продукта на странице «Мой аккаунт»> «Загрузки»

#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. Спасибо за предупреждение, я только что обновил код с учетом вашего предложения.