简体   繁体   English

从 Wordpress 中的自定义分类中获取所有帖子

[英]Get all posts from custom taxonomy in Wordpress

Is there a way to get all the posts from a taxonomy in Wordpress?有没有办法从 Wordpress 的分类中获取所有帖子?

In taxonomy.php , I have this code that gets the posts from the term related to the current term.taxonomy.php中,我有这段代码可以从与当前术语相关的术语中获取帖子。

$current_query = $wp_query->query_vars;
query_posts( array( $current_query['taxonomy'] => $current_query['term'], 'showposts' => 10 ) );

I'd like to create a page with all the posts in the taxonomy, regardless of the term.无论术语如何,我想创建一个包含分类中所有帖子的页面。

Is there a simple way to do this, or do I have to query the taxonomy for the terms, then loop trough them, etc.有没有一种简单的方法可以做到这一点,或者我必须查询术语的分类,然后循环遍历它们,等等。

@PaBLoX made a very nice solution but I made a solution myself what is little tricky and doesn't need to query for all the posts every time for each of the terms. @PaBLoX提供了一个非常好的解决方案,但我自己做了一个解决方案,有点棘手,并且不需要每次查询每个术语的所有帖子。 and what if there are more than one term assigned in a single post? 如果在一个帖子中分配了多个术语怎么办? Won't it render same post multiple times? 它不会多次渲染同一个帖子吗?

 <?php
     $taxonomy = 'my_taxonomy'; // this is the name of the taxonomy
     $terms = get_terms( $taxonomy, 'orderby=count&hide_empty=1' ); // for more details refer to codex please.
     $args = array(
        'post_type' => 'post',
        'tax_query' => array(
                    array(
                        'taxonomy' => 'updates',
                        'field' => 'slug',
                        'terms' => m_explode($terms,'slug')
                    )
                )
        );

     $my_query = new WP_Query( $args );
     if($my_query->have_posts()) :
         while ($my_query->have_posts()) : $my_query->the_post();

              // do what you want to do with the queried posts

          endwhile;
     endif;
  ?>

this function m_explode is a custom function which i put into the functions.php file. 这个函数m_explode是一个自定义函数,我将它放入functions.php文件中。

    function m_explode(array $array,$key = ''){     
        if( !is_array($array) or $key == '')
             return;        
        $output = array();

        foreach( $array as $v ){        
            if( !is_object($v) ){
                return;
            }
            $output[] = $v->$key;

        }

        return $output;

      }

UPDATE UPDATE

We don't require this custom m_explode function. 我们不需要这个自定义的m_explode函数。 wp_list_pluck() function does exactly the same. wp_list_pluck()函数完全相同。 So we can simply replace m_explode with wp_list_pluck() (parameters would be same). 所以我们可以简单地用wp_list_pluck()替换m_explode (参数会相同)。 DRY, right? 干,对吗?

$myterms = get_terms('taxonomy-name', 'orderby=none&hide_empty');    
echo  $myterms[0]->name;

With that you'd post the first item, yo can then create a foreach ; 有了这个你发布第一个项目,你可以创建一个foreach ; loop: 环:

foreach ($myterms as $term) { ?>
    <li><a href="<?php echo $term->slug; ?>"><?php echo $term->name; ?></a></li> <?php
} ?>

That way you'd list them, if you want to post all of them, -my solution- create a normal wordpress loop inside the foreach one, but it has to have something like: 这样你就可以列出它们,如果你想发布所有这些,-my解决方案 - 在foreach中创建一个普通的wordpress循环,但它必须有类似的东西:

foreach ($myterms as $term) :

$args = array(
    'tax_query' => array(
        array(
            $term->slug
        )
    )
);

//  assigning variables to the loop
global $wp_query;
$wp_query = new WP_Query($args);

// starting loop
while ($wp_query->have_posts()) : $wp_query->the_post();

the_title();
blabla....

endwhile;

endforeach;

I posted something very similar here . 我很张贴类似的东西在这里

Unlike for post types, WordPress does not have a route for the taxonomy slug itself. 与帖子类型不同,WordPress没有分类标本本身的路由。

To make the taxonomy slug itself list all posts that have any term of the taxonomy assigned, you need to use the EXISTS operator of tax_query in WP_Query : 要使分类标本本身列出所有分配了任何分类术语的帖子,您需要在tax_query中使用WP_QueryEXISTS运算符

// Register a taxonomy 'location' with slug '/location'.
register_taxonomy('location', ['post'], [
  'labels' => [
    'name' => _x('Locations', 'taxonomy', 'mydomain'),
    'singular_name' => _x('Location', 'taxonomy', 'mydomain'),
    'add_new_item' => _x('Add New Location', 'taxonomy', 'mydomain'),
  ],
  'public' => TRUE,
  'query_var' => TRUE,
  'rewrite' => [
    'slug' => 'location',
  ],
]);

// Register the path '/location' as a known route.
add_rewrite_rule('^location/?$', 'index.php?taxonomy=location', 'top');

// Use the EXISTS operator to find all posts that are
// associated with any term of the taxonomy.
add_action('pre_get_posts', 'pre_get_posts');
function pre_get_posts(\WP_Query $query) {
  if (is_admin()) {
    return;
  }
  if ($query->is_main_query() && $query->query === ['taxonomy' => 'location']) {
    $query->set('tax_query', [
      [   
        'taxonomy' => 'location',
        'operator' => 'EXISTS',
      ],  
    ]);
    // Announce this custom route as a taxonomy listing page
    // to the theme layer.
    $query->is_front_page = FALSE;
    $query->is_home = FALSE;
    $query->is_tax = TRUE;
    $query->is_archive = TRUE;
  }
}

While in the query loop for terms, you can collect all post references in an array and use that later in a new WP_Query. 在术语的查询循环中,您可以收集数组中的所有帖子引用,并在稍后的新WP_Query中使用它。

$post__in = array(); 
while ( $terms_query->have_posts() ) : $terms_query->the_post();
    // Collect posts by reference for each term
    $post__in[] = get_the_ID();
endwhile;

...

$args = array();
$args['post__in'] = $post__in;
$args['orderby'] = 'post__in';
$other_query = new WP_Query( $args );
<?php
get_posts(array(
    'post_type' => 'gallery',
    'tax_query' => array(
        array(
        'taxonomy' => 'gallery_cat',
        'field' => 'term_id',
        'terms' => 45)
    ))
);
?>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM