get_the_content( string $more_link_text = null, bool $strip_teaser = false, WP_Post|object|int $post = null ): string
Retrieves the post content.
Contents
Parameters
Return
string
More Information
When used inside The Loop, this function will get the content of the current post.
If used outside The Loop, you must inform the post you want to get the content from using the optional $post
parameter.
An important difference from the_content()
is that get_the_content()
does not pass the content through the the_content
filter. This means that get_the_content()
will not auto-embed videos or expand shortcodes, among other things.
Source
File: wp-includes/post-template.php
.
View all references
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.
Changelog
Version | Description |
---|---|
5.2.0 | Added the $post parameter. |
0.71 | Introduced. |
User Contributed Notes
You must log in before being able to contribute a note or feedback.
Note that
get_the_content
doesn’t return the same thing as whatthe_content
displays. 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.