WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

the_content хук-фильтр . Yoast 1.2.1

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

Всегда обращайте внимание на то, чтобы передаваемая переменная $content была возвращена обратно после обработки, иначе пользователи увидят пустую страницу.

Использование

add_filter( 'the_content', 'filter_function_name_11' );
function filter_function_name_11( $content ) {
	// Фильтр...

	return $content;
}
$content(строка)
Строка, которую нужно отфильтровать и вернуть обратно.

Примеры

#1 Демонстрация работы

Для демонстрации работы фильтра, добавим в конец каждого текста поста надпись " Конец!":

add_filter('the_content', 'the_end');
function the_end( $text ){
	return $text . ' Конец!';
}

#2 Фильтр контента отдельной страницы

Этот пример можно использовать, для создания постоянной страницы контент которой будет генерироваться в зависимости от чего-либо, допустим переменной $_GET запроса (например для указанyого автора ?the_author=crank):

add_filter( 'the_content', 'my_the_content_filter' );
function my_the_content_filter( $content ){
	// Если не страница debug ничего не делаем
	if( $GLOBALS['post']->post_name != 'debug' )
		return $content;

	// Выполняем действия
	// предполагается что в УРЛ указана переменная запроса the_author
	return "Это страница автора: ". $_GET['the_author'];
}

#3 Иконка поста

Этот пример добавит картинку перед постом (смотрите is_single()). Подразумевается, что картинки называется post_icon.png и находится в папке image в каталоге темы. Фильтр работает в пониженном приоритете 20 (обычно 10), это значит что он будет обработан позднее остальных.

add_filter( 'the_content', 'my_the_content_filter', 20 );
function my_the_content_filter( $content ){
	if ( is_single() )
		// Добавляем картинку в начало каждой страницы
		$content = sprintf(
			'<img class="post-icon" src="%s/images/post_icon.png" alt="Post icon" title=""/>%s',
			get_bloginfo( 'stylesheet_directory' ),
			$content
		);

	// Возвращаем контент.
	return $content;
}

#4 Миниатюра поста в начале

Этот пример показывает, как добавить миниатюру поста перед выводом контента. Миниатюра поста устанавливается при редактировании поста (эта функция должна быть включена, смотрите add_theme_support()). Миниатюра будет добавлена только к постам (записям типа post):

add_filter( 'the_content', 'featured_image_before_content' ); 
function featured_image_before_content( $content ) {
	if ( is_singular('post') && has_post_thumbnail()) {
		$thumbnail = get_the_post_thumbnail();

		$content = $thumbnail . $content;
	}

	return $content;
}

Где вызывается хук

WPSEO_Link_Watcher::process()
the_content
do_trackbacks()
the_content
get_the_content_feed()
the_content
WP_REST_Revisions_Controller::prepare_item_for_response()
the_content
WP_REST_Attachments_Controller::prepare_item_for_response()
the_content
WP_REST_Posts_Controller::prepare_item_for_response()
the_content
the_content()
the_content
wp_trim_excerpt()
the_content
WC_API_Products::get_product_data()
the_content
WPSEO_Link_Reindex_Post_Service::process_post()
the_content
yoast/admin/links/class-link-watcher.php 144
$content = apply_filters( 'the_content', $content );
wp-includes/comment.php 2744
$excerpt = apply_filters( 'the_content', $post->post_content, $post->ID );
wp-includes/feed.php 191
$content = apply_filters( 'the_content', get_the_content() );
wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php 607
'rendered' => apply_filters( 'the_content', $post->post_content ),
wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php 436
'rendered' => apply_filters( 'the_content', $post->post_content ),
wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php 1683
$data['content']['rendered'] = post_password_required( $post ) ? '' : apply_filters( 'the_content', $post->post_content );
wp-includes/post-template.php 253
$content = apply_filters( 'the_content', $content );
wp-includes/formatting.php 3823
$text = apply_filters( 'the_content', $text );
woocommerce/includes/legacy/api/v1/class-wc-api-products.php 325
'description'        => apply_filters( 'the_content', $product->get_description() ),
woocommerce/includes/legacy/api/v1/class-wc-api-products.php 342
'purchase_note'      => apply_filters( 'the_content', $product->get_purchase_note() ),
yoast/admin/links/class-link-reindex-post-service.php 72
$content = apply_filters( 'the_content', $post->post_content );

Где используется хук в ядре WP

Использование не найдено.
2 коммента
  • Вроде бы здесь указанно противоположное условие:
    Если страница 'debug' то ничего не делаем ... ?

    function my_the_content_filter( $content ){
    	// Если не страница debug ничего не делаем
    	if( $GLOBALS['post']->post_name == 'debug' )
    		return $content;
    ............

    Такой вопрос, почему не работает $post->ID; без объявления global $post; ?
    В то же время get_the_ID(); и $GLOBALS['post']->ID; работают.

    Ответить4.2 года назад #
    • Kama7770

      Спасибо поправил код, там была ошибка...

      Насчет global - это объявление области видимости переменной как глобальной. global $post; означает, что переменная $post видна глобально, а не локально. Обычно это нужно внутри каких либо функций. Потому что как правило все переменные объявляемые внутри функции ограничиваются только лишь областью видимости этой функции и они не работают за пределами этой функции.

      $GLOBALS['post'] - это обращение к переменной из глобального массива $GLOBALS, того где хранятся все глобальные переменные, поэтому тут объявление $post как глобальной не обязательно.

      Пример:

      function foo(){
      	// 1
      	var_dump( $post ); // выведет: NULL - переменная не определена
      	var_dump( $GLOBALS['post'] ); // выведет: объект поста
      
      	// 2
      	// а теперь глобально
      	global $post;
      	var_dump( $post ); // выведет: объект поста
      	var_dump( $GLOBALS['post'] ); // выведет: объект поста
      
      	// 3
      	$post = 'foo'; // так мы изменили глобальную переменную 
      				   // и если к ней обратиться откуда-то еще,
      				   // то в ней уже будет не объект поста, а строка 'foo'
      
      	var_dump( $post ); // выведет: 'foo'
      	var_dump( $GLOBALS['post'] ); // выведет: 'foo'
      }
      
      foo(); // вызов

      А функция get_the_ID(); использует $post = get_post(); которая в свою очередь использует именно глобальную переменную $post.

      3
      Ответить4.2 года назад #