Dayi Lin, Ph.D.

Staff Researcher, AI & Software Engineering

打造群博1:将WP模板首页显示全文改为显示摘要

笔记

这两天在帮小组搭建群博,在此记录一下整个过程中学到的一些关于WordPress的技巧。

不得不说WordPress真的是一个非常强大而灵活的建站工具。丰富的插件和主题都给了它非常自由的发展空间。

话不多说,先来看看遇到的第一个问题:挑了一个看起来不错的模板,无奈其目录页(首页,分类等)都是全文显示博文,使得查看很不方便,页面加载也慢。后台并没有提供修改显示全文还是显示摘要的功能,怎么办呢?

首先,我们来看看模板的首页部分的代码,试着能不能找到线索。

在首页,我们可以看到如下代码:
[php]
<div id=”primary” class=”content-area”>
<div id=”content” class=”site-content” role=”main”>
<?php if ( have_posts() ) :
while ( have_posts() ) : the_post();
get_template_part( ‘content’, get_post_format() );
endwhile;
minimalizine_content_nav();
else :
get_template_part( ‘no-results’, ‘index’ );
endif; ?>
</div><!– #content.site-content –>
</div><!– #primary.content-area –>
[/php]

我们很容易定位到核心的PHP语句,就是那个if。那么,if的条件have_post()和底下的the_post()是什么意思呢?

WordPress的have_posts() 默认是一个全局函数。

have_posts函数被调用时实际上是调用全局变量$wp_query->have_posts()成员函数,来简单检查一个全局数组(array)变量$posts的一个循环计数器,以确认是否还有post,如果有返回true(1),如果没有返回false(0)。

the_post()函数则调用$wp_query->the_post()成员函数前移循环计数器,并且创建一个全局变量$post(不是$posts),把当前的post的所有信息都填进这个$post变量中,以备接下来使用。

简单的使用可以通过函数来直接执行,如the_content()直接显式post的内容,the_title()显式帖子的标题,the_time()显示帖子的时间等WORDPRESS的Template Tags。

高级应用或要定制应用则可以直接调用$post变量的成员。

可见这段代码的逻辑是用一个while循环,只要队列中还有文章,就调用the_post()改变计数器并用get_template_part( ‘content’, get_post_format() );显示文章。

于是关键就变成了这个get_template_part( ‘content’, get_post_format() );这又是什么意思呢?

描述:
加载一个制定的模板到另一个模板里面(不同于包含header,sidebar,footer).
使得一个主题使用子模板来实现代码段重用变得简单

用于在模板中包含指定的模板文件,只需用指定参数slug和name就可以包含文件{slug}-{name}.php,最重要的功能是如果没有这个文件就包含没有{name}的.php文件文件

使用方法:


参数:
$slug (必须) 通用的模板名

$name (可选) 指定的模板名

示例:

使用 loop.php 在子主题里面

假设主题文件夹wp-content/themes下父主题是twentyten子主题twentytenchild,那么下面的代码:


php 的require()函数将按下面优先级包含文件

1. wp-content/themes/twentytenchild/loop-index.php
2. wp-content/themes/twentytenchild/loop.php
3. wp-content/themes/twentyten/loop-index.php
4. wp-content/themes/twentyten/loop.php

如此说来,核心就应该在content.php这个文件里了~我们查看它的代码,找到下面这段:
[php]
<?php if (is_search()): // Only display Excerpts for Search ?>
<div class=”entry-summary”>
<?php the_excerpt(); ?>
</div>
<!– .entry-summary –>
<?php else : ?>
<div class=”entry-content”>
<?php the_content(__(‘Continue reading <span class=”meta-nav”>→</span>’, ‘twentyeleven’)); ?>
<?php wp_link_pages(array(‘before’=>'<div class=”page-link”><span>’.__(‘Pages:’, ‘twentyeleven’).'</span>’, ‘after’=>'</div>’)); ?>
</div>
<!– .entry-content –>
<?php endif; ?>
[/php]

由这段代码我们可以清楚的看到,WordPress 默认的普通列表也是显示全文,只有在搜索页的结果才会显示摘要。

the_excerpt() 函数简介

那上文提到了在搜索列表也会显示摘要,那么我们是不是把其余的列表也的结果也使用 the_excerpt() 函数处理就搞定了?很抱歉,这样做往往还是显示全文。因为 The_excerpt() 主要是针对英文中处理的,默认是截取55个英文单词的,但是在中文中却是无法截取到55个汉字。原因是因为在 WordPress 的 the_excerpt() 函数中用到了
$text = implode(‘ ‘, $words);
在 PHP 中是用空格来截取字数的,而我们汉字就杯具了,因为我们汉字是相连的,没有空格来区分,所以在使用中文的时候,经常地我们使用 the_excerpt() 函数的时候,截取出来的结果是全文!

重写 excerpt_length()

上面介绍了,the_excerpt() 自带的截取的字符是截取英文单词的长度,而对于中文是不适用的。因此我们不能使用单词数的截取方法了,这时我们需要通过截取字符长度的方式来获得摘要的字数了。而这就需要通过修改 WordPress 的 excerpt_length() 方法了。
[php]
function my_excerpt_length($length) {
return 170;
}
add_filter(‘excerpt_length’, ‘my_excerpt_length’);
[/php]
通过 WordPress 提供的 add_filter() 函数来重写 excerpt_length() 方法,指定截取摘要的字符窜长度(例子中的为170个字符)。对了,实现摘要的操作就这么简单,只需要在 function.php 文件中加上上面的这段代码,然后将 content.php 的代码调整成:
[php]
// 现在的处理是所有的列表页面都显示文章摘要了
<div class=”entry-summary”>
<?php the_excerpt(); ?>
</div>
[/php]
重写 excerpt_more()

完成了字符窜的截取,我们还需要处理的一个细节就是紧接在摘要后面的“阅读全文”的链接。WordPress 自带的当然是英文的说明,我们可以通过重写 excerpt_more() 函数来更精确的控制摘要的显示结果。
[php]
// 添加到 function.php 文件中就 OK 了
function new_excerpt_more($more) {
global $post;
return ‘… [<a href=”‘. get_permalink($post->ID) . ‘”>阅读全文</a>]’;
}
add_filter(‘excerpt_more’, ‘new_excerpt_more’);
[/php]
excerpt_more() 和 excerpt_length() 这两个函数都是在执行 the_excerpt() 函数式自动会调用到的。所以我们就不用再做多余的操作了。只要花点时间看看 API,是完全没有必要用插件来实现摘要显示的。好了,到这里如何修改摘要显示就介绍完了,希望能够对大家有所帮助。

Leave a Reply

Your email address will not be published. Required fields are marked *