我想过滤类别产品上的产品,以便它只显示某位作者或多位作者的产品。
我已经有以下代码了。这适用于过滤产品。显示正确的产品。除了左侧边栏中的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;
}
?>
感谢您的帮助!
答案 0 :(得分:0)
很棒的家伙。要立即尝试,让你知道。当你得到Woo团队的回答时,你能告诉我吗?
答案 1 :(得分:0)
我的更新解决方案:仍然很脏,因为它修改了Woocommerce的核心文件(2.2.4),但它有效:
在pre_get_posts
- 钩子中的我使用以下代码检索要排除的产品的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'] ) ) ) . ')
答案 2 :(得分:0)
可能更好的方法是在查询中设置'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' );