从产品类别和自定义中对 Woocommerce 产品进行排序 meta_key

Sort Woocommerce Products from a product category and custom meta_key

我使用自定义插件(和 meta_key)成功地按喜欢(计数)过滤了我所有的 Wordpress 帖子,这也让我过滤了类别中最喜欢的帖子。我在自定义页面模板中显示(查询)结果。一切正常。

Like 功能也适用于 Woocommerce 产品。但到目前为止,我无法设置一个页面,在该页面中我对产品 (post_type) 进行排序,就像我对我的帖子所做的那样,在特定的商店类别中进行排序。我最接近的是在页面上显示最喜欢的帖子但是类别排序不会过滤帖子 - 它显示与主页相同。分类列表和分类链接的 url 调用工作正常。

注意: url 查询字符串 "product-cato" 是自定义的 - 我使用 ajax 过滤器插件来使用此查询-string 和类别 ID,例如 .../?product-cato=6请不要将其与 product_cat 混淆,例如

这就是我到目前为止的想法 - 从帖子的代码开始(效果很好)。知道如何解决这个问题吗?谢谢

查询(工作正常)

if (isset($_GET['category'])) {
    $args = array(
    'meta_key' => '_recoed',
    'meta_compare' => '>',
    'meta_value' => '0',
    'orderby' => 'meta_value_num',
    'order' => 'DESC',
    'category_name' => sanitize_text_field($_GET['category']),
    'paged' => $paged
    );
} 

 query_posts($args);

用于过滤每个类别中的 Post 的类别列表(工作正常)

<?php $categories = get_categories();

foreach($categories as $category) { ?>
    <li>
        <a class="popular-categories" href="<?php echo get_permalink(); ?>?category=<?php echo $category->category_nicename; ?>"><?php echo $category->name; ?></a> 
    </li>
<?php } ?>

现在是我卡住的 Woocommerce 查询和类别部分

商品查询post_type

    if (isset($_GET['product-cato'])) {
    $args = array(
    'meta_key' => '_recoed',
    'meta_compare' => '>',
    'meta_value' => '0',
    'post_type' => 'product',
    'orderby' => 'meta_value_num',
    'order' => 'DESC',
    'taxonomy' => sanitize_text_field($_GET['product_cat']),
    'paged' => $paged
);

query_posts($args);

用于过滤每个商店类别Post的类别列表

<?php
    $product_categories = get_terms( 'product_cat' );
    $count = count($product_categories);

    foreach ( $product_categories as $product_category ) { ?>
        <li>
            <a class="popular-categories" href="<?php echo get_permalink(); ?>?product-cato=<?php echo $product_category->term_id; ?>"><?php echo $product_category->name; ?></a>
        </li>
    } 
?>

As Product Categories are a custom taxonomy 'product_cat', use a tax_query instead.

所以不是错误的:

'taxonomy' => sanitize_text_field($_GET['product_cat'])

... 使用此 (正确定义 'field' 参数):

'tax_query' => array( // the product category query
    array( 
        'taxonomy' => 'product_cat',
        'field'    => 'term_id', // (also 'name' or 'slug')  <==   <==   <==   <==   <== 
        'terms'    => sanitize_text_field($_GET['product-cato']),
    ),
),

Check also in sanitize_text_field($_GET['product_cat']) that 'product_cat' is the right slug, as you use also product-cato

If sanitize_text_field($_GET['product_cat']) is not a product category "slug", you should need to change 'field' => 'term_id', with the correct field type ('name' or 'slug').

所以你的代码应该是 (正确定义 'field' 参数):

if (isset($_GET['product-cato'])) {
    query_posts( array(
        'meta_key' => '_recoed',
        'meta_compare' => '>',
        'meta_value' => '0',
        'orderby' => 'meta_value_num',
        'order' => 'DESC',
        'paged' => $paged,
        'post_type' => 'product',
        //'posts_per_page' => 20,
        'post_status' => 'publish',
        // The product category query
        'tax_query' => array( 
            array( 
                'taxonomy' => 'product_cat',
                'field'    => 'term_id', // (also 'name' or 'slug') <==   <==   <==   <==
                'terms'    => sanitize_text_field($_GET['product-cato']),
            ),
        ),
    ) );
}

应该可以……