IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    林 达意发表于 2013-07-28 12:53:16
    love 0

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

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

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

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

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

    我们很容易定位到核心的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这个文件里了~我们查看它的代码,找到下面这段:

    
    
    →', 'twentyeleven')); ?> '
    '.__('Pages:', 'twentyeleven').'', 'after'=>'
    ')); ?>

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

    function my_excerpt_length($length) {
        return 170; 
    }
    add_filter('excerpt_length', 'my_excerpt_length');
    

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

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

    重写 excerpt_more()

    完成了字符窜的截取,我们还需要处理的一个细节就是紧接在摘要后面的“阅读全文”的链接。WordPress 自带的当然是英文的说明,我们可以通过重写 excerpt_more() 函数来更精确的控制摘要的显示结果。

    // 添加到 function.php 文件中就 OK 了
    function new_excerpt_more($more) {
    	global $post;
    	return '... [ID) . '">阅读全文]';
    }
    add_filter('excerpt_more', 'new_excerpt_more');
    

    excerpt_more() 和 excerpt_length() 这两个函数都是在执行 the_excerpt() 函数式自动会调用到的。所以我们就不用再做多余的操作了。只要花点时间看看 API,是完全没有必要用插件来实现摘要显示的。好了,到这里如何修改摘要显示就介绍完了,希望能够对大家有所帮助。



沪ICP备19023445号-2号
友情链接