kamillaM38 06.03.2023 15:17

Как создать кастомный виджет со списком последних записей по категориям в WordPress?

Здравствуйте! Я новичок в WordPress и мне нужна помощь с созданием кастомного виджета, который будет отображать список последних записей по категориям. Я хотел бы, чтобы виджет отображал название каждой категории и список последних записей, относящихся к этой категории.

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

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


class Custom_Recent_Posts_Widget extends WP_Widget {

    public function __construct() {
        parent::__construct(
            'custom_recent_posts_widget',
            'Кастомные последние записи',
            array( 'description' => 'Виджет для отображения списка последних записей по категориям' )
        );
    }

    public function widget( $args, $instance ) {
        // Код отображения виджета
    }

    public function form( $instance ) {
        // Код настройки виджета
    }

    public function update( $new_instance, $old_instance ) {
        // Код сохранения настроек виджета
    }
}

function register_custom_recent_posts_widget() {
    register_widget( 'Custom_Recent_Posts_Widget' );
}
add_action( 'widgets_init', 'register_custom_recent_posts_widget' );

Мне не хватает знаний и опыта, чтобы закончить создание виджета. Как я могу доработать этот код, чтобы он отображал список последних записей по категориям в WordPress?

Ответы:

nikadoktor35 06.03.2023 15:21

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

Для начала, вам потребуется добавить настройки для выбора категорий в форму виджета. В методе form() вы можете использовать функцию get_categories() для получения списка категорий:


public function form( $instance ) {
    $categories = get_categories();
    
    // Вывод списка категорий в форме виджета
    echo '<p>';
    echo '<label for="' . $this->get_field_id( 'categories' ) . '">Выберите категории:</label>';
    echo '<select multiple="multiple" name="' . $this->get_field_name( 'categories' ) . '[]" id="' . $this->get_field_id( 'categories' ) . '">';
    
    foreach ( $categories as $category ) {
        echo '<option value="' . $category->term_id . '" ' . ( in_array( $category->term_id, $instance['categories'] ) ? 'selected' : '' ) . '>' . $category->name . '</option>';
    }
    
    echo '</select>';
    echo '</p>';
}

В этом коде мы используем функцию get_categories(), чтобы получить список категорий, и затем выводим их в виде выпадающего списка (select). Если выбранная категория есть в массиве $instance['categories'], она будет отмечена как выбранная.

Теперь мы должны обновить метод update(), чтобы сохранять выбранные категории:


public function update( $new_instance, $old_instance ) {
    $instance = $old_instance;
    $instance['categories'] = ( ! empty( $new_instance['categories'] ) ) ? $new_instance['categories'] : array();
    return $instance;
}

Теперь, когда у нас есть выбранные категории, мы можем использовать их в методе widget(), чтобы отобразить список последних записей по этим категориям:


public function widget( $args, $instance ) {
    // Получаем выбранные категории из настроек виджета
    $categories = $instance['categories'];
    
    // Параметры запроса для получения последних записей
    $query_args = array(
        'posts_per_page' => 5, // Количество записей для отображения
        'category__in'    => $categories, // Выбранные категории
    );
    
    // Выполняем запрос
    $recent_posts = new WP_Query( $query_args );
    
    // Выводим список последних записей
    if ( $recent_posts->have_posts() ) {
        echo '<ul>';
        
        while ( $recent_posts->have_posts() ) {
            $recent_posts->the_post();
            echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
        }
        
        echo '</ul>';
        
        // Сбрасываем запрос
        wp_reset_postdata();
    } else {
        echo 'Нет записей для отображения';
    }
}

В этом коде мы используем класс WP_Query для выполнения запроса на получение последних записей. Мы передаем выбранные категории в параметре category__in и устанавливаем количество записей для отображения в параметре posts_per_page. Затем мы выводим список последних записей с помощью цикла while. Не забудьте сбросить запрос с помощью функции wp_reset_postdata().

Теперь ваш кастомный виджет должен отображать список последних записей по выбранным категориям. Можете протестировать его на вашем сайте WordPress.

