WordPress:词汇表列表与A-Z导航和字母标题没有插件

cyvaqqii  于 2023-04-05  发布在  WordPress
关注(0)|答案(1)|浏览(152)

我想在一个A-Z列表中显示一个帖子列表,并带有一个跳转到字母标题的导航。
导航应显示所有字符和数字。如果没有字符的帖子,该字符应处于非活动状态/没有链接。
如果将数字组合到一个称为0-9的链接中也会很好。
例如,像这样(C和E没有帖子):

0-9||B|C|D|E级||……

我现在使用以下代码:

<?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的数字。

ahy6op9u

ahy6op9u1#

我发现了一个解决方案,它可以显示带有导航的词汇表。
导航显示每个字符和从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; ?>

相关问题