Отображение миниатюры записи без установки изображения записи
Я надеюсь, что смогу объяснить, чего я пытаюсь добиться. На главной странице моего текущего проекта я отображаю миниатюру изображения записи вместе с отрывком содержимого записи. На каждой странице отдельной записи есть стандартная галерея WP с 2-4 изображениями внутри.
Я хочу сделать так, чтобы моему клиенту не приходилось всегда использовать изображение записи для каждого поста, чтобы миниатюра всегда отображалась на главной странице. Другими словами, сейчас ему нужно выбрать изображение для записи, чтобы была эта представительная миниатюра для каждой записи в цикле на главной странице.
Можно ли сделать так, чтобы даже если он не выберет изображение записи, все равно была миниатюра для представления поста? Можно ли сделать так, чтобы автоматически выбиралось первое изображение из галереи поста, если изображение записи не выбрано?
На всякий случай, вот часть кода, который я использую:
<div id="image-wrap">
<?php
if ( has_post_thumbnail() ) {
the_post_thumbnail();
}
?>
</div><!--конец image-wrap-->
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<?php the_title('<h2 class="entry-title"><a href="' .
get_permalink() . '" title="' . the_title_attribute('echo=0') . '"
rel="bookmark">', '</a></h2>'); ?>
<div class="entry-content">
<?php the_content(__('Читать далее', 'example')); ?>
<?php wp_link_pages('before=<p class="pages">' . __('Страницы:','example') .
'&after=</p>'); ?>
</div>
</div>
<?php endwhile; ?>
<?php else : ?>
<p class="no-posts"><?php _e('Извините, записи не найдены',
'example'); ?></p>
<?php endif; ?>
<?php wp_reset_query(); ?>
А это находится в файле FUNCTIONS:
// Эта тема использует миниатюры записей
add_theme_support( 'post-thumbnails' );
set_post_thumbnail_size( 150, 100, true );
// Автоматически делает миниатюры изображений записи кликабельными ссылками
add_filter( 'post_thumbnail_html', 'my_post_image_html', 10, 3 );
function my_post_image_html( $html, $post_id, $post_image_id ) {
$html = '<a href="' . get_permalink( $post_id ) . '" title="' . esc_attr(
get_post_field( 'post_title', $post_id ) ) . '">' . $html . '</a>';
return $html;
}
// Эта тема отображает изображение записи в полном размере на странице записи
function InsertFeaturedImage($content) {
global $post;
$original_content = $content;
if ( current_theme_supports( 'post-thumbnails' ) ) {
if ((is_page()) || (is_single())) {
$content = the_post_thumbnail('page-single');
$content .= $original_content;
}
}
return $content;
}
add_filter( 'the_content', 'InsertFeaturedImage' );
Сайт http://dependablecarcompany.com доступен, если вы хотите увидеть, о чем я говорю. Вы поймете, что я имею в виду, когда посмотрите на пост под названием "1991 GMC Sierra". Я не использовал изображение записи для этого поста, поэтому миниатюра не отображается. Заранее спасибо!

Не могу не порекомендовать плагин Get the Image (от Justin Tadlock). Это один из лучших плагинов, он отлично поддерживается и имеет аккуратный код — что ещё важнее, он выполняет именно то, что вам нужно, предоставляя множество настроек.
Как он извлекает изображения?
Ищет изображение по произвольному полю (которое вы можете указать).
Если изображение не найдено в произвольном поле, проверяет наличие изображения с помощью the_post_thumbnail() (новая функция изображений в WP 2.9).
Если изображение не найдено, берёт изображение, прикреплённое к записи.
Если нет прикреплённых изображений, может извлечь изображение из содержимого записи (по умолчанию отключено).
Если изображение так и не найдено, использует изображение, заданное вами (по умолчанию не задано).

Хорошо, я вроде бы разобрался с этим, но теперь столкнулся с проблемами. Я использовал этот код для отображения миниатюры, если не указано Избранное изображение: if ( has_post_thumbnail() ) {
the_post_thumbnail();
}
else
{
get_the_image( array('size' => 'thumbnail'));
} Что странно, так это то, что вывод изображения не стилизован так же, как остальные мои миниатюры. Если посмотреть на http://dependablecarcompany.com

Также, если теперь кликнуть на пост в вопросе: "1991 GMC Sierra", можно увидеть, что основное изображение больше не отображается. Без этого плагина и переписанного способа вызова миниатюры в цикле, основное изображение поста отображается прямо вверху по центру страницы. Можно увидеть, о чем я говорю, если кликнуть на любой другой пост.

Ладно, этот плагин работает таким образом, что может не очень подходить для вашей темы в текущем виде, если только вы не захотите модифицировать свой код. Но вы читали файл readme.html
, который идет в комплекте с плагином?

Да, я читал readme-файл и надеялся найти что-то полезное, но, похоже, это не поможет. Ох. Мне срочно нужно рабочее решение.

Только что нашел это: http://www.960development.com/code-snippet/first-image-of-wordpress-post-gallery/, но там используется TimThumb, а я теперь не уверен, стоит ли его применять из-за проблем, которые были с ним некоторое время назад. Что думаешь?

@AnthonyMyers На твоем месте я бы избегал TimThumb (и подобных решений). Думаю, это была бы рекомендация от любого участника WPSE.

@AnthonyMyers Только что начал вознаграждение за ваш вопрос. Вы получите помощь. Моя репутация мне всё равно уже не нужна. :)

