wordpress主循环显示文章列表不同样式的方法 wordpress


内容查询离不开循环, WordPress为内容查询构建了主循环,其中包括常规查询和循环中常用内容的查询函数,还有稍微高级的自定义查询,下面就让我们来一一了解。


主循环简介

在WordPress中显示文章内容都是用主循环(The Loop),包括首页、分类页、文章页和搜索结果等其他页面,自定义查询也是用主循环,这个循环挂载了WordPress许多动作和钩子,通过主循环我们不仅可以快捷有效地把内容展示出来,同时别处的代码(如 functions.php 文件)也能通过动作钩子实现修改查询条件或内容。

最常见的主循环(这样的循环在WordPress模板文件中随处可见,如 index.php):

<?php
if (have_posts()) :
while (have_posts()) : the_post();
//~ 在这里使用内容函数,如 the_title();
endwhile;
endif;
?>

或者首页显示文章的代码一般都是:

<?php if (have_posts()) : ?> 
 <!--检查是否有文章如果有,继续执行,没有就跳到  else 那里-->   
<?php  while (have_posts()) : the_post(); ?> 
<!--开始准备文章内容,开始循环,每次循环输出一篇文章-->   
此处显示文章内容或标题之类的。。   
<?php  endwhile ; ?>  
<!-- while 循环结束-->   
<?php  else : ?>   
此处显示未找到文章时的信息,比如404相关   
<?php  endif ; ?>   <!-- if 结束-->

如上代码所示,我们很容易就能看懂其中的原理:WordPress先通过 have_posts() 判断是否有文章,如果有就使用 while 语句循环,然后在循环中通过 the_post() 设置当前文章内容的全局变量,这样我们就可以轻而易举地在循环中使用函数输出内容到浏览器了。

如果你想找没有找到内容的时候显示一个提示,你可以这样:

<?php
if (have_posts()) :
while (have_posts()) : the_post();
//~ 在这里使用内容函数,如 the_title();
endwhile; else :
//~ 在这里放置关于没有找到内容的提示
endif;
?>

常用函数

在主循环中最常用到的函数:

1、使用 the_ID() 输出文章ID(返回值使用 get_the_ID() )

2、使用 the_title() 输出文章标题(返回值使用 get_the_title() )

3、使用 the_title_attribute() 输出文章标题属性

4、使用 the_permalink() 输出文章固定链接(返回值使用 get_permalink() )

5、使用 the_shortlink() 输出文章短链接(返回值使用 wp_get_shortlink() )

6、使用 the_excerpt() 输出文章摘要(返回值使用 get_the_excerpt() )

7、使用 the_content() 输出文章内容(返回值使用 get_the_content() )

8、使用 the_category() 输出文章分类目录(返回值使用 get_the_category() ,返回分类列表使用 get_the_category_list())

9、使用 the_tags() 输出文章标签(返回值使用 get_the_tags() ,返回标签列表使用 get_the_tag_list())

10、使用 the_meta() 输出文章自定义meta信息

11、使用 the_author() 输出文章作者(返回值使用 get_the_author())

12、使用 the_author_link() 输出文章作者(带链接)(返回值使用 get_the_author_link())


写一个循环

好了,既然我们知道WordPress主循环是什么样的了,也知道在循环中应该用什么函数输出内容了,下面就让我们来写一个循环来试试身手吧!

首先,我们写一个归档页的(也可以是首页的)模板,归档的就是文章列表了,文章列表一般都是有一个文章标题(带链接可点击)和一段摘要:

<?php
//~ 载入头部模板
get_header();
//~ 循环开始
if (have_posts()) :
while (have_posts()) : the_post();
?>
<h3><a href="<?php the_permalink();?>" title="<?php the_title_attribute();?>"><?php the_title();?></a></h3>
<div><?php the_excerpt();?></div>
<?php
endwhile;
endif;
//~ 载入侧边栏模板
get_sidebar();
//~ 载入底部模板
get_footer();
?>

好了,我们有一个归档页,接下来就应该是具体内容的文章页了,文章页的标题不需要带链接,但应该展示更多关于这篇文章的内容,如作者、分类、标签等,同时文章内容输出的就不应该是摘要了,而是全部内容。

<?php
//~ 载入头部模板
get_header();
//~ 循环开始
if (have_posts()) :
while (have_posts()) : the_post();
?>
<h3><?php the_title();?></h3>
<p>文章作者:<?php the_author_link(); ?></p>
<div class="cat">分类:<?php the_category(', ');?></div>
 <?php the_tags('<div class="tag">标签:', ', ', '</div>' ); ?>
<div><?php the_content();?></div>
<?php
endwhile;
endif;
//~ 载入侧边栏模板
get_sidebar();
//~ 载入底部模板
get_footer();
?>

细心的童鞋应该有了新的发现,没错,就是 the_category() 和 the_tags() 有传入参数;其中 the_category() 传入的是一个逗号,显然这是多个分类时的分隔符;而 the_tags() 则传入了三个参数,中间那个逗号显然也是分隔符,而前后两个参数则是添加在标签内容前后的内容;这些函数的具体用法和传入参数都可以在WordPress官方的函数参考中找到。


自定义循环

WordPress常规循环我们都已经了解,包括归档页和文章页(其实无论什么页面,循环都一样,只是循环里显示的内容略有区别而已),接下来,我们来学习稍微高级一点的自定义查询循环。

在WordPress中自定义查询内容我们可以使用 WP_Query 类,不过,还有比这更简单的方法,那就是使用 query_posts() 函数,这个函数是来自 WP_Query 类的封装,所以传入参数完全一样(传入参数官方说明),但用法更简单,代码更简洁。

<?php
//~ 通过 $args 传入查询参数,可以是数组,也可以是文本模式(以key=value格式并以&隔开多个参数)
query_posts( $args );
//~ 循环
while ( have_posts() ) : the_post();
//~ 在这里使用内容函数,如 the_title();
endwhile;
//~ 循环后使用这个函数重置查询,以防影响其他常规查询
wp_reset_query();
?>

以下是一个例子(查询最新5篇文章):

<?php
query_posts( 'orderby=date&order=DESC&posts_per_page=5' );
如果要把自定义参数和当前页面预置的查询参数合并起来,你可以这样:
<?php
//~ 在预置查询条件的前提下把排序改为升序
global $query_string;
query_posts( $query_string . '&order=ASC' );

变预置参数

通过 query_posts() 函数我们可以自定义查询条件(一般用来新建自定义查询而不是直接使用在常规查询中),但是有些时候,我们需要更改常规查询的查询条件,如在首页排除某个分类,或者是在搜索结果中排除页面。

对于这样的需求,建议通过 pre_get_posts 动作来实现,如在首页排除ID是1和4的分类,我们只需这样:

function exclude_category( $query ) {
if ( $query->is_home() && $query->is_main_query() ) $query->set( 'cat', '-1,-4' );
}
add_action( 'pre_get_posts', 'exclude_category' );

在搜索结果中只显示文章的结果,我们可以这样:

function search_filter($query) {
if ( !is_admin() && $query->is_main_query() && $query->is_search ) $query->set('post_type', array( 'post' ) );
}
add_action('pre_get_posts','search_filter');



假如我们选择首页显示最新文章,并且:第一篇文章显示摘要,后面的只显示标题。。。还有第一篇文章显示广告之类的。。。那么如何利用循环控制呢?


1、首页显示文章的代码一般都是:

<?php if (have_posts()) : ?>     
<!--检查是否有文章如果有,继续执行,没有就跳到  else 那里-->   
<?php  while (have_posts()) : the_post(); ?>
<!--开始准备文章内容,开始循环,每次循环输出一篇文章-->   
此处显示文章内容或标题之类的。。   
<?php  endwhile ; ?> 
<!-- while 循环结束-->   
<?php  else : ?>   
此处显示未找到文章时的信息,比如404相关   
<?php  endif ; ?> 
<!-- if 结束-->

2、要想精确的控制每篇文章,我们先在循环前定义一个变量 $ashu_i=1 来计数,变量名随便,然后每循环一次,$ashu_i加1,例子我把index.php中的代码改成下面的--

<?php if (have_posts()) :$ashu_i=0;?>   
<?php while (have_posts()) : the_post();$ashu_i++;?>   
<?php echo "这是第 $ashu_i 篇文章:<br/>";?>   
<?php the_title();?>   
<?php echo "<hr>";   
<?php endwhile; ?>   
<?php else : ?>   
此处显示未找到文章时的信息,比如404相关   
<?php endif; ?>

上面的例子就给每篇文章来了个简单控制。

3、具体要想让第一篇文章显示摘要,而余下的显示标题--代码:

<?php if (have_posts()) :$ashu_i=0;?> 
<!--检查是否有文章,并定义计数变量初始值为0 -->   
<?php while (have_posts()) : the_post();$ashu_i++;?>
 <!-- 开始循环,第一次循环$sahu_i为1,第二次为2,依次。。 -->   
<?php if($ashu_i==1){?>      <!-- 如果是第一篇文章 -->   
<?php the_content();}else{?> <!-- 显示内容 -->   
<?php the_title();}?>        <!-- 如果不是第一篇显示标题 -->   
<?php endwhile; ?>           <!-- 一次while循环结束 -->   
<?php else : ?>              <!--如果没有文章-->   
 此处显示未找到文章时的信息,比如404相关   
<?php endif; ?>          <!--if结束 -->

上面的代码就可以实现第一篇文章显示摘要,而后面的文章都只显示标题


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回