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 );

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

  • Андрей1 ноября 2014 в 18:11 #

    Здравствуйте!
    У меня на главной странице выводится анонс другой страницы ( о компании) с помощью 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 открывает главную.

  • Андрей1 ноября 2014 в 18:11 #

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

    • Миша3 ноября 2014 в 08:11 #

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

      • Андрей5 ноября 2014 в 21:11 #

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

  • Джама29 ноября 2014 в 00:11 #

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

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

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

  • Миша29 ноября 2014 в 00:11 #

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

    return str_replace( ']]>', ']]&gt;', apply_filters( 'the_content', get_the_content() ));
  • Джама29 ноября 2014 в 00:11 #

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

  • Джама29 ноября 2014 в 01:11 #

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

    $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>';

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

  • Джама7 декабря 2014 в 06:12 #

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

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

    • Миша7 декабря 2014 в 07:12 #

      Доброе утро!
      Ну то есть контент фильтруется, но без применения шорткодов?

  • Джама11 декабря 2014 в 16:12 #

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

  • Алекс30 июня 2015 в 02:06 #

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

  • Денис1 сентября 2015 в 02:09 #

    Здравствуйте, хотелось бы сделать чтобы для прилепленной записи на главной контент отображался целиком, а для остальных записей выводились только цитаты. Подскажите куда необходимо вставить тег 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(); ?>
  • Александр15 сентября 2015 в 23:09 #

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

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

    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>

    Спасибо!

    • Миша16 сентября 2015 в 09:09 #

      Добрый день! Примерно так:

      $related_posts = '<div class="post-button">';
       
      $url = get_post_meta($post->ID, 'source', true);
      if($url) 
      $related_posts .= '<a class="btn btn-primary btn-sm" href="'.$url.'" target="_blank"><i class="fa fa-info-circle"></i>Источник</a>';
       
      $related_posts .= '</div>';
      • Александр16 сентября 2015 в 22:09 #

        Михаил, не работает! :(

        • Миша17 сентября 2015 в 07:09 #

          Хотелось бы больше подробностей :)

          • Александр17 сентября 2015 в 13:09 #

            Извините!

            Не работает, вообще ни чего не отображается!

            Если удалить:

            $url = get_post_meta($post->ID, 'source', true);
            if($url)

            , то появляется кнопка. но кнопка с ссылкой на этот же пост, только в новом окне!

            У меня написано так:

             
            add_filter( 'the_content', 'rcl_button_prof', 10, 1 );
             
            function rcl_button_prof( $content ) {
             
            $related_posts = '<div class="post-button">';
             
            $url = get_post_meta($post->ID, 'source', true);
            if($url) 
            $related_posts .= '<a class="btn btn-primary btn-sm" href="'.$url.'" target="_blank"><i class="fa fa-info-circle"></i>Источник</a>';
             
            $related_posts .= '</div>';
            	return $content . $related_posts;
            }
            • Миша18 сентября 2015 в 08:09 #

              В вашем первом комментарии был вопрос относительно того, как код записать в переменную, и я дал вам наводку, конечно это не 100% готовый код, который можно просто вставить и всё будет ок :) Я вам подсказал, а дальше уже сами.

  • Артём30 октября 2015 в 17:10 #

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

    <!--noteaser-->

    ?

    • Миша31 октября 2015 в 08:10 #

      Добрый день! Пример так:

      $p = get_post( $post_id );
      $content = explode('<!--noteaser-->', $p->post_content);
      echo $content[1];
  • Сергей23 января 2016 в 19:01 #

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

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

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Да, точно)

  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.