Миниатюры для категории (рубрики) и элементов таксономий в Вордпресс

Столкнулся с проблемой отображения картинки категории, а вернее, подкатегории на странице родительской категории. Сам Вордпресс по умолчанию не предоставляет такой возможности, поэтому придется сначала добавить функционал, обеспечивающий добавление миниатюры для рубрики.

Нашел этот код на хорошо известном для разработчиков сайте wp-kama.ru

if( is_admin() && ! class_exists('Term_Meta_Image') ){

	// init
	//add_action('current_screen', 'Term_Meta_Image_init');
	add_action( 'admin_init', 'Term_Meta_Image_init' );
	function Term_Meta_Image_init(){
		$GLOBALS['Term_Meta_Image'] = new Term_Meta_Image();
	}

	class Term_Meta_Image {

		// для каких таксономий включить код. По умолчанию для всех публичных
		static $taxes = []; // пример: array('category', 'post_tag');

		// название мета ключа
		static $meta_key = '_thumbnail_id';
		static $attach_term_meta_key = 'img_term';

		// URL пустой картинки
		static $add_img_url = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkAQMAAABKLAcXAAAABlBMVEUAAAC7u7s37rVJAAAAAXRSTlMAQObYZgAAACJJREFUOMtjGAV0BvL/G0YMr/4/CDwY0rzBFJ704o0CWgMAvyaRh+c6m54AAAAASUVORK5CYII=';

		public function __construct(){
			// once
			if( isset($GLOBALS['Term_Meta_Image']) )
				return $GLOBALS['Term_Meta_Image'];

			$taxes = self::$taxes ? self::$taxes : get_taxonomies( [ 'public' =>true ], 'names' );

			foreach( $taxes as $taxname ){
				add_action( "{$taxname}_add_form_fields",   [ $this, 'add_term_image' ],     10, 2 );
				add_action( "{$taxname}_edit_form_fields",  [ $this, 'update_term_image' ],  10, 2 );
				add_action( "created_{$taxname}",           [ $this, 'save_term_image' ],    10, 2 );
				add_action( "edited_{$taxname}",            [ $this, 'updated_term_image' ], 10, 2 );

				add_filter( "manage_edit-{$taxname}_columns",  [ $this, 'add_image_column' ] );
				add_filter( "manage_{$taxname}_custom_column", [ $this, 'fill_image_column' ], 10, 3 );
			}
		}

		## поля при создании термина
		public function add_term_image( $taxonomy ){
			wp_enqueue_media(); // подключим стили медиа, если их нет

			add_action('admin_print_footer_scripts', [ $this, 'add_script' ], 99 );
			$this->css();
			?>
			
			term_id, self::$meta_key, true );
			$image_url = $image_id ? wp_get_attachment_image_url( $image_id, 'thumbnail' ) : self::$add_img_url;
			$this->css();
			?>
			
				
				
					

					
				
			
			
			
			base, array('edit-tags','term')) || ! in_array($cs->taxonomy, (array) $this->for_taxes) )
			//  return;

			$title = __('Featured Image', 'default');
			$button_txt = __('Set featured image', 'default');
			?>
			

			.column-image{ width:50px; text-align:center; }';
			});

			// column without name
			return array_slice( $columns, 0, 1 ) + [ 'image' =>'' ] + $columns;
		}

		public function fill_image_column( $string, $column_name, $term_id ){

			if( 'image' === $column_name && $image_id = get_term_meta( $term_id, self::$meta_key, 1 ) ){
				$string = '';
			}

			return $string;
		}

		## Save the form field
		public function save_term_image( $term_id, $tt_id ){
			if( isset($_POST['term_imgid']) && $attach_id = (int) $_POST['term_imgid'] ){
				update_term_meta( $term_id,   self::$meta_key,             $attach_id );
				update_post_meta( $attach_id, self::$attach_term_meta_key, $term_id );
			}
		}

		## Update the form field value
		public function updated_term_image( $term_id, $tt_id ){
			if( ! isset($_POST['term_imgid']) )
				return;

			$cur_term_attach_id = (int) get_term_meta( $term_id, self::$meta_key, 1 );

			if( $attach_id = (int) $_POST['term_imgid'] ){
				update_term_meta( $term_id,   self::$meta_key,             $attach_id );
				update_post_meta( $attach_id, self::$attach_term_meta_key, $term_id );

				if( $cur_term_attach_id != $attach_id )
					wp_delete_attachment( $cur_term_attach_id );
			}
			else {
				if( $cur_term_attach_id )
					wp_delete_attachment( $cur_term_attach_id );

				delete_term_meta( $term_id, self::$meta_key );
			}
		}

	}

}

После того, как в файл functions.php будет добавлен этот код, на вкладке добавления или редактирования рубрики появится возможность добавить или заменить картинку для категории.

Далее нам нужно вывести это изображение в нужном месте. Как это сделать, зависит от того, на какой странице нужно вывести картинку категории. У меня была задача вывести картинки подрубрик на странице родительской рубрики. Кроме того, мне нужно было вывести картинки постов, расположенных непосредственно в родительской категории. Поэтому код пришлось немного усложнить.

Начнем собственно с вывода картинок подкатегорий на странице родительской категории.

   if (is_category()) {
   if (count(get_categories('child_of='.$cat))){
	$cat_data = get_categories( array( 'parent' => 3 ) );

	foreach ( $cat_data as $one_cat_data ){
	   $term_id = $one_cat_data->term_id;
	   $image_id = get_term_meta( $term_id, '_thumbnail_id', 1 );
	   $image_url = wp_get_attachment_image_url( $image_id, 'full' );
	   $block_img = sprintf( '', get_category_link( $one_cat_data->term_id ), $image_url );
	   $block_cats = sprintf( '', get_category_link( $one_cat_data->term_id ) , $one_cat_data->cat_name );
	 { ?>
								
	   

Здесь немного поясню. В данном случае выводятся картинка категории, являющаяся ссылкой на подкатегорию, а также название категории, тоже являющееся ссылкой на подкатегорию.

Если же картинку нужно выводить на странице самой подкатегории, код будет выглядеть немного иначе.

// получаем ID термина на странице термина
$term_id = get_queried_object_id();

// получим ID картинки из метаполя термина
$image_id = get_term_meta( $term_id, '_thumbnail_id', 1 );

// ссылка на полный размер картинки по ID вложения
$image_url = wp_get_attachment_image_url( $image_id, 'full' );

// выводим картинку на экран
echo '';

Код заимствован все с той же страницы https://wp-kama.ru/id_7686/miniatyury-dlya-elemetov-taksonomij.html

И напоследок. Как я написал изначально, задача у меня была в том, чтобы на странице категории выводить картинки подкатегорий (понятное дело, что и название подкатегории и ссылка на эту подкатегорию) и картинки (тоже с заголовком записи и ссылкой на запись) записей, находящихся непосредственно в родительской категории. Поэтому после кода вывода подрубрик следует код вывода записей из категории. У меня это выглядит так




Но тут есть засада: этим кодом будут выводиться на странице категории не только собственно записи из родительской категории, но и записи из подкатегорий. А мне это ни к чему. Поэтому в файле functions.php пришлось добавить такой код

//вывод записей только родительской рубрики start
function only_parent_category($query) {
    if (!is_admin() && $query->is_main_query() && $query->is_category())
        $query->set('category__in', array(get_queried_object_id()));
}
add_action('pre_get_posts', 'only_parent_category');

Оцените статью