У базовых записей WP есть поддержка поля миниатюры, т.н. прикрепленное изображение. Рассмотрим как добавить поле миниатюры в редактор произвольного типа публикации (custom post type). А в конце статьи — пример вставки миниатюры в шаблон вашей публикации.
Регистрация
Всё начинается с регистрации типа публикации, а именно функции register_post_type. Её следует вызывать на этапе инициализации модуля/темы. Довольно часто её прикрепляют как вызов hook: init.
Пример кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// init types add_action('init', 'my_init_hook', 10); function my_init_hook() { register_post_type( 'my-post-type', array( 'public' => true, 'has_archive' => false, 'labels' => array( ... ), 'supports' => array('title', 'editor', 'thumbnail'), ) ); } |
В примере мы объявляем новый тип публикации — my-post-type. У него может быть множество свойств, которые описаны в документации, но в контексте нашей проблемы, нас интересует лишь свойство support — и передаваемое значение ‘thumbnail‘.
К сожалению, этого не достаточно чтобы WP понял наши намерения по поводу миниатюры в объявленном типе публикации. Чтобы завершить начатое, нужно добавить поддержку фичи в теме.
1 |
add_theme_support( 'post-thumbnails', array( 'my-post-type' ) ); |
Теперь в правой колонке редактора появится виджет для прикрепления миниатюры.
Вывод в шаблон
Прикрепленное изображение — это всего лишь связка с media библиотекой вашего сайта. Статья получает дополнительное мета поле (с ключом — _thumbnail_id), где сохраняется идентификатор media объекта.
Сначала мы извлекаем этот ID (imageID), собираем дополнительные мета-данные о картинке, а затем формируем шаблон тега IMG. Пример кода в контексте шаблона вашей публикации:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php if (have_posts()) : while (have_posts()) : the_post(); ?> <?php ... if ( function_exists ("has_post_thumbnail") && has_post_thumbnail() ) { $imageID = get_post_thumbnail_id(); $image_title = get_the_title( $imageID ); $image_alt = get_post_meta( $imageID, '_wp_attachment_image_alt', true); if (empty($image_alt)) { $image_alt = $post->post_title; } if (empty($image_title)) { $image_title = $post->post_title; } the_post_thumbnail ('large', array("class" => "aligncenter fill", 'alt' => $image_alt, 'title' => $image_title)); } ... ?> <?php endwhile; endif; ?> |
Тег IMG формируется функцией the_post_thumbnail, которая позволяет передать атрибуты картинки и выбрать тип миниатюры. В данном примере используется встроенный тип — large.
Если в шаблоне нет требуемого контекста как в примере выше, то используйте прямое указание на публикацию, миниатюра которой вам требуется.
1 2 3 4 5 |
$post_id = 1000; // ID вашей публикации с миниатюрой ... if ( function_exists ("has_post_thumbnail") && has_post_thumbnail($post_id) ) { $imageID = get_post_thumbnail_id($post_id); ... |
Возможно, вы сами захотите собрать тег IMG, тогда вам понадобится функция для построения URL картинки:
1 |
$url = wp_get_attachment_image_src($imageID, 'large'); |
Она требует тип миниатюры, в примере я снова взял встроенный тип — large.