最新消息:

将WP模板首页显示全文改为显示摘要

Archives admin 198浏览

这两天在换空间换主题换版本,在此记录一下整个过程中学到的一些关于WordPress的技巧。

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

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

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

在首页,我们可以看到如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
<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语句,就是那个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这个文件里了~我们查看它的代码,找到下面这段:

1
2
3
4
5
6
7
8
9
10
11
12
<?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; ?>

由这段代码我们可以清楚的看到,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() 方法了。

1
2
3
4
function my_excerpt_length($length) {
    return 170;
}
add_filter('excerpt_length', 'my_excerpt_length');

通过 WordPress 提供的 add_filter() 函数来重写 excerpt_length() 方法,指定截取摘要的字符窜长度(例子中的为170个字符)。对了,实现摘要的操作就这么简单,只需要在 function.php 文件中加上上面的这段代码,然后将 content.php 的代码调整成:

1
2
3
4
// 现在的处理是所有的列表页面都显示文章摘要了

转载请注明:哥姐博客网 blog.gjwap.cn » 将WP模板首页显示全文改为显示摘要