从Entrada主题的特定页面上的产品类别中排除产品

时间:2018-07-30 13:38:48

标签: wordpress woocommerce categories product hook-woocommerce

我想在“我们的游览”页面(子弹“ our-tours-ru”)的woocommerce类别“游览”(子弹“ excursions-ru”)中排除所有产品/旅游。这是this page

我发现了this solution here,所以我在下面使用了这段代码,但是对我来说不起作用。

找不到我的错误在哪里。

add_filter( 'get_terms', 'get_subcategory_terms', 10, 3 );
function get_subcategory_terms( $terms, $taxonomies, $args ) {
    $new_terms = array();
    // if a product category and on the shop page
    // to hide from shop page, replace is_page('YOUR_PAGE_SLUG') with is_shop()
    if ( in_array( 'product_cat', $taxonomies ) && ! is_admin() && is_page('our-tours-ru') ) {
        foreach ( $terms as $key => $term ) {
            if ( ! in_array( $term->slug, array( 'excursions-ru' ) ) ) {
                $new_terms[] = $term;
            }
        }
        $terms = $new_terms;
    }
    return $terms;
}

4 个答案:

答案 0 :(得分:4)

更新1 (如下所示)

  

get_terms过滤钩并非用于过滤产品,因此在您的情况下不方便。

Woocommerce有3个专用的挂钩可对产品查询(过滤产品) 进行定制:

  • woocommerce_product_query (动作挂钩)
  • woocommerce_product_query_meta_query (过滤器挂钩)
  • woocommerce_product_query_tax_query (过滤器挂钩)

我们将使用最后一个,因为它是适合您的情况的最佳选择。

现在要仅在特定页面上启用此功能,我们将使用WordPress is_page()条件标记:

add_filter( 'woocommerce_product_query_tax_query', 'custom_exclude_products', 50, 2 );
function custom_exclude_products( $tax_query, $query ) {
    // Only on a specific page
    if( is_page('our-tours-ru') ){
        $tax_query[] = array(
            'taxonomy'  => 'product_cat',
            'field'     => 'slug',
            'terms'     => array('excursions-ru'),
            'operator'  => 'NOT IN'
        );
    }
    return $tax_query;
}

代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以正常工作。


更新:

在页面上,您肯定是在使用Woocommerce简码在此特定页面上显示产品。

因此在这种情况下,有一个专门用于Woocommerce短代码的钩子:

add_filter( 'woocommerce_shortcode_products_query', 'custom_shortcode_exclude_products', 50, 3 );
function custom_shortcode_exclude_products( $query_args, $atts, $loop_name ){
    if( is_page('our-tours-ru') ){
        $query_args['tax_query'] = array( array(
           'taxonomy' => 'product_cat',
            'field' => 'slug',
            'terms' => array( 'excursions-ru' ),
            'operator' => 'NOT IN'
        ) );
    }
    return $query_args;
}

代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以正常工作……它也应该为您工作。

  

您需要确保此产品显示在 Wordpress PAGE上,但提示为“ our-tours-ru” ,因为如果没有答案,那么该产品将对您有用。


使用pre_get_posts过滤器,几乎可以在大多数情况下使用的可能性:

add_filter( 'pre_get_posts', 'custom_query_exclude_products', 900, 1 );
function custom_query_exclude_products( $query ) {
    if ( is_admin() || is_search() ) return $query;

    if ( is_page('our-tours-ru') ){
        $query->set( 'tax_query', array( array(
            'taxonomy' => 'product_cat',
            'field'    => 'slug',
            'terms'    => array( 'excursions ru' ),
            'operator' => 'NOT IN'
        ) ) );
    }

    remove_action( 'pre_get_posts', 'custom_query_exclude_products' );

    return $query;
}

代码进入活动子主题(或活动主题)的function.php文件。

答案 1 :(得分:1)

(由于现有答案均不适合您,并且您使用的是儿童主题,因此我发布了此答案,该答案特定于您目前在Entrada theme上使用的your site 。)

如我们所见,“我们的游览”页面使用的是“ 列出全宽(三列网格)”模板,该模板在父主题中位于{{1 }},并使用此模板部分entrada/entrada_templates/listing-full-width-3column-grid.php

如果打开它,则会看到此自定义查询

entrada/template-parts/grid-threecolumn.php

“我们的游览”页面上用于主要产品部分/网格的

因此,从您的查询中排除“短途旅行”类别或从该类别中排除产品的一种简便方法(可能会起作用)是将$args = array( 'post_type' => 'product', 'posts_per_page' => $posts_per_page, 'paged' => 1 ); $args = entrada_product_type_meta_query($args, 'tour' ); $loop = new WP_Query( $args ); 复制到子主题文件夹(即{ {1}}),然后根据需要自定义entrada/template-parts/grid-threecolumn.php数组。对于您的问题,请尝试将其添加到entrada-child-picpic-v1_0/template-parts/grid-threecolumn.php之前/上方:

$args

注意:与其他答案中的tax_query相同,只是上述$loop = new WP_Query( $args );模板(或其他模板)是具体使用wp_reset_query(); // Just in case. if ( is_page( 'our-tours-ru' ) ) { if ( ! isset( $args['tax_query'] ) ) { $args['tax_query'] = array(); } // Excludes products from the "Excursions" category. $args['tax_query'][] = array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => array( 'excursions-ru' ), 'operator' => 'NOT IN', ); } 模板部分)的其他页面模板。

答案 2 :(得分:0)

请为此尝试以下代码

function custom_pre_get_posts_query( $q ) {

$tax_query = (array) $q->get( 'tax_query' );

  $tax_query[] = array(
       'taxonomy' => 'product_cat',
       'field' => 'slug',
       'terms' => array( 'excursions-ru' ),
       'operator' => 'NOT IN'
  );

  $q->set( 'tax_query', $tax_query );
}
add_action( 'woocommerce_product_query', 'custom_pre_get_posts_query' );

答案 3 :(得分:0)

要从特定页面中删除特定类别,请在您的当前主题 functions.php 文件中,将页面ID替换为YOUR_PAGE_ID,然后将以下代码放置。

 add_filter( 'get_terms', 'exclude_category_from_specific_page', 10, 3 );
    function exclude_category_from_specific_page( $terms, $taxonomies, $args ) {
        $new_terms = array();
        // if a product category and on a page
        if ( in_array( 'product_cat', $taxonomies ) && ! is_admin() && is_page('YOUR_PAGE_ID')) {
            foreach ( $terms as $key => $term ) {
                // Enter the name of the category you want to exclude 
                if ( ! in_array( $term->slug, array( 'excursions-ru' ) ) ) {
                    $new_terms[] = $term;
                }
            }
            $terms = $new_terms;
        }
        return $terms;
    }

要从特定类别中删除产品,请使用以下代码

/ **  *此代码应添加到您主题的functions.php中  ** /

add_filter( 'pre_get_posts', 'custom_pre_get_posts_query' );
function custom_pre_get_posts_query( $q ) {
    if ( ! $q->is_main_query() ) return;
    if ( ! is_page('YOUR_PAGE_ID') ) return;
    $q->set( 'tax_query', array(array(
        'taxonomy' => 'product_cat',
        'field' => 'excursions-ru',
        'terms' => array( 'excursions ru' ),
        'operator' => 'NOT IN'
    )));
    remove_filter( 'pre_get_posts', 'custom_pre_get_posts_query' );
}

我希望它将对您有所帮助。 谢谢