我找到了一个显示带有导航的词汇表的解决方案。
导航显示每个字符和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; ?>