Retrieves the post content.
Parameters
Source
function get_the_content( $more_link_text = null, $strip_teaser = false, $post = null ) { global $page, $more, $preview, $pages, $multipage; $_post = get_post( $post ); if ( ! ( $_post instanceof WP_Post ) ) { return ''; } /* * Use the globals if the $post parameter was not specified, * but only after they have been set up in setup_postdata(). */ if ( null === $post && did_action( 'the_post' ) ) { $elements = compact( 'page', 'more', 'preview', 'pages', 'multipage' ); } else { $elements = generate_postdata( $_post ); } if ( null === $more_link_text ) { $more_link_text = sprintf( '<span aria-label="%1$s">%2$s</span>', sprintf( /* translators: %s: Post title. */ __( 'Continue reading %s' ), the_title_attribute( array( 'echo' => false, 'post' => $_post, ) ) ), __( '(more…)' ) ); } $output = ''; $has_teaser = false; // If post password required and it doesn't match the cookie. if ( post_password_required( $_post ) ) { return get_the_password_form( $_post ); } // If the requested page doesn't exist. if ( $elements['page'] > count( $elements['pages'] ) ) { // Give them the highest numbered page that DOES exist. $elements['page'] = count( $elements['pages'] ); } $page_no = $elements['page']; $content = $elements['pages'][ $page_no - 1 ]; if ( preg_match( '/<!--more(.*?)?-->/', $content, $matches ) ) { if ( has_block( 'more', $content ) ) { // Remove the core/more block delimiters. They will be left over after $content is split up. $content = preg_replace( '/<!-- \/?wp:more(.*?) -->/', '', $content ); } $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] ) ) ); } $has_teaser = true; } else { $content = array( $content ); } if ( str_contains( $_post->post_content, '<!--noteaser-->' ) && ( ! $elements['multipage'] || 1 === $elements['page'] ) ) { $strip_teaser = true; } $teaser = $content[0]; if ( $elements['more'] && $strip_teaser && $has_teaser ) { $teaser = ''; } $output .= $teaser; if ( count( $content ) > 1 ) { if ( $elements['more'] ) { $output .= '<span id="more-' . $_post->ID . '"></span>' . $content[1]; } else { if ( ! empty( $more_link_text ) ) { /** * Filters the Read More link text. * * @since 2.8.0 * * @param string $more_link_element Read More link element. * @param string $more_link_text Read More text. */ $output .= apply_filters( 'the_content_more_link', ' <a href="' . get_permalink( $_post ) . "#more-{$_post->ID}\" class=\"more-link\">$more_link_text</a>", $more_link_text ); } $output = force_balance_tags( $output ); } } return $output; } Hooks
- apply_filters( ‘the_content_more_link’,
string $more_link_element ,string $more_link_text ) Filters the Read More link text.
Note that
get_the_contentdoesn’t return the same thing as whatthe_contentdisplays. For that you need to do this:Basic Usage
Display the post content, ending with “Read more” if needed
find out if the_content has content before output
in functions.php and similar files:
as function
template inside the loop:
If you’re having trouble getting the $post parameter to work, make sure your WordPress is up-to-date: $post was only added in WordPress 5.2.
If you use
get_the_content()before the global $wp_query object is set, the postmeta are not well generated becausegenerate_postdata()use $wp_query.To get around this issue, just construct a global $wp_query object before calling
get_the_content()If you need to embed content coded as URL in post content, like youtube video, use following:
This is the way how it is handled in the WordPress core.