Использование собственной таксономии для короткого кода товаров в Woocommerce 3.3 - PullRequest
0 голосов
/ 01 июня 2018

В настоящее время я разрабатываю домашнюю страницу для веб-сайта Woocommerce, и на этой странице цель состоит в том, чтобы в 3 рядах отображались товары разных брендов.Пример;В строке 1 будут отображаться продукты Apple, в строке 2 - продукты Samsung, а в строке 3 - продукты HTC.

Я использовал дополнительный интерфейс CPT для создания пользовательской таксономии «Бренд».Теперь я хочу использовать приведенный выше пример для отображения только продуктов, перечисленных под определенным брендом.

Просматривая шорткоды Woocommerce, я увидел следующее:

[products limit="8" columns="4" category="hoodies, tshirts" cat_operator="AND"]

Есть ли что-нибудь подобное?это с пользовательской таксономией для этого случая брендов?IE:

[products limit="8" columns="4" brand="apple" cat_operator="AND"]

Любая помощь или толчки в правильном направлении очень ценятся!

1 Ответ

0 голосов
/ 01 июня 2018

Можно расширить Woocommerce [products] шорткод, чтобы обрабатывать любые пользовательские таксономии, такие как "brand" с некоторыми хитростями.

Код:

add_filter( 'woocommerce_shortcode_products_query', 'extend_products_shortcode_to_brand', 10, 3 );
function extend_products_shortcode_to_brand( $query_args, $atts, $loop_name ){
    if ( ! empty($atts['class']) && strpos($atts['class'], 'brand') !== false ) {
        global $wpdb;

        $terms = array_map( 'sanitize_title', explode( ',', $atts['class'] ) );
        array_shift( $terms );
        $terms = implode(',', $terms);
        $terms = str_replace(",", "','", $terms);

        $ids = $wpdb->get_col( "
            SELECT DISTINCT tr.object_id
            FROM {$wpdb->prefix}term_relationships as tr
            INNER JOIN {$wpdb->prefix}term_taxonomy as tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
            INNER JOIN {$wpdb->prefix}terms as t ON tt.term_id = t.term_id
            WHERE tt.taxonomy LIKE 'brand' AND t.slug IN ('$terms')
        " );

        if ( ! empty( $ids ) ) {
            if ( 1 === count( $ids ) ) {
                $query_args['p'] = $ids[0];
            } else {
                $query_args['post__in'] = $ids;
            }
        }
    }
    return $query_args;
}

Код входит в функциюФайл .php вашей активной дочерней темы (или активной темы).Проверено и работает.


ИСПОЛЬЗОВАНИЕ

Мы будем использовать аргумент шорткода class здесь:

1) Один бренд - Отображение продуктов от бренда "Apple":

[products limit="8" columns="4" class="brand,Apple"]

2) несколько брендов - Отображение продуктов от брендов "Apple" и "Samsung":

[products limit="8" columns="4" class="brand,Apple,Samsung"]

Итак, класс "brand" является обязательным и должен быть первым.Каждый термин отделяется от комы.

...