Visualizza tutti i post in un tipo di post personalizzato, raggruppati per tassonomia personalizzata


18

Sto lavorando su una pagina membro in cui utilizzo un tipo di post personalizzato con una tassonomia personalizzata. Il mio tipo di post personalizzato viene chiamato membere viene chiamata la mia tassonomia personalizzata member_groups.

Voglio elencare tutti i membri ma raggrupparli nei rispettivi gruppi.

Per essere chiari, ho 35 membri divisi in 9 gruppi, quindi invece di fare la stessa query nove volte, voglio farlo una volta ma raggrupparli insieme, in modo che Membro 1, Membro 4 e Membro 11 siano raggruppati in un gruppo, chiamato "Marketing".

Sto usando WP_Queryper recuperare tutti i post nel membro tipo di post. Ho provato diversi tentativi ma senza risultati positivi.

Come posso raggiungerlo?

Risposte:


29

Quindi, potresti considerare di automatizzare le query multiple.

Innanzitutto, ottieni l'elenco dei termini nella tua tassonomia personalizzata, utilizzando get_terms():

<?php
$member_group_terms = get_terms( 'member_group' );
?>

Quindi, scorrere ciascuno di essi, eseguendo una nuova query ogni volta:

<?php
foreach ( $member_group_terms as $member_group_term ) {
    $member_group_query = new WP_Query( array(
        'post_type' => 'member',
        'tax_query' => array(
            array(
                'taxonomy' => 'member_group',
                'field' => 'slug',
                'terms' => array( $member_group_term->slug ),
                'operator' => 'IN'
            )
        )
    ) );
    ?>
    <h2><?php echo $member_group_term->name; ?></h2>
    <ul>
    <?php
    if ( $member_group_query->have_posts() ) : while ( $member_group_query->have_posts() ) : $member_group_query->the_post(); ?>
        <li><?php echo the_title(); ?></li>
    <?php endwhile; endif; ?>
    </ul>
    <?php
    // Reset things, for good measure
    $member_group_query = null;
    wp_reset_postdata();
}
?>

Non riesco a vedere nulla di particolarmente sbagliato in questo approccio, sebbene possa avere una capacità di ridimensionamento limitata (ad esempio, se hai centinaia o migliaia di membri, o termini member_group, potresti riscontrare problemi di prestazioni).


Sì, è perfetto. C'è solo un problema che ho. Voglio visualizzare campi interessanti come questo <? Php get_post_meta ($ member_group_term-> ID, 'job_title', true);?> Ma non ha funzionato. Ho anche provato con $ post- > ID ma non ha funzionato, potresti aiutare @Chip Bennett per favore?
Anahit DEV,

6

Ho trovato una soluzione utilizzando una query personalizzata e quindi raggruppandola con il nome del termine:

SELECT * 
FROM wp_term_taxonomy AS cat_term_taxonomy
INNER JOIN wp_terms AS cat_terms ON cat_term_taxonomy.term_id = cat_terms.term_id
INNER JOIN wp_term_relationships AS cat_term_relationships ON cat_term_taxonomy.term_taxonomy_id = cat_term_relationships.term_taxonomy_id
INNER JOIN wp_posts AS cat_posts ON cat_term_relationships.object_id = cat_posts.ID
INNER JOIN wp_postmeta AS meta ON cat_posts.ID = meta.post_id
WHERE cat_posts.post_status =  'publish'
AND meta.meta_key =  'active'
AND meta.meta_value =  'active'
AND cat_posts.post_type =  'member'
AND cat_term_taxonomy.taxonomy =  'member_groups'

Quindi, semplicemente usando una normale query foreach, posso semplicemente estrarre le informazioni che desidero.

Ma sono ancora interessato in un altro modo, se esiste, forse usando le funzioni di Wordpress.


Ho appena aggiunto un metodo alternativo. Tendo a evitare qualsiasi cosa che richieda query SQL non elaborate.
Chip Bennett,

2
Sono contento di vedere questo contrassegnato come la risposta corretta, anche se la query smette di funzionare in wordpress se lo schema cambia ad un certo punto ... Il concetto di raccoglierli tutti in una singola query è la risposta corretta. L'iterazione per raggruppare le tassonomie in php non si ridimensionerà quasi come questa.
wowo_999,

4

ancora più semplice:

$terms = get_terms('tax_name');
$posts = array();
foreach ( $terms as $term ) {
    $posts[$term->name] = get_posts(array( 'posts_per_page' => -1, 'post_type' => 'post_type', 'tax_name' => $term->name ));
}

