Как добавить и отобразить изображение категории

Вопрос или проблема

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

Для справки вот мой полный код Области виджета описания категории.

<?php
/*
Plugin Name: My Category Description Widget Plugin
Plugin URI: http://mkrdip.me/category-posts-widget
Description: Добавляет виджет, который показывает все категории вместе с их описанием.
Author: Muhammad Jahangir
Version: 1.0
Author URI: http://facebook.com/jahangirKhattakPk
*/
class categories_description extends WP_Widget
{
    function __construct()
    {
        $widget_ops = array( 
            'classname' => 'categoryDescription widget',
            'description' => 'Показать все категории с их описанием.',
        );
        parent::__construct( 'categories_description', 'Мой виджет описания категории', $widget_ops );
    }
    // конец __construct()

    public function form( $instance ) {
        $title = ! empty( $instance['title'] ) ? $instance['title'] : __( 'Новый заголовок', 'text_domain' );
        ?>
        <p>
        <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php _e( esc_attr( 'Заголовок:' ) ); ?></label> 
        <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
        </p>
        <?php 
    }
    // Конец функции формы

// Обновление виджета, замена старых экземпляров новыми
public function update( $new_instance, $old_instance ) {
    $instance = array();
    $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
    return $instance;
}
// Конец функции обновления
    function widget($args,$instance){
           echo $args['before_widget'];
            if ( ! empty( $instance['title'] ) )
            {


        ?>
        <div class="categoriesDescription bgWhite">
                <div class="container innerContainer">
                    <h2 class="widgetTitle"><?php echo apply_filters( 'widget_title', $instance['title'] ); } ?></h2>
                        <?php $categories = get_categories();
                        foreach ($categories as $cat)
                            { 

                                $cat_name = $cat->name;
                                $CategoryID = get_cat_ID( $cat_name );
                                $totalPosts = $cat->count;
                                $currentcatname = $cat_name;



                                ?>

                              <div class="category-image">

                              </div>

                                <div class="singleCategory col-lg-4">
                                    <a href="https://wordpress.stackexchange.com/questions/228917/<?php echo get_category_link( $cat ); ?>" class="uppercase categoryTitle">
                                        <?php echo $cat_name; ?></a>
                                        <span class="numberOfPosts">
                                        <?php 
                                            echo '( '.$totalPosts.' )'; 
                                        ?>
                                </span>                         
                                <div class="CategoryImg"><?php echo $cat->term_icon; ?>
                                    // здесь я хочу показать изображение категории...
                                <div class="my-image">
                                <?php

 ?>
                                <header class="archive-header <?php if ($category_image==true) echo 'category-image'; ?>">

                                 </div>

                                </div>
                                <p class="CategoryDescription"><?php echo $cat->description; ?></p>
                                <p><?php echo $CategoryID; ?></p>
                               </div>
                            <?php 
                            } ?>
                    <div class="clearfix"></div>
                </div>
        </div>
    </div>
</div>
        <?php

    }
    // Конец функции виджета
}
//конец класса categories_description
    add_action('widgets_init', function() {
        register_widget('categories_description');
    })
?>

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

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

Вы можете синхронизировать данные с использованием wp_insert_post, сопоставляя ID виджета с пользовательским слагом..?

// чтобы сопоставить виджет с существующей пользовательской записью
// похоже на get_post, но можно использовать слуг (если нет родительских записей)
$slug = $instance['id']; // не уверен в этом?
$post = get_page_by_path($slug, OBJECT, 'cat_image');

if (!$post) {
    // создать новую запись из данных экземпляра виджета
    $args = array('post_type' => 'cat_image'); // ...и все остальное
    $post = wp_insert_post($args);
}

$thumbnail_id = get_post_meta($post->ID, '_thumbnail_id', true);  
$postthumbnailhtml = _wp_post_thumbnail_html($thumbnail_id, $post->ID);

Это даст вам элемент загрузки, связанный с ID записи… (плюс вам может понадобиться убедиться, что вы подключили wp_enqueue_media на странице виджета, если это еще не сделано?)

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

Ответ или решение

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

Шаг 1: Создание настраиваемого типа записи для изображений категорий

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

