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

WordPress 摘要有两种显示方式:
一种是通过写文章的时候在其中加入标签,然后在模板中使用the_conten(“阅读更多…”),这个函数将会读出你的post直到<!—more–>处断掉输出。缺点:需要在每篇文章中加入<!—more–>标签;
另外一种方法就是在模板中直接利用the_excerpt()函数,这个函数将会自动取出你文章的部分内容,并且以本文的格式输出。缺点:文字都堆积在一起,阅读性差。
下面教大家如何自定义文章摘要显示和长度,解决以上问题。

  1. function the_blog_excerpt($content, $size = 500, $echo = true) {
  2. $out = '';
  3. $_size = mb_strlen($content, 'utf-8');
  4. if ($_size <= $size) {
  5. $out = $content;
  6. } else if (strpos($content, '<') === false) {
  7. $out = mb_substr($content, 0, $size);
  8. } else if ($e = strpos($content, '<!-- more -->')) {
  9. $out = mb_substr($content, 0, $e);
  10. } else {
  11. $strlen_var = strlen($content);
  12. $html_tag = 0;
  13. $summary_string = '';
  14. $html_array = array('left' => array(), 'right' => array());
  15. for ($i = 0; $i < $strlen_var; ++$i) {
  16. if (!$size) {
  17. break;
  18. }
  19. $current_var = substr($content, $i, 1);
  20. if ($current_var == '<') {
  21. $html_tag = 1;
  22. $html_array_str = '';
  23. } else if ($html_tag == 1) {
  24. if ($current_var == '>') {
  25. $html_array_str = trim($html_array_str);
  26. if (substr($html_array_str, -1) != '/') {
  27. $f = substr($html_array_str, 0, 1);
  28. if ($f == '/') {
  29. $html_array['right'][] = str_replace('/', '', $html_array_str);
  30. } else if ($f != '?') {
  31. if (strpos($html_array_str, ' ') !== false) {
  32. $html_array['left'][] = strtolower(current(explode(' ', $html_array_str, 2)));
  33. } else {
  34. $html_array['left'][] = strtolower($html_array_str);
  35. }
  36. }
  37. }
  38. $html_array_str = '';
  39. $html_tag = 0;
  40. } else {
  41. $html_array_str .= $current_var;
  42. }
  43. } else {
  44. --$size;
  45. }
  46. $ord_var_c = ord($content {$i});
  47. switch (true) {
  48. case(($ord_var_c & 0xE0) == 0xC0) : $summary_string .= substr($content, $i, 2);
  49. $i += 1;
  50. break;
  51. case (($ord_var_c & 0xF0) == 0xE0) : $summary_string .= substr($content, $i, 3);
  52. $i += 2;
  53. break;
  54. case (($ord_var_c & 0xF8) == 0xF0) : $summary_string .= substr($content, $i, 4);
  55. $i += 3;
  56. break;
  57. case (($ord_var_c & 0xFC) == 0xF8) : $summary_string .= substr($content, $i, 5);
  58. $i += 4;
  59. break;
  60. case (($ord_var_c & 0xFE) == 0xFC) : $summary_string .= substr($content, $i, 6);
  61. $i += 5;
  62. break;
  63. default:
  64. $summary_string .= $current_var;
  65. }
  66. }
  67. if ($html_array['left']) {
  68. $html_array['left'] = array_reverse($html_array['left']);
  69. foreach($html_array['left'] as $index => $tag) {
  70. $key = array_search($tag, $html_array['right']);
  71. if ($key !== false) {
  72. unset($html_array['right'][$key]);
  73. } else {
  74. if (strpos(substr($content, $i), '</'.$tag.'>') === false) {
  75. $summary_string .= '</'.$tag.'>';
  76. } else {
  77. while ($html_array_str != $tag) {
  78. $current_var = substr($content, $i, 1);
  79. $i++;
  80. if ($current_var == '<') {
  81. $html_tag = 1;
  82. $html_array_str = '';
  83. } else if ($html_tag == 1) {
  84. if ($current_var == '>') {
  85. $html_array_str = '';
  86. $html_tag = 0;
  87. } else {
  88. $html_array_str .= $current_var;
  89. $f = substr($html_array_str, 0, 1);
  90. if ($f == '/') {
  91. $html_array_str = str_replace('/', '', $html_array_str);
  92. }
  93. }
  94. }
  95. $summary_string .= $current_var;
  96. if ($html_array_str == $tag) {
  97. $summary_string .= '>';
  98. $i = $i + 1;
  99. break;
  100. }
  101. }
  102. }
  103. }
  104. }
  105. }
  106. $out = $summary_string;
  107. }
  108. if ($echo) echo $out;
  109. return $out;
  110. }

该函数自动提前文章内容前500字符作为摘要,保留html格式并修复被切断的HTML标签。具体可以在我的博客查看效果。

$size:自定义显示长度

复制该函数到主题的functions.php文件中。

  1. <?php
  2. if (is_single() or is_page()) {
  3. the_content();
  4. } else {
  5. $content = get_the_content();
  6. $content = apply_filters('the_content', $content);
  7. $content = str_replace(']]>', ']]>', $content);
  8. the_blog_excerpt($content);
  9. }
  10. ?>

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

 

来源:http://www.hujuntao.com/archives/wordpress-custom-the-excerpt.html