如何将自定义域作为标题列出,并在其下列出共享该自定义域的所有页面?

时间:2018-08-02 作者:hellosisyphus

我正在尝试使用“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; ?>
但内容显示如下

  • STATE A 城市ASTATE A B市STATE A 城市C我想什么时候

    • STATE A
    • 城市A
    • 城市B
    • 城市C
      • 我在StackExchange上看到过类似的问题,但由于我的PHP技能非常有限,无法将这些答案转换为我需要的答案。不过,如果这个问题在其他地方得到了充分的回答,我深表歉意。

        我无法更改位置页面的URL或更改页面的模板,它们都是没有子级的一级页面。

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

您要做的是创建一个跟踪“当前”状态的变量,然后为循环中的每个post检查其状态是否与当前状态相同。如果不是,则将其输出并将当前状态更新为新状态。这将产生只在第一篇文章前面输出状态名称的效果。

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,没有打开和关闭标记,但这只是因为它更容易看到我所做更改的逻辑。您可以随意输出标记。

结束