All'interno della risultante matrice $ posts, ogni termine fiscale è la chiave di una matrice nidificata contenente i suoi messaggi.


4

Avevo esattamente questo bisogno e la soluzione di Chip ha funzionato, tranne una cosa: 'field' => 'slug'è richiesta.

    foreach ( $service_categories as $category ) {
        $services = new WP_Query( 
            array(
                'post_type'     => 'service',
                'tax_query'     => array(
                    array(
                        'taxonomy'  => 'service_category',
                        'terms'     => array( $category->slug ),
                        'operator'  => 'IN',
                        'get'       => 'all',
                        'field'     => 'slug'
                    )
                )
            ) 
        ); ?>
        <h2><?php echo $category->slug; ?></h2>
        <?php if ( $services->have_posts() ) {  // loop stuff goes here ?>

Avevo anche bisogno che il display risultante fosse piatto, quindi 'get' => 'all'è impostato qui.

Spero che questo aiuti qualcun altro.


3
$query = new WP_Query( 
   array ( 
      'post_type' => 'member', 
      'orderby'   => 'meta_value', 
      'meta_key'  => 'member_group' 
   ) 
);

Quindi quando esegui il ciclo attraverso questa query potresti semplicemente usare un if lungo queste linee (nello pseudocodice php)

$groupName = "";
$counter = 0;
if havePosts: while havePosts: thePost

if( $groupName != post->meta_value )
{
if ($counter > 0)
{
</ul>
}
<h1>A group name</h1>
<ul>
<li>member name</li>
}
else
{
<li>member name</li>
}

endwhile;endif

</ul>

Spero che aiuti. Penso che lo stia rendendo molto più complicato di quanto fosse necessario.

Ulteriori informazioni: http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters


3

Ho dovuto farlo su un progetto anni fa. Risposta simile a djb, solo con qualche dettaglio in più. Questo produrrà tutti i tuoi nomi di tassonomia come h3, con un elenco puntato di ogni titolo di post collegato alla loro pagina dei dettagli.

<?php // Output all Taxonomies names with their respective items
$terms = get_terms('member_groups');
foreach( $terms as $term ):
?>                          
    <h3><?php echo $term->name; // Print the term name ?></h3>                          
    <ul>
      <?php                         
          $posts = get_posts(array(
            'post_type' => 'member',
            'taxonomy' => $term->taxonomy,
            'term' => $term->slug,                                  
            'nopaging' => true, // to show all posts in this taxonomy, could also use 'numberposts' => -1 instead
          ));
          foreach($posts as $post): // begin cycle through posts of this taxonmy
            setup_postdata($post); //set up post data for use in the loop (enables the_title(), etc without specifying a post ID)
      ?>        
          <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>    
        <?php endforeach; ?>
    </ul>                                                   
<?php endforeach; ?>

1

Bene, è un vecchio thread, ma se qualcuno passa come me, questo potrebbe aiutare. L'idea è di modificare la query principale, quindi non abbiamo bisogno di andare i modelli e generare nuove query e loop ...

PS: ancora da testare in grandi dbs. Nel mio caso è stato soddisfacente.

function grouped_by_taxonomy_main_query( $query ) {

    if ( $query->is_home() && $query->is_main_query() ) { // Run only on the homepage

        $post_ids = array();

        $terms = get_terms('my_custom_taxonomy');

        foreach ( $terms as $term ) {
            $post_ids = array_merge( $post_ids, get_posts( array( 
                'posts_per_page' => 4, // as you wish...
                'post_type' => 'my_custom_post_type', // If needed... Default is posts
                'fields' => 'ids', // we only want the ids to use later in 'post__in'
                'tax_query' => array( array( 'taxonomy' => $term->taxonomy, 'field' => 'term_id', 'terms' => $term->term_id, )))) // getting posts in the current term
            );
        }

        $query->query_vars['post_type'] = 'my_custom_post_type'; // Again, if needed... Default is posts
        $query->query_vars['posts_per_page'] = 16; // If needed...
        $query->query_vars['post__in'] = $post_ids; // Filtering with the post ids we've obtained above
        $query->query_vars['orderby'] = 'post__in'; // Here we keep the order we generated in the terms loop
        $query->query_vars['ignore_sticky_posts'] = 1; // If you dont want your sticky posts to change the order

    }
}

// Hook my above function to the pre_get_posts action
add_action( 'pre_get_posts', 'grouped_by_taxonomy_main_query' );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.