Как показать проданные / отсутствующие товары на определенной странице архива категории Woocommerce, но не отобразить их на других? - PullRequest
1 голос
/ 09 января 2020

Я хочу отобразить элементы «Нет в наличии» на странице архива одной категории: «Проданные элементы».

Все остальные категории должны скрывать элементы «Нет в наличии».

'Скрыть нет в наличии товаров из каталога ', в настройках W C не отмечено.

У меня есть приведенный ниже код, который успешно скрывает отсутствующие товары, но я не могу получить функцию has_term () для работать правильно и отфильтровать страницу «Проданные предметы».

Я полагаю, что это может быть связано с тем, что я подключаюсь к pre_get_posts, и, возможно, это срабатывает до того, как добавлен термин «Проданные предметы».

Какое лучшее действие, чтобы зацепить? Или мне нужно разделить это на два крючка?

add_action( 'pre_get_posts', 'VG_hide_out_of_stock_products' ); 
function VG_hide_out_of_stock_products( $q ) {

    if ( ! $q->is_main_query() || is_admin() ) {
         return;
    }

    global $post;
    if ( !has_term( 'Sold Items', 'product_cat', $post->ID ) ) {
        if ( $outofstock_term = get_term_by( 'name', 'outofstock', 'product_visibility' ) ) {
            $tax_query = (array) $q->get('tax_query');
            $tax_query[] = array(
                'taxonomy' => 'product_visibility',
                'field' => 'term_taxonomy_id',
                'terms' => array( $outofstock_term->term_taxonomy_id ),
                'operator' => 'NOT IN'
            );
            $q->set( 'tax_query', $tax_query );
        }
    } 
}

1 Ответ

0 голосов
/ 04 февраля 2020

Лучше использовать высокоуровневый хук фильтра WooCommerce, указанный c, вместо низкоуровневого хука WordPress, который может вызвать головную боль и проблемы. (например, pre_get_posts) Для вашего сценария я предлагаю woocommerce_product_query_tax_query фильтр-крючок. Предполагая, что у вас есть категория со всеми продуктами, которых нет в наличии, с slug sold-items, конечный код может выглядеть примерно так:

add_filter( 'woocommerce_product_query_tax_query', 'vg_hide_out_of_stock_products' );

function vg_hide_out_of_stock_products( $tax_query ) {

    if( !is_shop() && !is_product_category() && !is_product_tag() ) {
        return $tax_query;
    }
    if( is_product_category('sold-items') ) {
        $tax_query[] = array(
            'taxonomy' => 'product_visibility',
            'field'    => 'slug',
            'terms'    => ['outofstock'],
            'operator' => 'IN',
        );
    } else {
        $tax_query[] = array(
            'taxonomy' => 'product_visibility',
            'field'    => 'slug',
            'terms'    => ['outofstock'],
            'operator' => 'NOT IN',
        );
    }
    return $tax_query;
}

PS: имена функций не чувствительны к регистру в PHP :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...