the_content() — выводит контент поста

Функция возвращает содержимое текущего поста. Работает только в цикле.

the_content( $more_link_text = null, $strip_teaser = false)
$more_link_text
(строка) В этом параметре можно указать текст ссылки «Далее». Читайте также о других способах изменения текста ссылки.
$strip_teaser
(логическое) Нужно ли в полной версии пост обрезать то, что находится перел тегом <--more-->? true — нужно, false — не нужно.

Выводит полностью весь пост, если задействована на страницах:

  • записей single.php,
  • страниц page.php,
  • произвольных типов постов single-{тип_поста}.

Выводит только часть контента поста, которая находится до тега <!--more--> на следующих типах страниц:

  • рубрики category.php,
  • метки tag.php,
  • архивы archive.php,
  • таксономии taxonomy.php.

Что делать, если у вас выводится полный текст поста, а вы хотите выводить анонсы со ссылкой «Далее»?

Всё, что нам потребуется сделать, это:

  • Непосредственно перед циклом определить глобальную переменную $more.
    global $more;
  • Затем, уже непосредственно перед функцией the_content() присвоить ей значение 0 (отображать анонсы) или 1 (отображать целиком весь пост):
    $more = 0; // 0 - отобразить часть контента то тега more, 1 - отобразить весь контент

Пример:

global $more;
while( have_posts() ) : the_post();
	$more = 1; // отображаем полностью всё содержимое поста
	the_title(); // эта функция выводит заголовок
	the_content(); // выводим контент
endwhile;

Читайте также описание функции the_title().

Второй пример — возможно вы уже читали пост про прилепленные записи. Так вот, используя условный тег is_sticky(), мы можем сделать так, чтобы для прилепленных записей контент отображался целиком, а для всех остальных записей выводились только анонсы.

global $more;
while( have_posts() ) : the_post();
	if( is_sticky() ) : // проверяем, является ли текущая запись прилепленной
		$more = 1; // полный пост
	else :
		$more = 0; // анонс
	endif;
	the_title(); // заголовок
	the_content('Подробнее &rarr;'); // контент
endwhile;

Как вывести содержимое конкретного поста, зная его ID?

В отличие от функций get_the_title() и get_permalink() функции для вывода контента поста не имеют параметра с ID поста, так что нам не удастся получить или вывести контент какого-либо определенного поста вне цикла этим способом.

Другой способ — функция get_post().

$my_post_obj = get_post( $my_post_id ); // параметр функции - ID поста, содержимое которого нужно вывести
echo $my_post_obj->post_content;

В этом примере (который выше) у нас выведется неотфильтрованный контент — в том самом виде, в котором он находится в базе данных. Так как очень многие плагины в WordPress применяют свои фильтры к контенту постов, то такой способ хорош, если вы хотите обойти этот фильтр.

Если фильтр the_content в данном случае вам нужен, тогда наш пример изменится следующим образом:

$my_post_obj = get_post( $my_post_id );
$the_content_filtered = apply_filters( 'the_content', $my_post_obj->post_content );
echo str_replace( ']]>', ']]&gt;', $the_content_filtered );

Фильтры

the_content_more_link — позволяет изменить кнопку «Далее»

Как же так, ведь текст кнопки «Далее» можно указать в первом параметре функции the_content()? Дело в том, что там вы можете указать только текст ссылки, а фильтр the_content_more_link позволяет полностью изменить её HTML код.

В качестве примера добавим к ссылке «Далее» HTML-атрибут target="_blank".

function true_target_blank_to_read_more( $more_link, $more_link_text ) {
	// Параметры, передаваемые из фильтра, сейчас мы их не будем использовать
	// $more_link_text - анкор (текст) ссылки по умолчанию
	// $more_link - HTML ссылки по умолчанию
	global $post;
	return ' <a href="' . get_permalink() . '#more-' . get_the_id() . '" target="_blank">Подробнее &rarr;</a>';
}
 
add_filter( 'the_content_more_link', 'true_target_blank_to_read_more', 10, 2 );

the_content — изменяем содержимое поста перед выводом

Как я уже говорил, этот фильтр очень популярен и используется во многих плагинах. Его даже используют для добавления ссылок на похожие записи в конце поста.

function true_related_posts_after_content( $content ) {
	$related_posts = ''; // предположим, что это какой-то код, например код для вывода похожих записей
	return $content . $related_posts; // добавляем сразу после содержимого поста
}
 
add_filter( 'the_content', 'true_related_posts_after_content', 10, 1 );

Миша Рудрастых

Впервые познакомился с WordPress в 2009 году. С 2014 года меня можно встретить на WordCamp — официальной конфе по WordPress, иногда там выступаю. Также в настоящее время веду курсы по WordPress в Epic Skills.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля — пишите мне.

Комментарии 26

  • Андрей:

    Здравствуйте!
    У меня на главной странице выводится анонс другой страницы ( о компании) с помощью WP_Query . Как я понял, главная - это тоже страница. Значит, при использовании the content по умолчанию выведется полное содержание. Поэтому, как у Вас и написано, прописал в коде переменную global $more. На самой главной все в порядке. Действительно выводится только анонс. Но я теперь на самой странице "О компании" никак не могу вывести полный текст статьи. Точнее эта страница вообще не открывается. При клике на кнопку "Подробнее" просто перезагружается сама Главная страница. Страница "О компании" не открывается. Также при клике по заголовку тоже перезагружается главная. Почему?
    В настройках Чтение установлена статическая страница. Пример кода из файла front-page.php для вывода "о компании":

    $about = new WP_Query( array 
                   ('pagename' => 'about-page',
                    'post_type' => 'page')); 
                   global $more;                
                   while ( $about->have_posts() ) :
                   $about->the_post();
                   $more=0;
                       the_title( '<h1 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h1>' ); 
                       if ( has_post_thumbnail()): ?>
                           <div class="entry-thumbnail"><?php the_post_thumbnail(); ?></div>
                       <?php endif;    
                    the_content( __( 'Подробнее... <span class="meta-nav">&rarr;</span>' ) );  
                   endwhile;
     
    wp_reset_postdata();

    Пробовал создать отдельный файл для отображения page-about-page.php. Не помогает. Вместо about-page открывает главную.

  • Андрей:

    Странно, сейчас только что создал еще одну новую страницу "О компании ", изменил pagename в цикле на "o-kompanii" и все работает. Перенаправляет на правильную страницу. Не заедает на главной. Неужели просто был глюк?

    • Миша:

      Добрый день!
      Сорри, что не сразу ответил, был в отъезде. Скорее всего всё дело было в настройках.

      • Андрей:

        И Вы меня. Тестировал новый комп.
        Если честно, сам не понял в каких настройках. Просто создал новую страницу, а старую удалил. На старой изменения настроек ни к чему не привели. Сейчас вроде работает. Надеюсь надолго.
        Извиняюсь за беспокойство.

  • Джама:

    Добрый вечер, Михаил
    Я Бы хотел у вас поинтересоваться, по поводу фильтра the_content дело в том что он выводит отфильтрованную информацию, а как сделать что бы он её в переменной сохранил, а я сам в итоге вывел где хочу ?...
    Объясню ситуацию, дело в том что я пользуюсь Метабоксами, и в них я создаю Визвиг блоки, они работают как часики, но проблема в том что в них не работают шорткоды пока не отфильтрую. Когда я фильтрую данные всё работает замечательно, но рождается проблема, заключаеться она в том что: Все переменные я получаю вначале цикла и убиваю в конце. И в итоге я просто раскладываю переменные там где они должны лежать... Надеюсь не запутал вас.

    Суть вопроса: Как вернуть(return) отфильтрованные данные, а не вывести.

    Спасибо, у вас один из самых качественных блогов по WP =)

  • Миша:

    Добрый вечер! Благодарю 🙂
    Вот код:

    return str_replace( ']]>', ']]&gt;', apply_filters( 'the_content', get_the_content() ));
  • Джама:

    Спасибо большое, вы меня очень выручили

  • Джама:

    Хмм... Надеюсь я вас не напрягу, а что мне делать если у меня всё вот так завязано ?

    $content = apply_filters('the_content', $content);
    $content = str_replace(']]>', ']]>', $content);
    echo '<div class="col-lg-'.$col.' col-md-'.$col.' col-sm-'.$col.' col-xs-12 '.$class.'">'.$content.'</div>';

    Попробовал :

    $content = str_replace( ']]>', ']]&gt;', apply_filters( 'the_content', $content )); 
    return '<div class="col-lg-'.$col.' col-md-'.$col.' col-sm-'.$col.' col-xs-12 '.$class.'">'.$content.'</div>';

    В данном случае разговор идёт встраивании фильтрации внутри шорткода.

  • Джама:

    Что бы было попонятней, я не могу применять шорткод внутри обёрточного шорткода, пример:

    [block col="8" class=""]
    [table id="325" /]
    [/block]

  • Джама:

    Да. А нужно что бы они фильровался, но так же что бы я мог отфильтрованные данные отложить в переменную, так как у меня довольно сложная архитектура шорткода. Каждый символ на счету
    =)

  • Алекс:

    Здравствуйте
    перенес сайт на другой хостинг
    и перестал показываться полный текст статьи
    http://www.clubvictoria.ru/ старый
    http://clubvictoria.ru/ новый
    показывается всего неск строк
    а в админке все норм видно всю статью
    там используется nginx +php-fpm

  • Денис:

    Здравствуйте, хотелось бы сделать чтобы для прилепленной записи на главной контент отображался целиком, а для остальных записей выводились только цитаты. Подскажите куда необходимо вставить тег is_sticky() из второго примера, и как его оформить вот мой index.php:

    <?php get_header(); global $zbench_options; ?>
    <div id="content">
    <?php if (have_posts()) : ?>
    	<?php if (is_search()) { ?>
    	<div class="page-title">
    		<h1>
    			<?php $archive_title=''; if($paged && $paged > 1) $archive_title='<span class="page-title-paged"> - '.sprintf(__('Page %s','zbench'),$paged).'</span>'; ?>
    			<?php _e('Search Results for:','zbench'); ?> <?php echo get_search_query(),$archive_title; ?>
    		</h1>
    	</div>
    	<?php } ?>
    	<?php while (have_posts()) : the_post();?>
    	<div <?php post_class('post'); ?> id="post-<?php the_ID(); ?>"><!-- post div -->
    		<h2 class="title<?php if(is_sticky()) {echo " sticky-h2";} ?>"><a href="<?php the_permalink(); ?>" title="<?php printf( __('%s', 'zbench'), the_title_attribute('echo=0') ); ?>"><?php the_title(); ?></a></h2>
    		<div class="post-info-top">
     
    			<span class="gotocomments"><?php comments_popup_link(__('No comments', 'zbench'), '1 '.__('comment', 'zbench'), '% '.__('comments', 'zbench')); ?><?php if(function_exists('the_views')) { echo " | ";the_views(); } ?></span>
    		</div>
    		<div class="clear"></div>
    		<div class="entry">
    			<?php the_excerpt();?>
    		</div><!-- END entry -->
    		<?php if(is_sticky()) { ?>
    		<?php } ?>
    	</div><!-- END post -->
    	<?php endwhile; ?>
    <?php else: ?>
    	<div class="post">
    		<h2 class="title title_page"><?php _e('Error 404 - Not Found', 'zbench'); ?></h2>
    		<div class="post-info-top post-info-top-nocomment"></div>
    		<div class="entry">
    			<p><?php _e('Sorry, but you are looking for something that isn&#8217;t here.', 'zbench'); ?></p>
    			<h3><?php _e('Random Posts', 'zbench'); ?></h3>
    			<ul>
    				<?php
    					$rand_posts = get_posts('numberposts=5&orderby=rand');
    					foreach( $rand_posts as $post ) :
    				?>
    				<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    				<?php endforeach; ?>
    			</ul>
    			<h3><?php _e('Tag Cloud', 'zbench'); ?></h3>
    			<?php wp_tag_cloud('smallest=9&largest=22&unit=pt&number=200&format=flat&orderby=name&order=ASC');?>
    		</div><!--entry-->
    	</div><!--post-->
    <?php endif; ?>
    <?php
    if(function_exists('wp_page_numbers')) {
    	wp_page_numbers();
    }
    elseif(function_exists('wp_pagenavi')) {
    	wp_pagenavi();
    } else {
    	global $wp_query;
    	$total_pages = $wp_query->max_num_pages;
    	if ( $total_pages > 1 ) {
    		echo '<div id="pagination">';
    			posts_nav_link(' | ', __('&laquo; Previous page','zbench'), __('Next page &raquo;','zbench'));
    		echo '</div>';
    	}
    }
    ?>
    </div><!--content-->
    <?php get_sidebar(); ?>
    <?php get_footer(); ?>
  • Александр:

    Михаил, добрый день!

    Не подскажете, как в этом примере:

    function true_related_posts_after_content( $content ) {
    	$related_posts = ''; // предположим, что это какой-то код, например код для вывода похожих записей
    	return $content . $related_posts; // добавляем сразу после содержимого поста
    }
     
    add_filter( 'the_content', 'true_related_posts_after_content', 10, 1 );

    В ($related_posts = '';) вставить следующий код:

    <div class="post-button">
     
    		<?php $url = get_post_meta($post->ID, 'source', true);if($url) echo '<a class="btn btn-primary btn-sm" href="'.$url.'" target="_blank"><i class="fa fa-info-circle"></i>Источник</a>';?>
     
    		<?php $url = get_post_meta($post->ID, 'demo', true);if($url) echo '<a class="btn btn-success btn-sm" href="'.$url.'" target="_blank"><i class="fa fa-eye"></i>Демо</a>';?>
     
    		<?php $url = get_post_meta($post->ID, 'download_1', true);if($url) echo '<a class="btn btn-danger btn-sm" href="'.$url.'" target="_blank"><i class="fa fa-cloud-download"></i>Скачать 1</a>';?>
     
    		<?php $url = get_post_meta($post->ID, 'download_2', true);if($url) echo '<a class="btn btn-danger btn-sm" href="'.$url.'" target="_blank"><i class="fa fa-cloud-download"></i>Скачать 2</a>';?>
     
    		<?php $url = get_post_meta($post->ID, 'download_3', true);if($url) echo '<a class="btn btn-danger btn-sm" href="'.$url.'" target="_blank"><i class="fa fa-cloud-download"></i>Скачать 3</a>';?>
     
    		<?php $url = get_post_meta($post->ID, 'documentation', true);if($url) echo '<a class="btn btn-info btn-sm" href="'.$url.'" target="_blank"><i class="fa fa-book"></i></i>Документация</a>';?>
     
    		</div>

    Спасибо!

  • Артём:

    Подскажите пожалуйста, как получить содержимое поста по id с удалением того, что стоит перед

    <!--noteaser-->

    ?

  • Сергей:

    Спасибо за информацию - очень помогло!

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Комментарии закрыты.