Отфильтруйте продукты из определенных пользовательских метаданных на странице магазина Woocommerce. - PullRequest
0 голосов
/ 05 декабря 2018

Мне нужно отфильтровать страницу магазина WooCommerce, и я хочу отображать только те товары, которые ожидают пользовательских метаданных продукта.Это то, что я нашел в archive-product.php:

/**
 * Hook: woocommerce_before_shop_loop.
 *
 * @hooked wc_print_notices - 10
 * @hooked woocommerce_result_count - 20
 * @hooked woocommerce_catalog_ordering - 30
 */
do_action( 'woocommerce_before_shop_loop' );
woocommerce_product_loop_start();
if ( wc_get_loop_prop( 'total' ) ) {
    while ( have_posts() ) {
        the_post();
        /**
         * Hook: woocommerce_shop_loop.
         *
         * @hooked WC_Structured_Data::generate_product_data() - 10
         */
        do_action( 'woocommerce_shop_loop' );
        wc_get_template_part( 'content', 'product' );
    }
}
woocommerce_product_loop_end();

Так как я могу передать значения фильтра в этой части, чтобы показывать только продукты с мета-ключом X и значением Y?

Обновление

Я пробовал это так, как сказал Лоик, но когда я проверяю более одного мета-значения, это вызывает проблемы, и я не вижу никаких продуктов:

add_filter( 'woocommerce_product_query_meta_query', 'show_only_products_with_specific_metakey', 10, 2 );
function show_only_products_with_specific_metakey( $meta_query, $query ) {
    // Only on shop pages
    if( ! is_shop() ) return $meta_query;

    $meta_query[] = array(
        'key'     => '_the_meta_key',
        'value'   => 'the_value',
        'compare' => 'EXIST'
    );

    //Don't works when adding the second one
    $meta_query[] = array(
        'key'     => '_the_meta_key',
        'value'   => 'the_value_2',
        'compare' => 'EXIST'
    );


    return $meta_query;
};

У меня есть два продукта:

  • Продукт A -> Имеет the_value_2
  • Продукт B -> Имеет the_value

ИтакЯ ожидаю эти два продукта здесь.Когда я удаляю второй meta_query, я получаю только продукт B.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы можете использовать пользовательскую функцию, подключенную к фильтру woocommerce_product_query_meta_query, где вы замените _the_meta_key в приведенном ниже коде на целевую meta_key:

add_filter( 'woocommerce_product_query_meta_query', 'show_only_products_with_specific_metakey', 10, 2 );
function show_only_products_with_specific_metakey( $meta_query, $query ) {
    // Only on shop pages
    if( ! is_shop() ) return $meta_query;

    $meta_query[] = array(
        'key'     => '_the_meta_key',
        'compare' => 'EXIST'
    );
    return $meta_query;
}

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


Добавление (связано с вашим последним комментарием):

Чтобы это работало для нескольких мета-значений, вам нужно использовать 'compare' => 'IN', например:

add_filter( 'woocommerce_product_query_meta_query', 'show_only_products_with_specific_metakey', 10, 2 );
function show_only_products_with_specific_metakey( $meta_query, $query ) {
    // Only on shop pages
    if( ! is_shop() ) return $meta_query;

    $meta_query[] = array(
        'key'     => '_the_meta_key',
        'value'     => array('L','XL'),
        'compare' => 'IN'
    );
    return $meta_query;
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы).Протестировано и работает.

Документация мета-запроса WP

0 голосов
/ 05 декабря 2018

Вы можете использовать do_action( 'woocommerce_shop_loop' );

function ctm_loop_53631963(){
    global $post;
    $meta = get_post_meta($post->ID, 'meta_value_key')
    if($meta !== 'desired_value'){
        continue;
    }
}

do_action('woocommerce_shop_loop', 'ctm_loop_53631963');

Подробнее о действиях WordPress Плагин API / Справочник действий

...