web-dev-qa-db-fra.com

Ajout d'un nom de terme à partir d'une taxonomie personnalisée attribuée à un lien de publication affiché par une boucle wp_query basée sur une autre taxonomie

J'ai enregistré un type de message personnalisé "Animaux" ainsi que deux taxonomies personnalisées ("Vertébrés" et "Type") qui lui sont attribuées et qui ont leurs propres termes. "Vertébrés" signifie "Mammifères" et "Reptiles", et pour "Type", il s'agira de "type d'eau" et de "type de sol".

En utilisant page.php, j'aimerais afficher une liste de tous les articles personnalisés (Animaux) triés selon les termes attribués à la taxonomie personnalisée "Vertébrés". À cet effet, je réussis à l'aide du code ci-dessous:

<?php
        $post_type = 'animals';
        $tax = 'vertebrate';
        $tax_terms = get_terms($tax);

        if ($tax_terms) {
          foreach ($tax_terms  as $tax_term) {
            $args=array(
              'post_type'       => $post_type,
              "$tax"            => $tax_term->slug,
              'post_status'     => 'publish',
              'posts_per_page'  => -1,
              'caller_get_posts'=> 1,
              'orderby'         => 'title',
              'order'           => 'ASC'                    
            );

            $my_query = null;
            $my_query = new WP_Query($args);

            if( $my_query->have_posts() ) {

              echo '<h2>'. $tax_term->name .'</h2>';

              while ($my_query->have_posts()) : $my_query->the_post(); ?>

                <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>

<?php

              endwhile;
            }
            wp_reset_query();
          }
        }
?>

Cela me donne quelque chose comme ça:

Mammifères:

  • Vache
  • Chien
  • Dauphin
  • Orca
  • Baleine

Reptiles:

  • Lézard
  • Tortue de mer

Cependant, je voudrais également indiquer dans la liste précédente à quels termes de la taxonomie "Type" chaque tâche est attribuée (en plus des termes de la taxonomie des vertébrés) en renvoyant simplement leur nom après le lien du message.

J'essaie de réaliser quelque chose comme ceci:

Mammifères:

  • Vache (type terrestre)
  • Chien (type terrestre)
  • Dauphin (type d'eau)
  • Orca (type d'eau)
  • Baleine (type d'eau)

Reptiles:

  • Lézard (type de sol)
  • Tortue de mer (type d'eau)

Je suis complètement coincé avec cela, ma connaissance de WordPress et de PHP étant pratiquement nulle, j’accepterais volontiers toute aide en la matière.

METTRE À JOUR


Mon ami m'a aidé avec ça. Cela devrait fonctionner avec ceci:

            <?php

        $post_type = 'animals';
        $tax = 'vertebrate';
        $tax_terms = get_terms($tax);
        if ($tax_terms) {
          foreach ($tax_terms  as $tax_term) {
            $args=array(
              'post_type' => $post_type,
              "$tax" => $tax_term->slug,
              'post_status' => 'publish',
              'posts_per_page' => -1,
              'caller_get_posts'=> 1,
              'orderby'        => 'title',
              'order'          => 'ASC'                 
            );

            $my_query = null;
            $my_query = new WP_Query($args);
            if( $my_query->have_posts() ) {

              echo '<h2>'. $tax_term->name .'</h2>';
              while ($my_query->have_posts()) : $my_query->the_post(); ?>
                <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a>
                <?php 
                setup_postdata( $post );
                $terms = wp_get_post_terms( $post->ID, 'type');
                echo '<span>'. ($terms[0]->name) .'</span></p>'; ?>

                <?php
              endwhile;
            }
            wp_reset_query();
          }
        }
        ?>
2
Sm00k

Quelque chose comme ça devrait aider:

<?php
    $post_type = 'animals';
    $tax = 'vertebrate';

    $tax_terms = get_terms($tax);

    if ( $tax_terms ) {
        foreach ($tax_terms as $tax_term) {
            $args = array(
                'post_type' => $post_type,
                "$tax" => $tax_term->slug,
                'post_status' => 'publish',
                'posts_per_page' => -1,
                'caller_get_posts' => 1,
                'orderby' => 'title',
                'order' => 'ASC'                 
            );

            // $my_query = null;  <- REMOVE THIS, YOU DON'T NEED TO NULL VARIABLE BEFORE ASSIGNING IT'S VALUE

            $my_query = new WP_Query($args);
        ?>

            <?php if ( $my_query->have_posts() ) : ?>
                <h2><?php echo esc_html($tax_term->name); ?></h2>'; <?php // <- YOU SHOULD ESCAPE PRINTED VALUES ?>
                <ol>
                <?php while ($my_query->have_posts()) : ?>
                    $my_query->the_post(); ?>
                    <li>
                        <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a>
                        <?php 
                            // setup_postdata( $post ); <- THERE IS NO NEED TO SETUP_POSTDATA HERE (YOU'VE ALREADY CALLED the_post() ON QUERY
                            $type_terms = wp_get_post_terms( $post->ID, 'type');
                            if ( $type_terms ) {
                                echo '<span>('. esc_html($terms[0]->name) .')</span>';
                            }
                        ?>
                    </li>
                <?php endwhile; ?>
                </ol>
            <?php endif; ?>
        <?php
        // wp_reset_query(); <- YOU DON'T CHANGE GLOBAL $wp_query, SO THERE IS NO NEED TO RESET QUERY (ESPECIALLY DON'T DO THIS FOR EACH $tax_term
        }
    }
    // BUT YOU DO CHANGE GLOBAL $post, SO YOU SHOULD RESET IT'S VALUE TO BE COMPATIBLE WITH PLUGINS AND SO ON
    wp_reset_postdata();
?>

Les listes ordonnées (OL) seraient bien meilleures que les paragraphes (P) dans ce cas (puisqu'il s'agit de LISTES d'animaux ORDERED BY name).

1
Krzysiek Dróżdż