Миниатюры для элементов таксономии (WP_TERM_IMAGE) – руководство с кодом для установки изображений.

Миниатюры для элементов таксономии (WP_TERM_IMAGE)

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

Как добавить или изменить изображение элемента таксономии

Чтобы добавить, загрузить и изменить изображение элемента таксономии, достаточно нажать на само изображение — это кнопка. После этого откроется стандартное окно медиафайлов WordPress, и картинка будет загружена в библиотеку медиа. Однако в отличие от изображений записей, она не будет прикреплена к термину — это минус, но пока так.

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

Вот как это будет выглядеть:

Пример изображения элемента таксономии

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

Код

В следующем коде реализована основная логика для работы с изображениями элементов таксономии.

<?php

namespace Kama;

use WP_Term;

/**

  • Возможность загружать изображения для терминов (элементы таксономий: категории, метки).
  • Примеры использования: https://github.com/doiftrue/Term_Meta_Image
  • @author Kama (wp-kama.com)
  • @version 3.5.2
    */

interface WP_Term_Image_Interface {
public static function init( $args = [] );
public static function get_image_id( $term );
}

class WP_Term_Image implements WP_Term_Image_Interface {
private $args;
private static $default_args = [
'taxonomies' => [],
'noimage_src' => "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 1000 1000'%3E%3Cpath fill='%23bbb' d='M430 660 l0 -90 -90 0 -90 0 0 -70 0 -70 90 0 90 0 0 -85 0 -85 70 0 70 0 0 85 0 85 90 0 90 0 0 70 0 70 -90 0 -90 0 0 90 0 90 -70 0 -70 0 0 -90z'%3E%3C/path%3E%3C/svg%3E",
];
private static $meta_key = '_thumbnail_id';
private static $attach_meta_key = 'image_of_term';

private function __construct(){}

public static function init( $args = [] ){
    static $inst;

    $args = array_filter( (array) $args ); 
    $args = array_intersect_key( $args, self::$default_args ); 

    $inst_key = md5( serialize( $args ) );

    if( empty( $inst[ $inst_key ] ) ){
        $inst[ $inst_key ] = new self();
        $inst[ $inst_key ]->set_args( $args );
        $inst[ $inst_key ]->register_hooks();
    }

    return $inst[ $inst_key ];
}

private function set_args( array $args = [] ){
    $this->args = $args + self::$default_args;
    if( ! $this->args['taxonomies'] ){
        $this->args['taxonomies'] = get_taxonomies( [ 'public' => true ], 'names' );
    }
}

private function register_hooks(){
    foreach( $this->args['taxonomies'] as $taxname ){
        add_action( "{$taxname}_add_form_fields", [ $this, '_add_term__image_fields' ], 10 );
        add_action( "{$taxname}_edit_form_fields", [ $this, '_update_term__image_fields' ], 10, 2 );
        add_action( "created_{$taxname}", [ $this, '_create_term__handler' ], 10, 2 );
        add_action( "edited_{$taxname}", [ $this, '_updated_term__handler' ], 10 );
        add_filter( "manage_edit-{$taxname}_columns", [ WP_Term_Image_Table_Columns::class, '_add_image_column' ] );
        add_filter( "manage_{$taxname}_custom_column", [ WP_Term_Image_Table_Columns::class, '_fill_image_column' ], 10, 3 );
    }
}

public static function get_image_id( $term ){
    return (int) get_term_meta( is_object( $term ) ? $term->term_id : $term, self::$meta_key, true );
}

public function _add_term__image_fields( $taxonomy ){
    wp_enqueue_media();
    add_action( 'admin_print_footer_scripts', [ $this, '_add_script' ], 99 );
    $this->_css();
    ?>
    
args['noimage_src']; $this->_css(); ?>
post_parent ){ wp_delete_attachment( $old_attach_id ); } } } private static function up_attach_term_id( $attach_id, $action, $term_id ){ $term_ids = wp_parse_list( get_post_meta( $attach_id, self::$attach_meta_key, true ) ); if( 'add' === $action ){ $term_ids[] = $term_id; } else { $term_ids = array_diff( $term_ids, [ $term_id ] ); } $term_ids = array_unique( (array) $term_ids ); $term_ids = array_map( 'sanitize_text_field', $term_ids ); $joined_term_ids = $term_ids ? ','. implode( ',', $term_ids ) .',' : ''; update_post_meta( $attach_id, self::$attach_meta_key, $joined_term_ids ); return $term_ids; }

}

class WP_Term_Image_Table_Columns {
public static function _add_image_column( $columns ){
add_action( 'admin_notices', function(){
echo '

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

public static function _fill_image_column( $string, $column_name, $term_id ){
    if( 'image' === $column_name ){
        $image_id = WP_Term_Image::get_image_id( $term_id );
        $string = $image_id
            ? sprintf( '',
                wp_get_attachment_image_url( $image_id, 'thumbnail' ) )
            : '';
    }
    return $string;
}

}

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

Установка

Создайте файл WP_Term_Image.php с кодом выше в корневой папке темы и подключите его в файл functions.php вашей темы:

require_once DIR . '/WP_Term_Image.php';

Или используйте Composer:

composer require doiftrue/wp_term_image

Инициализация

Для базовой инициализации без передачи параметров:

add_action( 'admin_init', [ KamaWP_Term_Image::class, 'init' ] );

С передачей параметров:

add_action( 'admin_init', 'kama_wp_term_image' );

function kama_wp_term_image(){
KamaWP_Term_Image::init( [
'taxonomies' => [ 'post_tag' ],
] );
}

Отображение изображения элемента таксономии на сайте

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

Это делается с помощью встроенной функции WordPress get_term_meta(), которая появилась с версии 4.4.

ID изображений (вложений) хранится в метаполе термина _thumbnail_id. Вот как можно это сделать:

// Получить 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 '';

Если вам не нужно изображение полного размера, замените full на нужный вам размер в функции wp_get_attachment_image_url().

Плагины для вставки миниатюр таксономии

Существуют и другие плагины на эту тему:

  • Taxonomy Thumbnail — все хорошо с кодом, но его много. Поддерживает версии WP до 4.4 (когда была добавлена таблица метаданных таксономии).
  • WP Multiple Taxonomy Images — код плагина очень похож на код в этой статье. Он позволяет установить несколько миниатюр для термина.
  • Taxonomy Images — этот плагин имеет наивысшие оценки по данному вопросу, но кода в нем много, «ненужного» кода. Если вам не нужны лишние функции, лучше используйте предыдущие плагины или код из этой статьи.

Теперь вы знаете, как добавить и использовать миниатюры для элементов таксономии в WordPress!

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *