我想在“我们的游览”页面(子弹“ 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;
}
答案 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' );
}
我希望它将对您有所帮助。 谢谢