caogenbj 的分页代码里有这么一段:
echo "<li>";
previous_posts_link( '上一页' );
echo "</li>";
看着没毛病。但第一页的时候,previous_posts_link 什么都不输出——它只在“有上一页”时才输出链接。
结果就是:<li></li>,一个空的列表项。
空 li 在页面上可能看不出来(没有文字),但它会占一个位置,样式边框、间距都会受影响。更糟的是,读屏软件会读到一个空项。
因为 previous_posts_link() 是“直接输出”的函数——它没有返回值,直接 echo。你外面已经打了 <li>,它不输出内容,li 就空了。
WordPress 提供了两个“返回字符串”的版本:
get_previous_posts_link():返回上一页链接(字符串),不直接输出;get_next_posts_link():返回下一页链接。用它们可以先判断“有没有”,再决定要不要包 <li>:
<?php
$prev = get_previous_posts_link( '上一页' );
if ( $prev ) {
echo '<li>' . $prev . '</li>';
}
$next = get_next_posts_link( '下一页' );
if ( $next ) {
echo '<li>' . $next . '</li>';
}
?>
这样第一页时,$prev 是空字符串,if 不成立,压根不输出 <li>。最后一页同理。
这就是“get_ 前缀”的意义:有 get_ 的返回字符串,没 get_ 的直接输出。
WordPress 里这种“成对”的函数不少:
| 直接输出 | 返回字符串 |
|---|---|
the_title() |
get_the_title() |
the_permalink() |
get_permalink() |
the_excerpt() |
get_the_excerpt() |
previous_posts_link() |
get_previous_posts_link() |
规律:要拼进 HTML 结构里、需要判断的,用 get_ 版本;直接输出内容的,用 the_ 版本。
caogenbj 的分页还有个问题:模板里写了一个 <ul class="pagination">,分页函数内部又输出一个 <ul>,变成“ul 套 ul”。
这个我这次一并改了:把模板层那个多余的 ul 删掉,只留函数内部那个。
一句话记住:要判断“有没有”再用,就用 get_previous_posts_link 返回字符串;直接 previous_posts_link 会留下空 li。
下一篇讲面包屑。