我用的 “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 这个关键词,看摘要字数都是在哪儿设置的;