php - 基于 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>
解决方案
未经测试的代码:
$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
,以便一切都是统一的。如果这不是必需的,您可以删除该部分。
推荐阅读
- angular - 如何在 ionic 4 中禁用侧边菜单?
- python-3.x - 在 pandas 中识别两个不同大小的数据帧中的公共列值
- javascript - 保存/导出 Chrome 的 JavaScript 控制台输入历史
- php - 如何使用验证规则:通过仅比较 foreign_key 在数据上唯一
- javascript - 在 Netlify 上部署 React 网站时出现空白页面
- javascript - 捏合/展开触摸缩放 — 如何避免创建“缩放陷阱”?
- ios - 科尔多瓦 iOS;保存时查看更改
- angular - 如何查找离子范围组件中的指针移动是否已停止?
- ios - 当应用程序进入和退出后台时更新ios中的计时器
- arrays - 计算数组中未通过测试用例的变量数