Надеюсь, это помогло вам разобраться, как доработать ваш код кастомного виджета. Удачи в работе с WordPress!

svetlana32 06.03.2023 15:36
Рекомендую использовать функцию `get_categories()` для получения списка категорий и функцию `get_posts()` с параметром `cat` для получения последних записей в каждой категории.
ilonatarasova24 06.03.2023 15:47

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


class Custom_Recent_Posts_Widget extends WP_Widget {

    public function __construct() {
        parent::__construct(
            'custom_recent_posts_widget',
            'Кастомные последние записи',
            array( 'description' => 'Виджет для отображения списка последних записей по категориям' )
        );
    }

    public function widget( $args, $instance ) {
        $title = apply_filters( 'widget_title', $instance['title'] ); // Получаем заголовок виджета из настроек

        echo $args['before_widget'];
        
        if ( ! empty( $title ) ) {
            echo $args['before_title'] . $title . $args['after_title'];
        }
        
        $recent_posts = wp_get_recent_posts( array( 'numberposts' => $instance['numberposts'], 'post_status' => 'publish' ) ); // Получаем последние записи
        
        foreach( $recent_posts as $post ) {
            $categories = get_the_category( $post['ID'] ); // Получаем категории записи
            $category_names = array();

            foreach( $categories as $category ) {
                $category_names[] = $category->name;
            }
            
            echo '<h4>' . implode( ', ', $category_names ) . '</h4>'; // Выводим название категорий
            
            echo '<p><a href="' . get_permalink( $post['ID'] ) . '">' . $post['post_title'] . '</a></p>'; // Выводим название записи и ссылку на нее
        }
        
        echo $args['after_widget'];
    }

    public function form( $instance ) {
        $title = ! empty( $instance['title'] ) ? $instance['title'] : ''; // Получаем заголовок виджета из настроек
        $numberposts = ! empty( $instance['numberposts'] ) ? $instance['numberposts'] : 5; // Получаем количество отображаемых записей из настроек
        ?>

        <p>
            <label for="get_field_id( 'title' ) ); ?>">Заголовок:</label>
            <input class="widefat" id="get_field_id( 'title' ) ); ?>" name="get_field_name( 'title' ) ); ?>" type="text" value="">
        </p>

        <p>
            <label for="get_field_id( 'numberposts' ) ); ?>">Количество записей:</label>
            <input class="widefat" id="get_field_id( 'numberposts' ) ); ?>" name="get_field_name( 'numberposts' ) ); ?>" type="number" min="1" max="10" value="">
        </p>
        <?php
    }

    public function update( $new_instance, $old_instance ) {
        $instance = array();
        $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? sanitize_text_field( $new_instance['title'] ) : ''; // Сохраняем заголовок виджета
        $instance['numberposts'] = ( ! empty( $new_instance['numberposts'] ) ) ? absint( $new_instance['numberposts'] ) : 5; // Сохраняем количество отображаемых записей

        return $instance;
    }
}

function register_custom_recent_posts_widget() {
    register_widget( 'Custom_Recent_Posts_Widget' );
}
add_action( 'widgets_init', 'register_custom_recent_posts_widget' );

В этом примере мы добавили функцию `widget()`, которая отображает виджет на сайте. Внутри этой функции мы получаем заголовок виджета и количество отображаемых записей из настроек. Затем мы используем функцию `wp_get_recent_posts()` для получения последних записей и функцию `get_the_category()` для получения категорий каждой записи. Наконец, мы выводим название категорий и ссылки на записи в HTML.

Функция `form()` отображает настройки виджета в админке. Здесь мы добавили поля для заголовка и количества отображаемых записей.

Функция `update()` сохраняет настройки виджета при их изменении. Здесь мы проверяем и очищаем данные, введенные пользователем, сохраняем их в массив и возвращаем этот массив.

Теперь вы можете использовать этот кастомный виджет в своей теме WordPress. Просто перейдите в раздел "Внешний вид" - "Виджеты", найдите "Кастомные последние записи" и добавьте его на нужную вам область виджетов.

Надеюсь, это поможет вам создать нужный виджет! Удачи!


Добавить ответ