首页 > 解决方案 > 基于 page_title 的起始字母的 div 内的无序列表中的多个列表项的 Foreach

问题描述

甚至很难用简短的标题来解释它,但我尽力了。

我有一个运行良好的 foreach 循环,但它显示结果的方式让我发疯。

在循环中,我检查页面标题是否以某个字母开头。如果是这样,我为这封信开始一个新的 DIV。这与字母表的每个字母。

只有开始<div>标签,<ul>标签等应该在循环内使用一次。结束标签也一样。只有<li>项目应该重复。

我也得到了这个工作,但它没有显示我想要的方式,我不知道我现在做错了什么。

它显示如下:

<div class="l-col-12">
    <div class="widget toggle-widget">
        <header>
            <h3 class="widget-title" id="letter-category-N">N</h3>
        </header>
        <div class="widget-content" style="display: block;">
            <ul>

                <li> <a href="#">Nog een provider</a></li>
            </ul>
        </div>
    </div>
    <li> <a href="#">Neostrada</a></li> <!-- This li is outside the div -->
</div>

但它应该是这样的:

<div class="l-col-12">
    <div class="widget toggle-widget">
        <header>
            <h3 class="widget-title" id="letter-category-N">N</h3>
        </header>
        <div class="widget-content" style="display: block;">
            <ul>

                <li> <a href="#">Nog een provider</a></li>
                <li> <a href="#">Neostrada</a></li> <!-- Should be here -->
            </ul>
        </div>
    </div>
</div>

我以前遇到过这个问题,我记得我当时和现在做的一样,但这次没有运气。

这是执行此操作的代码:

<div class="l-col-12">
<?php
global $post;
$args = array( 
    'post_type'     => array( 'page' ),
        'post_status'   => 'publish',
    'meta_query' => array(
        'is_featured' => array(
            'key' => 'soort_abonnement',
            'value' => '',
            'compare' => 'NOT IN'
        )),
    );
$myposts = get_posts( $args );
$letter_A_start = false;
$letter_N_start = false;
?>
<?php
foreach ( $myposts as $post ){
    setup_postdata( $post ); 
        $pagina_titel_bedrijf = get_the_title();
                if($pagina_titel_bedrijf[0] == "A" && !$letter_A_start){ ?>
                <div class="widget toggle-widget">
                    <header>
                        <h3 class="widget-title" id="letter-category-A">A</h3>
                    </header>
                    <div class="widget-content" style="display: block;">
                        <ul>
                            <?php $letter_A_start = true; ?>                         
                            <li> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
                            <?php if($letter_A_start == true){?>
                        </ul>
                    </div>
                </div>
                <?php } else {} }?>


                <?php if($pagina_titel_bedrijf[0] == "N") { ?>
                <?php if($pagina_titel_bedrijf[0] == "N" && !$letter_N_start){?>
                <div class="widget toggle-widget">
                    <header>
                        <h3 class="widget-title" id="letter-category-N">N</h3>
                    </header>
                    <div class="widget-content" style="display: block;">
                        <ul>
                            <?php $letter_N_start = true;} ?>                        
                            <li> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
                            <?php if($letter_N_start == true){?>
                        </ul>
                    </div>
                </div>
                <?php } else {} } ?>
<?php } ?>          
<?php wp_reset_postdata();?>
            </div>

标签: phphtmlloopsforeach

解决方案


未经测试的代码:

$listitems = [];
foreach ( $myposts as $post ){
    setup_postdata( $post ); 
    if (strlen($title = get_the_title())) {
        $listitems[strtoupper($title[0])][] = '<li> <a href="' . get_permalink() . '">' . $title . '</a></li>';
    }
}

foreach ($listitems as $letter => $items) {
    echo '<div class="widget toggle-widget">';
        echo '<header>';
            echo "<h3 class=\"widget-title\" id=\"letter-category-{$letter}\">{$letter}</h3>";
        echo '</header>';
        echo '<div class="widget-content" style="display: block;">';
            echo '<ul class="webhosters-list">';
                echo implode($items);
            echo '</ul>';
        echo '</div>';
    echo '</div>';
}

这应该会使您的代码块干燥,并使一切更易于管理。

迭代您的帖子并将每个列表项字符串存储在一个多维数组中,以便将来在更大的 div 块中内爆。

<li>除非有要显示的标签,否则第二个 foreach 循环不会创建任何 div 块。

strtoupper()当它用作数组中的键时,我调用标题的第一个字符$listitems,以便一切都是统一的。如果这不是必需的,您可以删除该部分。


推荐阅读