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

问题描述 投票:0回答:1

我在自定义目录列表循环方面遇到一些问题。

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

我使用 wc_get_products 和类型 array('simple', 'variation') 创建了一个自定义产品循环,但尺寸或颜色等属性过滤器不适用于此列表。

这是代码:

$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');
}

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

php woocommerce product variant catalog
1个回答
1
投票

刚刚找到了让它发挥作用的方法:

首先,我有一个循环来获取所有产品 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',
    'status'               => 'publish',
    'category'             => $currentCat,
    'type'                 => array('simple', 'variation'),
    'limit'                => $products_per_page,
    'page'                => $paged,
    'paginate'             => true,
    'return'               => 'ids',
    'orderby'              => $ordering['orderby'],
    'order'                => $ordering['order'],
    'include'              => $productsIDS,
);

if ($outputFilters != ""){
    $args = array_merge($args, $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' );

}

© www.soinside.com 2019 - 2024. All rights reserved.