类别页面上产品的 pre_get_posts - woocommerce

Posted

技术标签:

【中文标题】类别页面上产品的 pre_get_posts - woocommerce【英文标题】:pre_get_posts for products on category page - woocommerce 【发布时间】:2014-11-11 21:02:05 【问题描述】:

我想过滤产品类别中的产品,使其仅显示某个作者或多个作者的产品。

我已经有以下代码。这在过滤产品时起作用。显示正确的产品。除了左侧边栏中的 Woocommerce 过滤器不受过滤器的影响。左侧的过滤器显示了该类别中的所有原始产品(也来自其他用户),因此计数不正确,并且显示了来自被过滤产品的属性。这不应该是这样。我是否必须为过滤器添加另一个 pre_get_posts?

 <?php
function pre_get_posts_by_author( $q ) 


    if ( ! $q->is_main_query() ) return;
    if ( ! $q->is_post_type_archive() ) return;

    $cat_obj = $q->get_queried_object();

    if($cat_obj->name == 'Nieuw')
       
        $q->set( 'author_ids',  '2086,2084');   
    




add_action( 'pre_get_posts', 'pre_get_posts_by_author' );


add_filter( 'posts_where', 'author_posts_where', 10, 2 );
function author_posts_where( $where, &$wp_query )

    global $wpdb;


    if ( $wp_query->get( 'author_ids' ) ) 
        $where .= ' AND ' . $wpdb->posts . '.post_author IN (' . $wp_query->get( 'author_ids' ) .')';
    
    return $where;

?>

感谢您的帮助!

【问题讨论】:

【参考方案1】:

执行此操作的更好方法可能是在查询中设置“author__in”参数,该参数将采用查询将返回产品的作者数组。

function pre_get_posts_by_author( $q ) 


    if ( ! $q->is_main_query() || !$q->is_post_type_archive() ) return;

    $cat_obj = $q->get_queried_object();

    if( $cat_obj->name == 'Nieuw' )

        $q->set( 'author__in',  array(2086,2084)); 

    


add_action( 'pre_get_posts', 'pre_get_posts_by_author' );

【讨论】:

【参考方案2】:

我更新的解决方案:在修改 Woocommerce 的核心文件 (2.2.4) 时仍然很脏,但它可以工作:

pre_get_posts-hook 中,我使用以下代码检索要排除的产品的 ID:

$_SESSION['total_excluded'] = get_objects_in_term( $term_ids, $taxonomies, $args )` 

(参考:http://codex.wordpress.org/Function_Reference/get_objects_in_term)

然后在woocommerce/includes/widgets/class-wc-widget-layered-nav.php我将第258行更改为:

$count = sizeof( array_diff(array_intersect( $_products_in_term, WC()->query->filtered_product_ids) , $_SESSION['total_excluded'] ) );

woocommerce/includes/widgets/class-wc-widget-price-filter.php 中,新的第 121、136 行是:

%1$s.ID IN (' . implode( ',', array_map( 'absint', array_diff(WC()->query->layered_nav_product_ids, $_SESSION['total_excluded']  ) ) ) . ')

woocommerce/includes/widgets/class-wc-widget-price-filter.php 中,新的第 123、138 行是:

%1$s.post_parent IN (' . implode( ',', array_map( 'absint', array_diff(WC()->query->layered_nav_product_ids, $_SESSION['total_excluded'] ) ) ) . ')

【讨论】:

注意:我的分层导航小部件设置为 AND。如果您使用 OR,您必须相应地在第 269 行调整 woocommerce/includes/widgets/class-wc-widget-layered-nav.php 的代码。另外:我不太确定第 94 行的 woocommerce/includes/widgets/class-wc-widget-price-filter.php 中的情况是什么意思。如果您仅使用价格过滤器,是否会出现这种情况?我没有修改那部分,因为它没有改变我的结果。

以上是关于类别页面上产品的 pre_get_posts - woocommerce的主要内容,如果未能解决你的问题,请参考以下文章

在 WooCommerce 订单页面上列出单独购买的产品的类别和子类别

Magento 试图在产品展示和类别页面上根据“尺寸属性”显示产品价格范围?

在归档类别页面上显示特定的产品属性值

php 隐藏WooCommerce中的产品类别。如果要在商店页面上隐藏产品类别计数,则只需将此代码添加到t

将Woocommerce单一产品页面上的添加到购物车按钮替换为产品类别

php [WooCommerce Core]从商店页面上的特定类别中排除产品