一、官方解释

首先还是引用下官方文档的说明,比较权威。

1 、 get_the_content 解释:

Retrieve the post content. (Must be used in a Loop)

2 、 the_content 解释:

Displays the contents of the current post. This tag must be within The_Loop.

个人理解是,get_the_content 返回的是 post 的内容,而 the_content 则直接输出内容。到底是不是这样的呢?看下源码吧:

二、官方源码

1 、 get_the_content 源码

  1. /**
  2. * Retrieve the post content.
  3. *
  4. * @since 0.71
  5. *
  6. * @param string $more_link_text Optional. Content for when there is more text.
  7. * @param bool $stripteaser Optional. Strip teaser content before the more text. Default is false.
  8. * @return string
  9. */
  10. function get_the_content($more_link_text = null, $stripteaser = false) {
  11. global $post, $more, $page, $pages, $multipage, $preview;
  12. if ( null === $more_link_text )
  13. $more_link_text = __( '(more...)' );
  14. $output = '';
  15. $hasTeaser = false;
  16. // If post password required and it doesn't match the cookie.
  17. if ( post_password_required($post) )
  18. return get_the_password_form();
  19. if ( $page > count($pages) ) // if the requested page doesn't exist
  20. $page = count($pages); // give them the highest numbered page that DOES exist
  21. $content = $pages[$page-1];
  22. if ( preg_match('/<!--more(.*?)?-->/', $content, $matches) ) {
  23. $content = explode($matches[0], $content, 2);
  24. if ( !empty($matches[1]) && !empty($more_link_text) )
  25. $more_link_text = strip_tags(wp_kses_no_null(trim($matches[1])));
  26. $hasTeaser = true;
  27. } else {
  28. $content = array($content);
  29. }
  30. if ( (false !== strpos($post->post_content, '<!--noteaser-->') && ((!$multipage) ¦¦ ($page==1))) )
  31. $stripteaser = true;
  32. $teaser = $content[0];
  33. if ( $more && $stripteaser && $hasTeaser )
  34. $teaser = '';
  35. $output .= $teaser;
  36. if ( count($content) > 1 ) {
  37. if ( $more ) {
  38. $output .= '<span id="more-' . $post->ID . '"></span>' . $content[1];
  39. } else {
  40. if ( ! empty($more_link_text) )
  41. $output .= apply_filters( 'the_content_more_link', ' <a href="'%20.%20get_permalink()%20.%20"#more-{$post->ID}" class="more-link">$more_link_text</a>", $more_link_text );
  42. $output = force_balance_tags($output);
  43. }
  44. }
  45. if ( $preview ) // preview fix for javascript/ target=_blank class=infotextkey>javascript bug with foreign languages
  46. $output = preg_replace_callback('/%u([0-9A-F]{4})/', '_convert_urlencoded_to_entities', $output);
  47. return $output;
  48. }

 2 、 the_content 源码

  1. /**
  2. * Display the post content.
  3. *
  4. * @since 0.71
  5. *
  6. * @param string $more_link_text Optional. Content for when there is more text.
  7. * @param bool $stripteaser Optional. Strip teaser content before the more text. Default is false.
  8. */
  9. function the_content($more_link_text = null, $stripteaser = false) {
  10. $content = get_the_content($more_link_text, $stripteaser);
  11. $content = apply_filters('the_content', $content);
  12. $content = str_replace(']]>', ']]>', $content);
  13. echo $content;
  14. }

不需要太仔细研究源码,但从函数的最后可以看出,分别是输出和返回,和预想的一样。

三、遇到的问题

既然这样的话,那么 get_the_content 和 the_content 的内容应该是一致的对吧。但是,在前台得到的结果却是不一样的:

1 、 get_the_content 的结果

  1. 这是段落 1
  2. 这是段落 2

 2 、 the_content 的结果

  1. <p> 这是段落 1</p>
  2. <p> 这是段落 2</p>

出现的内容是,get_the_content 的值没有 p 标签包裹而 the_content 的内容有 p 标签包裹,那么如何解决呢?

3 、解决方法

可以自定义一个函数:

  1. function yundanran_get_the_content($more_link_text = null, $stripteaser = false)
  2. {
  3. $content = get_the_content($more_link_text, $stripteaser);
  4. $content = apply_filters('the_content', $content);
  5. $content = str_replace(']]>', ']]>', $content);
  6. return $content;
  7. }

函数和 the_content 类似,只是结果是 return 出来的。