WordPress 修改首页文章摘要字数

我用的 “blog-kit” 主题,默认只展示一行摘要,现在我想改成显示 3 行;基本思路是将摘要字符数放开到一个长度,然后用css控制多行加省略号;

解决方案

将摘要显示字数放开到200个,这时候显示行数不定,大约是4行,然后用 css 控制,只显示3行;

兼容情况不考虑,css 不兼容的情况,有的文章会显示3行摘要,有的会显示4行,这个我觉得可以忍;

* 这里的 200 是指字符串长度,一个英文字母、一个汉字、一个数字都占一位;

style.css 中,添加 css 控制多行省略号的样式:

/* 首页摘要字数控制 */
.entry-content p:first-of-type {overflow: hidden; text-overflow: ellipsis;
    display: -webkit-box;-webkit-line-clamp: 3;-webkit-box-orient: vertical;}

剩下的就是修改摘要字数了;这里有两类方案

方案1:不改变原主题的逻辑,在原主题设置之后再进行覆盖

functions.php 中,添加下面的代码:

function custom_excerpt_length( $length ) {
    return 200;    //填写需要截取的字符数
}
function set_excerpt_length() {
    add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );
}
add_action('wp_head', 'set_excerpt_length');

方案2:覆盖原主题中的方法

functions.php 中,添加下面的代码:

function blog_kit_implement_excerpt_length() {
    return 200;
}

详细解析

第一步中的两类方案,思路是没问题的, 具体的代码可能不通用;下面详细说一下原因;

blog-kit/inc/template-functions.php 中,有这样一段代码:

//=============================================================
// Function to change default excerpt
//=============================================================
if ( ! function_exists( 'blog_kit_implement_excerpt_length' ) ) :
  /**
   * Implement excerpt length.
   * @since 1.0.0
   * @param int $length The number of words.
   * @return int Excerpt length.
   */
  function blog_kit_implement_excerpt_length( $length ) {
    $excerpt_length = blog_kit_get_option( 'excerpt_length' );
    if ( absint( $excerpt_length ) > 0 ) {
      $length = absint( $excerpt_length );
    }
    return $length;
  }
endif;

// …… 其他代码

if ( ! function_exists( 'blog_kit_hook_read_more_filters' ) ) :
    /**
        * Hook read more and excerpt length filters.
        * @since 1.0.0
    */
    function blog_kit_hook_read_more_filters() {
	add_filter( 'excerpt_length', 'blog_kit_implement_excerpt_length', 999 );
	// …… 其他代码
    }
endif;
add_action( 'wp', 'blog_kit_hook_read_more_filters' );

if ( ! function_exists( 'blog_kit_get_option' ) ) :
  /**
   * Get theme option.
   * @since 1.0.0
   * @param string $key Option key.
   * @return mixed Option value.
   */
  function blog_kit_get_option( $key ) {
    if ( empty( $key ) ) return;
    //default theme options
    $defaults                      = array();
    // …… 其他代码
    $defaults['excerpt_length']    = 40;
    // …… 其他代码
    return $value;
  }
endif;

add_action( ‘wp’, ‘blog_kit_hook_read_more_filters’ ); 是上面那段代码的入口,函数调用顺序为:

在 wp 钩子中给 excerpt_length 加了过滤器 =>
blog_kit_hook_read_more_filters =>
blog_kit_implement_excerpt_length =>
blog_kit_get_option

最终的 blog_kit_get_option 中,有一句 “$defaults[‘excerpt_length’] = 40;” 这个就是 blog-kit 主题设置摘要字数的地方,直接修改这里是可以的,但要在子主题中进行,该函数中还设置了其他一些配置项,直接覆盖这个函数并不好;

第一种解决方案中,是在 wp_head 钩子上加一个回调,回调里边给 excerpt_length 添加过滤器,custom_excerpt_length 是自定义函数的名称,返回的是一个摘要显示字数;

* wp 钩子在 wp_head 之前执行;

第二种解决方案中,覆盖了原主题中返回摘要字数的方法,达到控制字数的效果;

其他

如果主题中没有设置摘要字数的逻辑,就去改 wordpress 的默认设置,或者仿照 blog-kit 的设置逻辑在 functions.php 中添加覆盖默认设置的函数;

wordpress 默认的摘要字数设置,在 wp_includes/formatting.php 中,代码为下面这句:

$excerpt_length = apply_filters( 'excerpt_length', 55 );

或者一开始就直接全局搜 excerpt_length 这个关键词,看摘要字数都是在哪儿设置的;

如果这篇文章对你有用,可以点击下面的按钮告诉我

0

发表回复