WooCommerce自定义循环-属性过滤器不起作用

自定义目录列表的某些循环出现问题。

目标:在目录页面上列出了简单产品和某些变体产品(取决于属性);

我使用类型为 array('simple','variation') wc_get_products 创建了一个自定义产品循环,但是属性过滤器(例如大小或颜色)无法使用此清单。

这是代码:

$category = get_queried_object();

  $currentCat = "";
  if ( $category->slug != NULL ){
    $currentCat = array($category->slug);
  }

  $paged                   = (get_query_var('paged')) ? absint(get_query_var('paged')) : 1;
  $ordering                = WC()->query->get_catalog_ordering_args();
  $ordering['orderby']     = array_shift(explode(' ',$ordering['orderby']));
  $ordering['orderby']     = stristr($ordering['orderby'],'price') ? 'meta_value_num' : $ordering['orderby'];
  $products_per_page       = apply_filters('loop_shop_per_page',wc_get_default_products_per_row() * wc_get_default_product_rows_per_page());
  $list_products       = wc_get_products(array(
    'meta_key'             => '_price','status'               => 'publish','category'             => $currentCat,'type'                 => array('simple','variation'),'limit'                => $products_per_page,'page'                => $paged,'paginate'             => true,'return'               => 'ids','orderby'              => $ordering['orderby'],'order'                => $ordering['order'],));


$totalProducts = (array) $list_products->products;

wc_set_loop_prop('current_page',$paged);
wc_set_loop_prop('is_paginated',wc_string_to_bool(true));
wc_set_loop_prop('page_template',get_page_template_slug());
wc_set_loop_prop('per_page',$products_per_page);
wc_set_loop_prop('total',$list_products->total);
wc_set_loop_prop('total_pages',$list_products->max_num_pages);
if($totalProducts) {
    do_action('woocommerce_before_shop_loop');
    woocommerce_product_loop_start();
        foreach($totalProducts as $productID) {
            $post_object = get_post($productID);
            setup_postdata($GLOBALS['post'] =& $post_object);
            wc_get_template_part('content','product');
        }
        wp_reset_postdata();
    woocommerce_product_loop_end();
    do_action('woocommerce_after_shop_loop');
} else {
    do_action('woocommerce_no_products_found');
}

任何人都可以帮我,以便过滤器开始工作?

xiwangvsqiji 回答:WooCommerce自定义循环-属性过滤器不起作用

只需将其投入工作即可:

第一,我有一个循环来获取所有产品ID,并带有变化中的条件,以确认是否选中了自定义字段(复选框)。这主要是为了获得要设置分页的产品总数。

目标是仅包括在目录页面上检查的变体。

此后,我要进行第二次循环,以从先前的循环中检索所有产品。

这是可行的解决方案:

if(!function_exists('wc_get_products')) {
    return;
  }

function get_issues($term) {
    $hlterms = get_terms($term);
    foreach($hlterms as $term){
        // var_dump($term->taxonomy);
        return true;
    } 

}

// Get all Attribute Filters
$outputFilters = "";
foreach($_GET as $key => $querystring){
    if (strpos($key,'filter') !== false) {
        $outputFilters = array();
        $newkey = str_replace("filter","pa",$key);
        if (get_issues($newkey) === true){
            $outputFilters[$newkey] = $querystring;
        }

    }
}

// Check if in some Category
$category = get_queried_object();

$currentCat = "";
if ( $_GET['product_cat'] != NULL ){
    $currentCat = $_GET['product_cat'];
} else if ($category->slug != NULL){
    $currentCat = array($category->slug);
}

// 1st Loop to get total IDs
$paged                   = (get_query_var('paged')) ? absint(get_query_var('paged')) : 1;
$products_per_page       = apply_filters('loop_shop_per_page',wc_get_default_products_per_row() * wc_get_default_product_rows_per_page());
$ordering['orderby'] = 'id';
$args = array(
    'meta_key'             => '_price','status'               => 'publish','category'             => $currentCat,'type'                 => array('simple','variation'),'limit'                => 1000,'paginate'             => true,'return'               => 'ids',);

if ($outputFilters != ""){
    $args = array_merge($args,$outputFilters);
}

  $list_products = wc_get_products($args);
  $totalProducts = (array) $list_products->products;

  $productsIDS = array();
  foreach($totalProducts as $productID) {
    $product_s = wc_get_product( $productID );
    if ($product_s->product_type == 'simple') {
        array_push($productsIDS,$productID);       
    } else {
    if ($product_s->product_type == 'variation') {
        $showCatalog =  get_post_meta( $productID,'_showoncatalog',true );
        if ($showCatalog == "yes"){
            array_push($productsIDS,$productID);
        }
    }
  }
}


// Final loop 
$args = array(
    'meta_key'             => '_price','limit'                => $products_per_page,'page'                => $paged,'orderby'              => $ordering['orderby'],'order'                => $ordering['order'],'include'              => $productsIDS,$outputFilters);
}

$list_products = wc_get_products($args);

$totalProducts = (array) $list_products->products;

wc_set_loop_prop('current_page',$paged);
wc_set_loop_prop('is_paginated',wc_string_to_bool(true));
wc_set_loop_prop('page_template',get_page_template_slug());
wc_set_loop_prop('per_page',$products_per_page);
wc_set_loop_prop('total',$list_products->total);
wc_set_loop_prop('total_pages',$list_products->max_num_pages);


if($totalProducts) {
    do_action('woocommerce_before_shop_loop');
    woocommerce_product_loop_start();
        foreach($totalProducts as $productID) {
            $post_object = get_post($productID);
            setup_postdata($GLOBALS['post'] =& $post_object);
            wc_get_template_part('content','product');

        }
        wp_reset_postdata();
    woocommerce_product_loop_end();
    do_action('woocommerce_after_shop_loop');
  } else {
    do_action('woocommerce_no_products_found');
  }

/**
 * Hook: woocommerce_after_shop_loop.
 *
 * @hooked woocommerce_pagination - 10
 */
#do_action( 'woocommerce_after_shop_loop' );

}

本文链接:https://www.f2er.com/3151892.html

大家都在问