Верх страницы
Обложка к записи Добавление миниатюры поста в AMP-версию страницы
Время для прочтения: 0 мин. 9 сек.

Добавление миниатюры поста в AMP-версию страницы

В связи с кучей ограничений самого AMP и тем, что плагин amp-wp (от Automattic) находится на стадии разработки, товарищи забыли или не успели добавить функцию вывода миниатюры поста. Это исправляется в два счёта.

Вариант 1

Покопавшись в недрах плагина, я нашел фильтр amp_post_template_data, за который можно зацепиться для изменения контента AMP-страницы.

/**
 * Добавить обложку к посту в AMP-версии
 *
 * @param array $data все данные по текущей странице .
 * @param array $post информация по посту.
 *
 * @return mixed
 */
function mihdan_amp_featured_image( $data, $post ) {
	// Проверить, есть ли у поста миниатюра
	if ( has_post_thumbnail( $post ) ) {
		$size = 'medium';
		// Получить идентификатор вложения
		$thumbnail_id = get_post_thumbnail_id( $post );
		// Получить вариации srcset
		$srcset = wp_get_attachment_image_srcset( $thumbnail_id, $size );
		// Получить путь и размеры миниатюры
		list ( $src, $width, $height ) = wp_get_attachment_image_src( $thumbnail_id, $size );
		// Собрать все в тег amp-image
		$featured_image = sprintf(
			'<p><amp-img id=»featured-image» layout=»responsive» src=»%s» width=»%d» height=»%d» alt=»%s» srcset=»%s»></amp-img></p>',
			esc_url( $src ),
			absint( $width ),
			absint( $height ),
			esc_attr( $post->post_title ),
			esc_attr( $srcset )
		);
		// Добавить тег в начало поста
		$data['post_amp_content'] = $featured_image . $data['post_amp_content'];
	}
	return $data;
}
add_filter( 'amp_post_template_data', 'mihdan_amp_featured_image', 10, 2 );

Данную функцию можно разместить в файле function.php или завернуть в плагин.

У себя я ее положил в папку с mu-плагинами (/wp-content/mu-plugins/amp.php), чтобы она корректно работала вместе с плагином WPtouch, который подменяет шаблон на мобильных устройствах, из-за чего код в functions.php просто перестает работать.

Есть вопросы? Пишите в комментах.

Вариант 2

Этот способ базируется на внедрении миниатюры в начало контента поста при помощи обычного тега <img /> до рендера AMP-парсера через хук pre_amp_render_post. В процессе рендеринга страницы тег <img /> преобраузется в валидный <amp-img />.

/**
 * Добавляем свой хук в рендер AMP поста
 */
function mihdan_amp_add_custom_actions() {
	add_filter( 'the_content', 'mihdan_amp_add_featured_image' );
}
add_action( 'pre_amp_render_post', 'mihdan_amp_add_custom_actions' );
/**
 * Добавляем миниатюру в начало поста в виде тега <img />
 * Впоследствии он заменится парсером на <amp-img />
 *
 * @param string $content текст поста
 *
 * @return string
 */
function mihdan_amp_add_featured_image( $content ) {
	if ( has_post_thumbnail() ) {
		$image = sprintf( '<p class=»featured-image»>%s</p>', get_the_post_thumbnail() );
		$content = $image . $content;
	}
	return $content;
}

Автор: Кобзарёв Михаил

Русский разработчик с 20-ти летним стажем. Работаю с PHP, ООП, JavaScript, Git, WordPress, Битрикс, Joomla, Drupal, Opencart, DLE, Laravel, Moonshine, SuiteCRM.

Оптимизирую сайты под Google Page Speed, настраиваю импорты для больших магазинов на WooCommerce + WP All Import. Пишу плагины на заказ. Все мои услуги.

Веду блог о разработке, дайджест в телеграмме и в ВК.

Вы всегда можете нанять меня.

Комментарии
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Предыдущая запись

Давайте дружить
в Телеграме

Авторский блог вашего покорного слуги в Telegram про web, программирование, алгоритмы, инструменты разработчика, WordPress, Joomla, Opencart, Laravel, Moonshine, фильмы и сериалы