WordPress 摘要有两种显示方式:
一种是通过写文章的时候在其中加入标签,然后在模板中使用the_conten(“阅读更多…”),这个函数将会读出你的post直到<!—more–>处断掉输出。缺点:需要在每篇文章中加入<!—more–>标签;
另外一种方法就是在模板中直接利用the_excerpt()函数,这个函数将会自动取出你文章的部分内容,并且以本文的格式输出。缺点:文字都堆积在一起,阅读性差。
下面教大家如何自定义文章摘要显示和长度,解决以上问题。
- function the_blog_excerpt($content, $size = 500, $echo = true) {
- $out = '';
- $_size = mb_strlen($content, 'utf-8');
- if ($_size <= $size) {
- $out = $content;
- } else if (strpos($content, '<') === false) {
- $out = mb_substr($content, 0, $size);
- } else if ($e = strpos($content, '<!-- more -->')) {
- $out = mb_substr($content, 0, $e);
- } else {
- $strlen_var = strlen($content);
- $html_tag = 0;
- $summary_string = '';
- $html_array = array('left' => array(), 'right' => array());
- for ($i = 0; $i < $strlen_var; ++$i) {
- if (!$size) {
- break;
- }
- $current_var = substr($content, $i, 1);
- if ($current_var == '<') {
- $html_tag = 1;
- $html_array_str = '';
- } else if ($html_tag == 1) {
- if ($current_var == '>') {
- $html_array_str = trim($html_array_str);
- if (substr($html_array_str, -1) != '/') {
- $f = substr($html_array_str, 0, 1);
- if ($f == '/') {
- $html_array['right'][] = str_replace('/', '', $html_array_str);
- } else if ($f != '?') {
- if (strpos($html_array_str, ' ') !== false) {
- $html_array['left'][] = strtolower(current(explode(' ', $html_array_str, 2)));
- } else {
- $html_array['left'][] = strtolower($html_array_str);
- }
- }
- }
- $html_array_str = '';
- $html_tag = 0;
- } else {
- $html_array_str .= $current_var;
- }
- } else {
- --$size;
- }
- $ord_var_c = ord($content {$i});
- switch (true) {
- case(($ord_var_c & 0xE0) == 0xC0) : $summary_string .= substr($content, $i, 2);
- $i += 1;
- break;
- case (($ord_var_c & 0xF0) == 0xE0) : $summary_string .= substr($content, $i, 3);
- $i += 2;
- break;
- case (($ord_var_c & 0xF8) == 0xF0) : $summary_string .= substr($content, $i, 4);
- $i += 3;
- break;
- case (($ord_var_c & 0xFC) == 0xF8) : $summary_string .= substr($content, $i, 5);
- $i += 4;
- break;
- case (($ord_var_c & 0xFE) == 0xFC) : $summary_string .= substr($content, $i, 6);
- $i += 5;
- break;
- default:
- $summary_string .= $current_var;
- }
- }
- if ($html_array['left']) {
- $html_array['left'] = array_reverse($html_array['left']);
- foreach($html_array['left'] as $index => $tag) {
- $key = array_search($tag, $html_array['right']);
- if ($key !== false) {
- unset($html_array['right'][$key]);
- } else {
- if (strpos(substr($content, $i), '</'.$tag.'>') === false) {
- $summary_string .= '</'.$tag.'>';
- } else {
- while ($html_array_str != $tag) {
- $current_var = substr($content, $i, 1);
- $i++;
- if ($current_var == '<') {
- $html_tag = 1;
- $html_array_str = '';
- } else if ($html_tag == 1) {
- if ($current_var == '>') {
- $html_array_str = '';
- $html_tag = 0;
- } else {
- $html_array_str .= $current_var;
- $f = substr($html_array_str, 0, 1);
- if ($f == '/') {
- $html_array_str = str_replace('/', '', $html_array_str);
- }
- }
- }
- $summary_string .= $current_var;
- if ($html_array_str == $tag) {
- $summary_string .= '>';
- $i = $i + 1;
- break;
- }
- }
- }
- }
- }
- }
- $out = $summary_string;
- }
- if ($echo) echo $out;
- return $out;
- }
该函数自动提前文章内容前500字符作为摘要,保留html格式并修复被切断的HTML标签。具体可以在我的博客查看效果。
$size:自定义显示长度
复制该函数到主题的functions.php文件中。
- <?php
- if (is_single() or is_page()) {
- the_content();
- } else {
- $content = get_the_content();
- $content = apply_filters('the_content', $content);
- $content = str_replace(']]>', ']]>', $content);
- the_blog_excerpt($content);
- }
- ?>
在需要显示摘要的地方调用以上代码即可。
来源:http://www.hujuntao.com/archives/wordpress-custom-the-excerpt.html