web-dev-qa-db-ja.com

カスタムフィールドをヘッダーとして一覧表示し、そのカスタムフィールドを共有するすべてのページをその下に一覧表示する方法

利用可能な場所のすべての都市ページを一覧表示するために "State"というカスタムフィールドを使用しようとしています。このコードを使用すると、正しい結果を(状態のアルファベット順)正しい順序で取得できます。

<?php
            // query
            $the_query = new WP_Query(array(
                'post_type'         => 'page',
                'posts_per_page'    => -1,
                'meta_key'          => 'state_full',
                'orderby'           => 'meta_value',
                'order'             => 'ASC'
            ));

        ?>
        <?php if( $the_query->have_posts() ): ?>
        <ul> 
            <?php
                while( $the_query->have_posts() ) : $the_query->the_post(); 

                       $state = get_field('state_full');

            ?>
            <?php echo $state ?>
            <li>
                <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
            </li>
            <?php endwhile; ?>
        </ul>
        <?php endif; ?>

しかし、内容は次のように表示されます。

  • 州A 市A
  • 州A 市B
  • 州A 市C

欲しいとき

  • 州A
  • 市A
  • 市B
  • 市C

私はStackExchangeで同様の質問をしましたが、私のPHPスキルは非常に限られているので、それらの答えを必要なものに変換することはできませんでした。それでも、この質問が他のところで適切に答えられたならば、私の謝罪。

ロケーションページのURLを変更したり、ページのテンプレートを変更したりすることはできません。それらはすべて、子供のいない第1レベルのページです。

1
hellosisyphus

あなたがしたいのは、 '現在の'状態を追跡する変数を作成してから、ループの各投稿に対して、その状態が現在の状態と同じであるかどうかをチェックすることです。出力されていない場合は、それを出力して現在の状態を新しい状態に更新します。これは、その州の最初の投稿の前に州名を出力するだけの効果があります。

if ( $the_query->have_posts() ) :
    /**
     * Create the variable to keep track of the current State in the loop.
     */
    $current_state = null;

    echo '<ul>';
        while( $the_query->have_posts() ) : $the_query->the_post();
            $state = get_field( 'state_full' );

            /**
             * If the state of the current post is different to the current state
             * then output the new state and update the current state.
             */
            if ( $state !== $current_state ) {
                echo '<li><strong>' . $state . '</strong></li>';
                $current_state = $state;
            }

            echo '<li><a href="' . get_the_permalink() . '">' . get_the_title() .  '</a></li>';
        endwhile;
    echo '</ul>';
endif;

私はあなたのコードを少し微調整したので、タグを開いたり閉じたりしなくても純粋なPHPになりますが、それは私が行った変更の論理を見るのが少し簡単になるからです。あなたは好きなようにマークアップを出力することができます。

0
Jacob Peattie