如何从多个分类中获取包含多个术语的帖子?

时间:2020-07-24 作者:38365

如果我有一个术语ID列表,比如1,2,3,4,5 对应于标记、类别和自定义分类法,如何获取包含所有这些术语的所有帖子?

假设从术语ID列表中,它们属于以下分类法:12 是标签,3 是一个类别,4 是custax1,并且5 是custax2。

我想通过array(1,2,3,4,5) 在里面get_posts() 或其他内容,以便只返回包含所有这些术语ID的帖子,而不管这些ID属于什么分类法。我该怎么做?

如果有帮助,请提供详细信息:

我正在构建一个利用类别、标记和两个自定义分类法(共四个分类法)的网站。我正在构建一个过滤页面,允许用户筛选所有四种分类法,并选择要显示的帖子。用户单击不同分类名称的标签,然后将term\\u ID传递到URL变量中,然后重新加载页面(例如URL包含?terms=1,2,3,4,5). 页面重新加载后,过滤器仅显示包含所选term\\u ID(标记、类别或自定义分类)的所有帖子。

我在过滤器实际显示结果这一部分上遇到了困难。在不知道term\\u id对应的分类法的情况下,似乎无法获取根据term\\u id过滤的帖子。

在查看过程中all the WP Query Class arguments 我发现我可以针对term\\u id,但似乎不能同时针对所有分类法。看来我必须瞄准tags, categories, 和custom taxonomies 具有\'tax_query\' => array(), 但仍然存在一个问题。您不能传递不属于所述分类法一部分的术语ID,否则将返回一个空数组。

下面是一些示例参数get_posts():

$args = array(
    \'numberposts\' => -1,
    \'post_type\' => array(\'post\'),
    \'post_status\' => \'publish\',
    \'tag__and\' => array(), 
        // gets posts with these tag term ids,
        // but cannot pass non-tag term ids.
    \'category__and\' => array(), 
        // gets posts with these cat term ids, 
        // but cannot pass non-category term ids.
    \'tax_query\' => array(
         \'relation\' => \'AND\',
         array(
              \'taxonomy\' => \'custax1\',
              \'field\'    => \'term_id\',
              \'terms\'    => array(),
                   // gets posts with these custom tax term ids, 
                   // but cannot pass non-custax1 term ids
    ),
         array(
              \'taxonomy\' => \'custax2\',
              \'field\'    => \'term_id\',
              \'terms\'    => array(),
                   // gets posts with these custom tax term ids,
                   // but cannot pass non-custax2 term ids term ids
    ),
我不能仅仅将URL变量作为数组传递给其中任何一个,除非它只包含该分类法中的术语ID。如果我传递一个由标记和类别组成的术语ID数组,那么在上述代码中的所有数组上都不会得到任何结果。我希望这里缺少一些简单的东西,并且可以轻松地将URL变量传递给一个函数,然后该函数将获取包含所有term\\id的帖子。

2 个回复
SO网友:mozboz

我建议,如果你能这样做,@SallyCJ的方法更有意义:只要把这些ID写在哪里,就可以将其分解,以存储当时的税名。

然而,似乎要找出每个术语ID所在的分类法,然后使用它来生成tax_query WP\\u查询参数的一部分并不那么难。get_term 允许您从术语ID中查找分类名称,这样您就完成了一半。

This is untested code, some of it may contain errors and uses your $args as a base so you may need to double check the structure of the tax_query part, but it contains all the pieces you could use to build the code if you wanted to do it this way:

$arrTermIDs = [ 1,2,3,4,5 ];
$arrTaxAndTerms = []; // make a 2d array with the term ID\'s broken down by tax name

foreach ($arrTermIDs as $termID) {
    $term = get_term($termID);
    if (!in_array($term->taxonomy, $arrTaxAndTerms)) 
        $arrTaxAndTerms[$term->taxonomy] = [] ; // create array for this tax if we don\'t have one already
    
    $arrTaxAndTerms[$term->taxonomy][] = $termID; // add this term id to array for this tax
}

// Now we have all the info we need to build the tax_query items for each taxonomy 
$arrTaxQueryItems = [];

foreach($arrTaxAndTerms as $taxName => $termIDs) {
    $arrTaxQueryItems[] = 
        array(
              \'taxonomy\' => $taxName,
              \'field\'    => \'term_id\',
              \'terms\'    => $termIDs
        );
}

// Put that together into your $args:
$args = array(
    \'numberposts\' => -1,
    \'post_type\' => array(\'post\'),
    \'post_status\' => \'publish\',
    // any other conditions you want here
    \'tax_query\' => array(
         \'relation\' => \'AND\',
         $arrTaxQueryItems
    )
)

SO网友:38365

不幸的是,如果术语ID具有不同的分类法,则不能将术语ID数组传递到WP函数中并返回所有这些帖子。你必须用艰难的方式tax-query 钥匙传进来了get_posts(). 幸运的是,尽管这很困难,但您可以完全控制返回的帖子列表,设计良好的税务查询几乎可以为您提供任何您可以想到的定制。

在示例税务查询参数中,您正在调用category__andtag__and. 最好在单个税务查询中调用所有所需的分类法,以便根据需要设计结果。

我这样做的方法是在税务查询中单独构建数组,然后通过变量调用它们,如下所示:

$get_posts_args[\'tax_query\'] = array(
            \'relation\' => \'AND\',
            $tag_array,
            $cat_array,
            $custax1_array,
            $custax2_array, ); }
第一个好处是,如果这些数组中有任何一个是空的,那么它们将被忽略,查询仍将运行。第二个好处是,您可以在这些数组中设置进一步的运算符逻辑。例如$tag_array 可能如下所示:

$tag_array = array(
        \'taxonomy\' => \'post_tag\',
        \'field\'    => \'term_id\',
        \'operator\' => \'AND\',
        \'terms\'    => $tag_ids,); }
Theoperator 键允许在分类法中使用一些选项,而relation 外部数组中的键用于分类法之间的逻辑。如果以编程方式设计这些数组,那么在所有分类法的两种情况下都可以根据需要更改逻辑,这将变得很简单。对于层次分类法,您可能需要考虑您对include_children 钥匙

使用包含未知分类法中的术语ID的整数数组有点独特的问题,可以通过以下方法轻松解决:

$tag_ids = get_terms(array(
     \'include\'=>$term_ids_list,
     \'taxonomy\'=>\'post_tag\',
     \'fields\'=>\'ids\'));
如果$term_ids_list 是术语ID的整数数组,然后调用get_terms() 对于特定的分类,将仅返回该分类中的术语。这给了你$tag_ids 作为仅由属于标记分类法的术语ID组成的整数数组。您只需相应地更改要针对的分类法的键。

事后来看,为了解决这个问题,我发现最好单独使用分类法,即使它们将作为一个列表呈现给用户。我们可能会进行分类来区分内容的种类和类型将它们分开会破坏你最初的分离目的。在我的例子中,我希望有小的url,所以决定使用一个url变量?terms=1,2,3,4,5 会比?cats=1,2&tags=3,4&custax1=5. 实际上,url较小,但重新加载时,分类键丢失。然而,在这种特殊情况下,将它们重新组合在一起并不太困难。

相关推荐

如何按GET_TERMS显示所有类别

我正在使用下面的代码,但只显示父类别,而我有许多子类别。我想显示所有类别,包括家长和孩子<label for=\"<?php echo $this->get_field_id( \'link\' ); ?>\"><?php _e( \'دسته بندی\' ); ?></label> <select id=\"<?php echo $this->get_field_id(\'link\'