Aahan, надеюсь, это не прощание! Потому что ты, кажется, готов потратить всю свою репутацию ;o) Поздравляю с духом инвестора!

@AahanKrish Огромное спасибо за вашу помощь! Вы действительно указали мне правильное направление. Я почти разобрался! Просто пытаюсь добиться правильного отображения миниатюр (которые не являются Избранными изображениями). Они не масштабируются корректно, в отличие от миниатюр Избранных изображений. Если снова посмотреть на сайт dependablecarcompany.com, можно увидеть, что они отображаются не совсем правильно. Я использовал css, задав максимальные ширину и высоту, но они всё равно не масштабируются. Если у вас нет времени на эту часть задачи, я понимаю. Основные моменты моего первоначального вопроса уже решены. Ещё раз огромное спасибо!

Просто проверьте наличие миниатюры, и если она не установлена, используйте первое изображение из галереи. Это можно сделать так:
$size = 'thumbnail'; // любой нужный вам размер
if ( has_post_thumbnail() ) {
the_post_thumbnail( $size );
} else {
$attachments = get_children( array(
'post_parent' => get_the_ID(),
'post_status' => 'inherit',
'post_type' => 'attachment',
'post_mime_type' => 'image',
'order' => 'ASC',
'orderby' => 'menu_order ID',
'numberposts' => 1)
);
foreach ( $attachments as $thumb_id => $attachment ) {
echo wp_get_attachment_image($thumb_id, $size);
}
}
По сути, если миниатюра записи не установлена, функция has_post_thumbnail() вернет false. Затем вызывается get_children для получения прикрепленных изображений к этой записи. Обратите внимание на параметр numberposts = 1, чтобы получить только первое изображение. После этого изображение выводится с помощью wp_get_attachment_image.
Обратите внимание, что я использовал foreach, хотя получаю только одно изображение. Это потому, что get_children всегда возвращает массив записей, независимо от их количества. Таким образом, я "прохожу" по массиву размером 1. Если изображений нет, массив будет пустым, и ничего не выведется.
Если вам не нравится использовать get_children, можно аналогичным образом создать новый WP_Query для получения первого прикрепленного изображения.
- Добавлена отсутствующая фигурная скобка для цикла foreach.

Отлично. Простите, я совсем не разбираюсь в PHP, так что это наверняка легко исправить, но у меня возникает синтаксическая ошибка при попытке использовать это в Dreamweaver. (Да, я знаю, что не стоит использовать DW, ха-ха!)

Хм.. Нет. Здесь нет синтаксических ошибок. Проверьте, правильно ли вы набрали код?

Хорошо, мне удалось заставить этот метод работать, но он выводит миниатюру без стилей, растянутую и пикселизированную. Но всё равно спасибо за ответ!

Я бы предпочел использовать предложенный вами код вместо плагина, но он просто не выводит миниатюру правильно. В любом случае, не могли бы вы помочь с моим связанным вопросом по этой проблеме? http://wordpress.stackexchange.com/questions/57861/how-to-display-a-posts-featured-image-with-this-code
