WordPress как на ладони
Наставник Трепачёв Д.П., phphtml.net wordpress jino

set_post_thumbnail() WP 3.1.0

Устанавливает миниатюру записи по переданным ID записи и ID вложения (медиафайла). Если указанного вложения нет в базе данных, то функция удалит миниатюру записи.

Работает на основе: update_post_meta(), delete_post_meta()

Хуков нет.

Возвращает

Число ID вставленной строки метаданных или false, если не удалось вставить данные.

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

set_post_thumbnail( $post, $thumbnail_id );
$post(число/объект) (обязательный)
ID записи, которой нужно установить миниатюру. Можно передать объект записи.
$thumbnail_id(число) (обязательный)
ID вложения которое нужно прикрепить.

Примеры

#1 Установим миниатюру записи

Допустим нам нужно установить миниатюру записи 56. ID медиафайла (вложения) нам известен и равен 89:

if( set_post_thumbnail( 56, 89 ) )
	echo 'Миниатюра установлена.';
else
	echo 'Миниатюра удалена.';

#2 Автоматическая установка миниатюры записи

Этот код будет автоматически ставить миниатюру записи при сохранении. Если у записи нет миниатюры.

Будет устанавливаться первая прикрепленная к записи картинка.

add_action('future_to_publish', 'autoset_featured');
add_action('draft_to_publish', 'autoset_featured');
add_action('new_to_publish', 'autoset_featured');
add_action('pending_to_publish', 'autoset_featured');
//add_action('the_post', 'autoset_featured');
add_action('save_post', 'autoset_featured');

function autoset_featured() {
	global $post;

	// проверка на наличие миниатюры посте
	if( has_post_thumbnail($post->ID) )
		return;

	$attached_image = get_children( array(
		'post_parent'=>$post->ID, 'post_type'=>'attachment', 'post_mime_type'=>'image', 'numberposts'=>1, 'order'=>'ASC'
	) );

	// делаем условие проверку на наличие картинки
	if( $attached_image ){
		foreach ($attached_image as $attachment_id => $attachment)
			set_post_thumbnail($post->ID, $attachment_id);
	}
}

Код set post thumbnail: wp-includes/post.php WP 4.8.1

<?php
function set_post_thumbnail( $post, $thumbnail_id ) {
	$post = get_post( $post );
	$thumbnail_id = absint( $thumbnail_id );
	if ( $post && $thumbnail_id && get_post( $thumbnail_id ) ) {
		if ( wp_get_attachment_image( $thumbnail_id, 'thumbnail' ) )
			return update_post_meta( $post->ID, '_thumbnail_id', $thumbnail_id );
		else
			return delete_post_meta( $post->ID, '_thumbnail_id' );
	}
	return false;
}

Cвязанные функции

Из метки: thumbnail (image картинки-миниатюры)

set_post_thumbnail 11 комментариев
Вопросы 1 Все
  • Встретил на просторах интернета код автоматической установки миниатюр путем обращения к галере , но код не работает, может он уже не актуален или ошибочен, можете посмотреть? (мне нравится то что тут есть условие и вставка первого изображения галереи, а также как я понимаю , нет необходимости правит single.php)

    function avtomaticheskaya_miniatura() {  
    global $post;  
    $already_has_thumb = has_post_thumbnail($post->ID);
    
    // проверка на наличие миниатюры посте
     if (!$already_has_thumb) {
     $attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
    
    // делаем условие проверку на наличеи картинки
     if ($attached_image) {
     foreach ($attached_image as $attachment_id => $attachment) {
     set_post_thumbnail($post->ID, $attachment_id);
     }
     }
     }
     }
    
    add_action('future_to_publish', 'autoset_featured');
    add_action('the_post', 'autoset_featured');
    add_action('save_post', 'autoset_featured');
    
    add_action('draft_to_publish', 'autoset_featured');
    add_action('new_to_publish', 'autoset_featured');
    add_action('pending_to_publish', 'autoset_featured');

    Главное чтобы отправлялась информация в базу данных о том что было скриптом добавлено 1 изображение галереи, иначе если тему поменять то и скрипта не будет и миниатюра в реальности будет пуста. Некоторые выставляют первое изображение галереи на миниатюру , но не записывают это в базу данных, для меня это не приемлемо.

    • Kama4477
      add_action('future_to_publish', 'autoset_featured');
      add_action('draft_to_publish', 'autoset_featured');
      add_action('new_to_publish', 'autoset_featured');
      add_action('pending_to_publish', 'autoset_featured');
      //add_action('the_post', 'autoset_featured');
      add_action('save_post', 'autoset_featured');
      
      function autoset_featured() {
      	global $post;
      
      	// проверка на наличие миниатюры посте
      	if( has_post_thumbnail($post->ID) )
      		return;
      
      	$attached_image = get_children( array( 'post_parent'=>$post->ID, 'post_type'=>'attachment', 'post_mime_type'=>'image', 'numberposts'=>1 ) );
      
      	// делаем условие проверку на наличие картинки
      	if( $attached_image ){
      		foreach ($attached_image as $attachment_id => $attachment)
      			set_post_thumbnail($post->ID, $attachment_id);
      	}
      }
      • Спасибо за помощь, но как всегда подвох , при добавлении галереи (сайт только с чистыми галереями wordpres) берет не первое , а последнее изображение

  • Чтоб бралась первая картинка галереи, а не последняя
    заменить

    $attached_image = get_children( array( 'post_parent'=>$post->ID, 'post_type'=>'attachment', 'post_mime_type'=>'image', 'numberposts'=>1 ) );

    на

    $attached_image = get_children( array( 'post_parent'=>$post->ID, 'post_type'=>'attachment', 'post_mime_type'=>'image', 'numberposts'=>1, 'order' => 'ASC' ) );
  • Павел
    @

    Как отключить вывод миниатюр на странице записей для конкретной категории?

    Ответить3 месяца назад #
    • Kama4477

      Найди блок где выводится миниатюра и скрой его по условию, для проверки условия используй in_category()

      Ответить3 месяца назад #
  • Влад
    @

    День добрый.
    Спасибо за статью, это буквально то, что мне нужно!
    Но как-то не хочет дружить у меня с сайтом
    Если что, I have no idea what I'm doing, просто копирую:
    Первую часть кода в /public_html/wp-includes/functions.php
    Вторую в /public_html/wp-includes/post.php

    Вылазит ошибка:
    Fatal error: Cannot redeclare set_post_thumbnail() (previously declared in /home/u893993548/public_html/wp-includes/post.php:6005) in /home/u893993548/public_html/wp-includes/post.php on line 6232

    строчка указывает на последнюю закрывающуюся фигурную скобку

    Ответить3 месяца назад #
    • Влад
      @

      Так, всё, отмена, мне подсказали, что вторую часть можно было не добалять)
      Заработало!
      Теперь вопрос из практики, можно ли сделать так, чтоб функция просто перепроверила весь сайт и обновила миниатюры? Без нужды зайти в каждый пост и нажать "обновить". Сайт криворуко переносился и все миниатюры послетали..

      Ответить3 месяца назад #
  • Олег

    Здравствуйте. Функция, насколько я понимаю, работает только для тех изображений, которые загружены в /wp-content/uploads/ , что нужно изменить (и можно ли вообще?) чтоб тянула или любое изображение или хотя бы то, которое загружено в другую папку ?
    скажем, /images/ ?

    Ответить3 месяца назад #
    • Kama4477

      Да только с ними. Из любой папки никак... Только если добавить изображение в медиатеку...

      Ответить3 месяца назад #

Здравствуйте, !

Ваш комментарий