Добавьте следующий код в ваш плагин:

function register_category_image_post_type() {
    register_post_type('cat_image', array(
        'labels' => array(
            'name' => __('Category Images'),
            'singular_name' => __('Category Image')
        ),
        'public' => false,
        'has_archive' => false,
        'supports' => array('thumbnail'),
    ));
}
add_action('init', 'register_category_image_post_type');

Шаг 2: Связывание изображений с категориями

Теперь мы создадим функцию, которая будет привязывать изображение к категории. Вам нужно будет использовать term_id, чтобы сохранять ID изображения в связанных метаданных категории.

Добавьте функцию для привязки изображения к категории в ваш плагин:

function save_category_image($term_id) {
    if (isset($_POST['category_image_id']) && $_POST['category_image_id'] != '') {
        update_term_meta($term_id, 'category_image', intval($_POST['category_image_id']));
    }
}
add_action('created_category', 'save_category_image');
add_action('edited_category', 'save_category_image');

Шаг 3: Добавление метабокса для загрузки изображений

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

function category_image_meta_box($term) {
    $image_id = get_term_meta($term->term_id, 'category_image', true);
    $image = wp_get_attachment_image($image_id, 'thumbnail');

    echo '<div class="custom-category-image">';
    echo '<label>' . __('Category Image') . '</label>';
    echo '<div>';
        echo $image ? $image : __('No image set.');
    echo '</div>';
    echo '<input type="hidden" id="category_image_id" name="category_image_id" value="' . esc_attr($image_id) . '">';
    echo '<button class="upload_category_image button">' . __('Upload Image') . '</button>';
    echo '</div>';
}
add_action('category_edit_form_fields', 'category_image_meta_box');

Шаг 4: Обработка загрузки изображения

Добавьте JavaScript, чтобы обрабатывать загрузку изображения. Этот код необходимо добавить в ваш плагин:

function enqueue_category_image_scripts() {
    wp_enqueue_media();
    ?>
    <script>
        jQuery(document).ready(function($) {
            $('.upload_category_image').on('click', function(e) {
                e.preventDefault();
                var button = $(this);
                var custom_uploader = wp.media({
                    title: 'Upload Image',
                    button: {
                        text: 'Use this image'
                    },
                    multiple: false
                }).on('select', function() {
                    var attachment = custom_uploader.state().get('selection').first().toJSON();
                    $('#category_image_id').val(attachment.id);
                    button.prev('div').html('<img src="' + attachment.url + '" style="max-width:100%;"/>');
                })
                .open();
            });
        });
    </script>
    <?php
}
add_action('admin_enqueue_scripts', 'enqueue_category_image_scripts');

Шаг 5: Отображение изображения в виджете

Теперь мы можем обновить ваш widget метод, чтобы отображать изображение категории перед описанием.

Модифицируйте часть кода в widget методе следующим образом:

function widget($args, $instance) {
    echo $args['before_widget'];
    if (!empty($instance['title'])) {
        ?>
        <div class="categoriesDescription bgWhite">
            <div class="container innerContainer">
                <h2 class="widgetTitle"><?php echo apply_filters('widget_title', $instance['title']); ?></h2>
                <?php $categories = get_categories(); ?>
                <?php foreach ($categories as $cat) { 
                    $cat_image_id = get_term_meta($cat->term_id, 'category_image', true);
                    $cat_image = wp_get_attachment_image($cat_image_id, 'thumbnail');
                    ?>
                    <div class="singleCategory col-lg-4">
                        <a href="<?php echo get_category_link($cat); ?>" class="uppercase categoryTitle"><?php echo $cat->name; ?></a>
                        <span class="numberOfPosts"><?php echo ' (' . $cat->count . ')'; ?></span>
                        <div class="CategoryImg">
                            <?php if ($cat_image) : ?>
                                <div class="category-image"><?php echo $cat_image; ?></div>
                            <?php endif; ?>
                        </div>
                        <p class="CategoryDescription"><?php echo $cat->description; ?></p>
                    </div>
                <?php } ?>
                <div class="clearfix"></div>
            </div>
        </div>
        <?php
    }
    echo $args['after_widget'];
}

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...