首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WP_Query多分类器

WP_Query多分类器
EN

Stack Overflow用户
提问于 2022-12-03 23:25:19
回答 1查看 16关注 0票数 0

我有几个分类法注册到一个定制的post类型。我试图通过这些分类中的术语组合,让用户可以选择过滤这种自定义post类型中的帖子。

如果用户为每个分类法选择至少一个术语,但如果总体上只选择了一个项(即没有为其他分类法选择任何项),则结果为空。

问题的具体例子----我的定制post类型是“产品”。我为这个post类型创建了几个不同的分类,并在每个分类法中创建了不同的术语,如下所示:

产品类型(分类法1)

  • Postcards
  • Art Prints
  • Greeting卡

主题(分类学2)

  • Inspirational
  • Sweet
  • Funny

等。

如果用户选择“明信片”和“励志”,那么查询就能够返回“明信片”和“灵感”选择的产品。但是,如果用户只检查“明信片”,则结果为空白。我想要的是查询返回所有带有“明信片”检查的帖子。

以下是我尝试过的:

首先,我通过将过滤器作为复选框输出到页面上来创建过滤器。

代码语言:javascript
复制
<form method="GET">
    <h3>Product Types</h3>
    <?php $terms = get_terms([
        'taxonomy' => 'product_types',
        'hide_empty' => false
    ]);
    foreach ($terms as $term) :
    ?>
    <label onchange="this.form.submit()">
        <input
            type="checkbox"
            name="collections[]"
            value="<?php echo $term->slug; ?>"
            <?php checked(
            (isset($_GET['collections']) && in_array($term->slug, $_GET['collections']))
            ) ?>
        />
        <?php echo $term->name; ?>
    </label>
    <?php endforeach; ?>

    <h3>Themes</h3>
    <?php $terms = get_terms([
        'taxonomy' => 'themes',
        'hide_empty' => false,
    ]);
    foreach ($terms as $term) :
    ?>
    <label onchange="this.form.submit()">
        <input
            type="checkbox"
            name="collections[]"
            value="<?php echo $term->slug; ?>"
            <?php checked(
            (isset($_GET['collections']) && in_array($term->slug, $_GET['collections']))
            ) ?>
        />
        <?php echo $term->name; ?>
    </label>
    <?php endforeach; ?>
</form>

然后,我使用tax_query查找与用户选择相匹配的产品。

代码语言:javascript
复制
<?php
    $collections_val = $_GET['collections'];

    $args = [
    'post_type' => 'product',
    'posts_per_page' => -1,
    ];
    // Append our tax-query if we have terms. Make sure it is a valid string or array
    $terms = $collections_val;
    if ( $terms ) {
    $args['tax_query'] = [
        'relation' => 'AND',
      [
        'taxonomy' => 'product_types',
        'field' => 'slug',
        'terms' => $terms,
      ],
      [
        'taxonomy' => 'themes',
        'field' => 'slug',
        'terms' => $terms,
      ],
    ];
    }
    $product_query = new WP_Query( $args );
?>
<?php if ( $product_query->have_posts() ) : 
    while ( $product_query->have_posts() ): $product_query->the_post(); 
        echo the_title();
    endwhile;
else :
    echo 'No results';
endif; ?>

我知道这就是我的代码告诉WP做b/c的事情,我使用的是'relation‘=>和。但就我的目的而言,我需要WP返回结果,即使只选择了一个分类法下的一个术语。

如果有人能指出正确的方向,我会非常感激的。已经做了很多研究,但找不到我的方向。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2022-12-04 15:19:11

我自己想出来的。关键是,如果用户只在一个分类法中选中复选框(Es),对于所有其他场景,我需要对关系使用'OR‘和’‘。

是从this answer那里得到的。

如果你有两个以上的分类,事情会变得更复杂,因为你必须考虑所有的关系组合。您还需要只查询带有勾选复选框的分类法。

例如,您需要根据所选内容分配不同的关系值:

税1+税2

关系应该是(‘和’)

只查询税1及税2

税1+税3

关系应该是(‘和’)

只查询税1及税3

税2+税3

关系应该是(‘和’)

只查询税务2及税款3

税1+税2+税3

关系应该是(‘和’)

查询所有三个分类法

只征收税1或只缴税2或只缴税3

关系应该是(‘或’)

只使用复选框查询分类法(或者只查询所有3项,因为这是“OR”关系。它不会影响前端的结果。显然,如果你有很多帖子,它可能会影响你的性能。)

如果有人想要的话,我可以贴出我的最后代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74671613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档