一、官方解释
首先还是引用下官方文档的说明,比较权威。
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 源码
- /**
- * Retrieve the post content.
- *
- * @since 0.71
- *
- * @param string $more_link_text Optional. Content for when there is more text.
- * @param bool $stripteaser Optional. Strip teaser content before the more text. Default is false.
- * @return string
- */
- function get_the_content($more_link_text = null, $stripteaser = false) {
- global $post, $more, $page, $pages, $multipage, $preview;
- if ( null === $more_link_text )
- $more_link_text = __( '(more...)' );
- $output = '';
- $hasTeaser = false;
- // If post password required and it doesn't match the cookie.
- if ( post_password_required($post) )
- return get_the_password_form();
- if ( $page > count($pages) ) // if the requested page doesn't exist
- $page = count($pages); // give them the highest numbered page that DOES exist
- $content = $pages[$page-1];
- if ( preg_match('/<!--more(.*?)?-->/', $content, $matches) ) {
- $content = explode($matches[0], $content, 2);
- if ( !empty($matches[1]) && !empty($more_link_text) )
- $more_link_text = strip_tags(wp_kses_no_null(trim($matches[1])));
- $hasTeaser = true;
- } else {
- $content = array($content);
- }
- if ( (false !== strpos($post->post_content, '<!--noteaser-->') && ((!$multipage) ¦¦ ($page==1))) )
- $stripteaser = true;
- $teaser = $content[0];
- if ( $more && $stripteaser && $hasTeaser )
- $teaser = '';
- $output .= $teaser;
- if ( count($content) > 1 ) {
- if ( $more ) {
- $output .= '<span id="more-' . $post->ID . '"></span>' . $content[1];
- } else {
- if ( ! empty($more_link_text) )
- $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 );
- $output = force_balance_tags($output);
- }
- }
- if ( $preview ) // preview fix for javascript/ target=_blank class=infotextkey>javascript bug with foreign languages
- $output = preg_replace_callback('/%u([0-9A-F]{4})/', '_convert_urlencoded_to_entities', $output);
- return $output;
- }
2 、 the_content 源码
- /**
- * Display the post content.
- *
- * @since 0.71
- *
- * @param string $more_link_text Optional. Content for when there is more text.
- * @param bool $stripteaser Optional. Strip teaser content before the more text. Default is false.
- */
- function the_content($more_link_text = null, $stripteaser = false) {
- $content = get_the_content($more_link_text, $stripteaser);
- $content = apply_filters('the_content', $content);
- $content = str_replace(']]>', ']]>', $content);
- echo $content;
- }
不需要太仔细研究源码,但从函数的最后可以看出,分别是输出和返回,和预想的一样。
三、遇到的问题
既然这样的话,那么 get_the_content 和 the_content 的内容应该是一致的对吧。但是,在前台得到的结果却是不一样的:
1 、 get_the_content 的结果
- 这是段落 1
- 这是段落 2
2 、 the_content 的结果
- <p> 这是段落 1</p>
- <p> 这是段落 2</p>
出现的内容是,get_the_content 的值没有 p 标签包裹而 the_content 的内容有 p 标签包裹,那么如何解决呢?
3 、解决方法
可以自定义一个函数:
- function yundanran_get_the_content($more_link_text = null, $stripteaser = false)
- {
- $content = get_the_content($more_link_text, $stripteaser);
- $content = apply_filters('the_content', $content);
- $content = str_replace(']]>', ']]>', $content);
- return $content;
- }
函数和 the_content 类似,只是结果是 return 出来的。