web-dev-qa-db-ja.com

別の分類法に基づいてwp_queryループによって表示される投稿リンクに割り当てられたカスタム分類法から用語名を追加する

私はカスタム投稿タイプ "Animals"とそれに割り当てられた2つのカスタム分類法( "Vertebrate"と "Type")を登録しました。それらはそれぞれ独自の用語を持っています。そして "Type"の場合は "water type"と "ground type"になります。

Page.phpを使用して、 "Vertebrate"カスタム分類法に割り当てられている用語でソートされているすべてのカスタム投稿(動物)のリストを表示したいと思います。ここでは、以下のコードを使用して成功します。

<?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();
          }
        }
?>

これは私にこのようなものを与えます:

哺乳類:

  • イルカ
  • オルカ

爬虫類:

  • トカゲ
  • ウミガメ

ただし、上記の一覧で、各投稿が "タイプ"分類のどの用語に割り当てられているのか(脊椎動物分類の用語以外に)、投稿リンクの後に名前を返すだけで表示することもできます。

私はこのようなことを達成しようとしています:

哺乳類:

  • 牛(グランドタイプ)
  • 犬(アースタイプ)
  • イルカ(水タイプ)
  • オルカ(水タイプ)
  • クジラ(水タイプ)

爬虫類:

  • トカゲ(地型)
  • ウミガメ(水タイプ)

私はこれで完全に立ち往生しています、またWordPressとPHPに関する私の知識は事実上ゼロであるので、私はこの問題に関するどんな援助でも喜んで受け入れます。

更新


私の友人はこれを手伝ってくれた。これでうまくいくはずです。

            <?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

このような何かが役立つはずです:

<?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();
?>

この場合、順序付きリスト(OL)は段落(P)よりはるかに優れています(これらは動物のリストであるため、名前順)。

1