WordPress как на ладони
Мощный и не дорогой хостинг от Fornex.com Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

the_content хук-фильтр . WP 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;
}

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

the_content()
the_content
get_the_content_feed()
the_content
WP_REST_Attachments_Controller::prepare_item_for_response()
the_content
WC_API_Products::get_product_data()
the_content
WP_REST_Revisions_Controller::prepare_item_for_response()
the_content
WP_REST_Posts_Controller::prepare_item_for_response()
the_content
do_trackbacks()
the_content
wp_trim_excerpt()
the_content
wp-includes/post-template.php 240
$content = apply_filters( 'the_content', $content );
wp-includes/feed.php 190
$content = apply_filters( 'the_content', get_the_content() );
wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php 311
'rendered' => apply_filters( 'the_content', $post->post_content ),
woocommerce/includes/api/legacy/v1/class-wc-api-products.php 325
'description'        => apply_filters( 'the_content', $product->get_description() ),
woocommerce/includes/api/legacy/v1/class-wc-api-products.php 342
'purchase_note'      => apply_filters( 'the_content', $product->get_purchase_note() ),
wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php 532
'rendered' => apply_filters( 'the_content', $post->post_content ),
wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php 1520
'rendered'      => post_password_required( $post ) ? '' : apply_filters( 'the_content', $post->post_content ),
wp-includes/comment.php 2533
$excerpt = apply_filters( 'the_content', $post->post_content, $post->ID );
wp-includes/formatting.php 3314
$text = apply_filters( 'the_content', $text );

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

wp-includes/class-wp-embed.php 32
add_filter( 'the_content', array( $this, 'run_shortcode' ), 8 );
wp-includes/class-wp-embed.php 39
add_filter( 'the_content', array( $this, 'autoembed' ), 8 );
wp-includes/blocks.php 243
remove_filter( 'the_content', 'wpautop', $priority );
wp-includes/blocks.php 244
add_filter( 'the_content', '_restore_wpautop_hook', $priority + 1 );
wp-includes/blocks.php 272
add_filter( 'the_content', 'wpautop', $current_priority - 1 );
wp-includes/blocks.php 273
remove_filter( 'the_content', '_restore_wpautop_hook', $current_priority );
wp-includes/default-filters.php 159
add_filter( 'the_content', 'do_blocks', 9 );
wp-includes/default-filters.php 160
add_filter( 'the_content', 'wptexturize' );
wp-includes/default-filters.php 161
add_filter( 'the_content', 'convert_smilies', 20 );
wp-includes/default-filters.php 162
add_filter( 'the_content', 'wpautop' );
wp-includes/default-filters.php 163
add_filter( 'the_content', 'shortcode_unautop' );
wp-includes/default-filters.php 164
add_filter( 'the_content', 'prepend_attachment' );
wp-includes/default-filters.php 165
add_filter( 'the_content', 'wp_make_content_images_responsive' );
wp-includes/default-filters.php 504
add_filter( 'the_content', 'do_shortcode', 11 ); // AFTER wpautop()
wp-includes/template-loader.php 54
remove_filter('the_content', 'prepend_attachment');
wp-includes/default-filters.php 130
add_filter( $filter, 'capital_P_dangit', 11 );
3 коммента
  • avense5 cайт: videovegas.ru

    Вроде бы здесь указанно противоположное условие:
    Если страница '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; работают.

    Ответить2.5 года назад #
    • Kama7079

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

      Насчет 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.

      2
      Ответить2.5 года назад #
Здравствуйте, !     Войти . Зарегистрироваться