WordPress自定义文章摘要显示和长度

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, '')) {
    $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), '') === false) {
            $summary_string .= '';
          } 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文件中。

 

在需要显示摘要的地方调用以上代码即可。

“WordPress自定义文章摘要显示和长度”的3个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注