Задать вопрос
OwenChamb
@OwenChamb

Как при отсутствии thumbnails в записи, выводить thumbnail заглушку?

Добрый день, я делаю записи, в которых есть the_title и the_content, при условии что thumbnail добавлен вручную, запись появляется с картинкой, как сделать так, что бы thumbnail в случае если не был добавлен вручную, выводил заранее приготовленную thumbnail заглушку.
  • Вопрос задан
  • 873 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
1 - плагином https://wordpress.org/plugins/default-featured-image/
2 - руками в шаблоне - примерно так проверкой на наличие has_post_thumbnail()
<?php 
if(has_post_thumbnail()) {
    the_post_thumbnail();
} else {
    echo '<img src="' . get_bloginfo("template_url") . '/images/img-default.png" />';
}
?>
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Ответ Вадим Кот полностью подходит, если надо в конкретном месте шаблона разово запилить. Но если это должно быть как стандартное поведение везде, где есть post thumbnails, а сторонний плагин ставить не хочется, то лучше написать свою функцию. У меня она среди прочих полезных лежит в mu-plugin'е, но можно и в functions.php:
/**
 * Display native post thumbnail or a fallback image.
 *
 * @param  string  $size
 * @param  string  $attr
 */
function the_post_thumbnail_fallback( $size = 'post-thumbnail', $attr = '' )
{
	if ( has_post_thumbnail() ) :
		echo get_the_post_thumbnail( null, $size, $attr );

	else :
		$post_thumbnail_id = get_option( 'default_post_thumbnail' );

		$html = wp_get_attachment_image( $post_thumbnail_id, $size, false, $attr );

		/**
		 * Filters the post thumbnail HTML.
		 *
		 * @param  string  $html  The post thumbnail HTML.
		 * @param  int  $post_id  The post ID.
		 * @param  string  $post_thumbnail_id  The post thumbnail ID.
		 * @param  string|array  $size  The post thumbnail size. Image size or array of width and height values (in that order). Default 'post-thumbnail'.
		 * @param  string  $attr  Query string of attributes.
		 * @since 2.9.0
		 */
		echo apply_filters( 'post_thumbnail_html', $html, null, $post_thumbnail_id, $size, $attr );

	endif;
}

В шаблонах просто используем эту функцию вместо the_post_thumbnail(), включая необходимые параметры (размер и тд):
<header class="post-header">
    <h1 class="post-title">
        <?php the_title(); ?>
    </h1>

    <div class="post-thumbnail">
        <?php the_post_thumbnail_fallback(); ?>
    </div>
</header>

В самой функции the_post_thumbnail_fallback() обратите внимание на строчку
$post_thumbnail_id = get_option( 'default_post_thumbnail' );

Сама картинка загружена через медиабиблиотеку, ее ID хранится в wp_options. У меня это реализовано в настройках (как и в плагине, на который ссылается Вадим Кот), но можно захардкодить ID прямо в этой функции. HTML создается нативной wp_get_attachment_image(), идентично тому что создаст the_post_thumbnail() потому что она использует эту же функцию.

Также здесь у нас сохранен фильтр post_thumbnail_html, с помощью которого сторонние плагины могут модифицировать html-код тега img - а это могут быть вполне полезные фичи - SEO, css-классы (например для lazyload), responsive и тд.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы