Вопрос или проблема
Я создал плагин для 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'];
}
Заключение
Теперь ваши категории будут отображать загруженные изображения перед описанием в виджете. Пользователи смогут загружать изображения через интерфейс редактирования категории. Вы можете кастомизировать код под свои нужды и дополнительно стилизовать вывод для лучшего отображения на вашем сайте.