代码之家  ›  专栏  ›  技术社区  ›  Cray

WordPress:显示A-Z列表中的帖子,带有导航和字母标题

  •  0
  • Cray  · 技术社区  · 1 年前

    我想在a-Z列表中显示一个帖子列表,并通过导航跳转到字母标题。

    导航应显示所有字符和数字。如果没有带有字符的帖子,则该字符应处于非活动状态/没有链接。

    如果将数字组合成一个名为0-9的链接,那也会很好。

    例如这样(C和E没有帖子):

    0-9 | A. | B C D E F | ...

    我现在正在使用以下代码:

    <?php
    $args = array(
        'post_type'     => array( 'post_type' ),
        'post_parent'   => 0,
        'orderby'       => 'name',
        'order'         => 'ASC',
    );
    // The Query
    $query_post_type = new WP_Query( $args );
    ?>
    
    <?php if ( $query_post_type->have_posts() ) : ?>
    
        <ul>
        <?php $letter = '';  while ( $query_post_type->have_posts() ) : $query_post_type->the_post(); ?>
            <?php
            if($letter != strtoupper(get_the_title()[0])) :
                echo ($letter != '') ? '' : '';
                $letter = strtoupper(get_the_title()[0]);
                echo '<li class="list-inline-item"><a href="#'.strtoupper(get_the_title()[0]).'">'.strtoupper(get_the_title()[0]).'</a></li>';
            endif;
            ?>
        <?php endwhile; ?>
        </ul>
    
    
        <div>
            <?php $letter = '';  while ( $query_post_type->have_posts() ) : $query_post_type->the_post(); ?>
                <?php
                if($letter != strtoupper(get_the_title()[0])) :
                    echo ($letter != '') ? '</ul></div>' : '';
                    $letter = strtoupper(get_the_title()[0]);
                    echo '<div><ul class="list-unstyled"><p class="h4"><a name="'.strtoupper(get_the_title()[0]).'"></a>'.strtoupper(get_the_title()[0]).'</p>';
                endif;
                ?>
                <div>
                    <strong class="title">
                        <a href="<?php the_permalink(); ?>" class="" alt="<?php echo get_the_title(); ?>"><?php the_title(); ?></a>
                    </strong>
                    <?php the_field('post_type_excerpt'); ?>
                </div>
            <?php endwhile; ?>
        </div>
    
    <?php else : ?>
    
    <?php endif; wp_reset_postdata(); ?>
    

    获取所有帖子并在它们之前添加一个字母标题效果很好。

    导航也适用于每个有帖子的角色。 但我找不到一个解决方案来添加整个字母表和组合0-9的数字。

    0 回复  |  直到 1 年前
        1
  •  1
  •   Cray    1 年前

    我找到了一个显示带有导航的词汇表的解决方案。

    导航显示每个字符和0-9之间所有数字的组合链接。

    <?php
    $args = array(
        'post_type' => array( 'post_type' ),
        'post_parent' => 0,
        'posts_per_page' => -1,
        'orderby' => 'name',
        'order' => 'ASC',
    );
    
    $query_ratgeber = new WP_Query( $args );
    
    if ( $query_ratgeber->have_posts() ) :
        $letters = range( 'A', 'Z' );
        $letters[] = '0-9'; // add numbers
    ?>
        <ul class="glossary-nav">
            <?php foreach ( array_merge( array('0-9'), range( 'A', 'Z' ) ) as $letter ) : ?>
                <?php
                    $posts = array();
                    while ( $query_ratgeber->have_posts() ) :
                        $query_ratgeber->the_post();
                        $post_letter = strtoupper( substr( get_the_title(), 0, 1 ) );
                        if ( $letter === '0-9' ) {
                            if ( preg_match( '/^[0-9]/', $post_letter ) ) {
                                $posts[] = $post;
                            }
                        } else {
                            if ( $post_letter === $letter ) {
                                $posts[] = $post;
                            }
                        }
                    endwhile;
                    wp_reset_postdata();
                    if ( ! empty( $posts ) ) :
                ?>
                    <li class="list-inline-item">
                        <?php if ( $letter === '0-9' ) : ?>
                            <a href="#0-9"><?php echo $letter; ?></a>
                        <?php else : ?>
                            <a href="#<?php echo $letter; ?>"><?php echo $letter; ?></a>
                        <?php endif; ?>
                    </li>
                <?php else : ?>
                    <li class="list-inline-item disabled"><span><?php echo $letter; ?></span></li>
                <?php endif; ?>
        
            <?php endforeach; ?>
        </ul>
    
        <div class="glossary">
            <?php
            $posts_0_9 = array();
            $posts_letters = array();
        
            while ( $query_ratgeber->have_posts() ) :
                $query_ratgeber->the_post();
                $post_letter = strtoupper( substr( get_the_title(), 0, 1 ) );
                if ( preg_match( '/^[0-9]$/', $post_letter ) ) {
                    $posts_0_9[] = $post;
                } else {
                    $posts_letters[$post_letter][] = $post;
                }
            endwhile;
        
            if ( ! empty( $posts_0_9 ) ) :
                echo '<ul class="glossary-section"><li class="glossary-title"><p class="h4"><a name="0-9"></a>0-9</p></li>';
                foreach ( $posts_0_9 as $post ) :
                    setup_postdata( $post ); ?>
                    <li>
                        <a href="<?php the_permalink(); ?>" class="" alt="<?php echo get_the_title(); ?>"><?php the_title(); ?></a>
                    </li>
                <?php endforeach;
                echo '</ul>';
            endif;
        
            foreach ( range( 'A', 'Z' ) as $letter ) :
                if ( ! empty( $posts_letters[$letter] ) ) :
                    echo '<ul class="glossary-section"><li class="glossary-title"><p class="h4"><a name="' . $letter . '"></a>' . $letter . '</p></li>';
                    foreach ( $posts_letters[$letter] as $post ) :
                        setup_postdata( $post ); ?>
                        <li>
                            <a href="<?php the_permalink(); ?>" class="" alt="<?php echo get_the_title(); ?>"><?php the_title(); ?></a>
                        </li>
                    <?php endforeach;
                    echo '</ul>';
                endif;
            endforeach;
        
            wp_reset_postdata();
            ?>
        </div>
    <?php endif; ?>