Как изменить виджет "Свежие записи" в WordPress на "Свежие страницы"?

Как я могу создать новый виджет в WordPress, который будет отображать свежие страницы, аналогично виджету "Свежие записи"? Какие изменения мне нужно внести в коде для достижения этого?
  • 26 декабря 2023 г. 21:37
Ответы на вопрос 2
Чтобы изменить виджет "Свежие записи" на "Свежие страницы" в WordPress, вам потребуется следовать следующим шагам:

1. Откройте файл `functions.php` вашей темы для редактирования.
2. Добавьте следующий код в файл `functions.php`:

```php
function custom_recent_pages_widget() {
    register_widget( 'WP_Widget_Recent_Pages_Custom' );
}
add_action( 'widgets_init', 'custom_recent_pages_widget' );

class WP_Widget_Recent_Pages_Custom extends WP_Widget {

    function __construct() {
        $widget_ops = array(
            'classname' => 'widget_recent_pages_custom',
            'description' => __( 'Свежие страницы' ),
            'customize_selective_refresh' => true,
        );
        parent::__construct( 'recent-pages-custom', __( 'Свежие страницы' ), $widget_ops );
    }

    /**
     * Функция отображения виджета
     *
     * @param array $args     Опции виджета.
     * @param array $instance Экземпляр виджета.
     */
    function widget( $args, $instance ) {
        if ( ! isset( $args['widget_id'] ) ) {
            $args['widget_id'] = $this->id;
        }

        $title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Свежие страницы' );

        /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
        $title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

        echo $args['before_widget'];
        if ( $title ) {
            echo $args['before_title'] . $title . $args['after_title'];
        }

        $number = ! empty( $instance['number'] ) ? absint( $instance['number'] ) : 5;
        if ( ! $number ) {
            $number = 5;
        }
        $r = new WP_Query(
            apply_filters(
                'widget_posts_args',
                array(
                    'posts_per_page' => $number,
                    'post_status'    => 'publish',
                    'no_found_rows'  => true,
                    'post_type'      => 'page',
                    'orderby'        => 'post_date',
                    'order'          => 'DESC',
                ),
                $instance
            )
        );
        if ( $r->have_posts() ) :
            ?>
            <ul>
            <?php while ( $r->have_posts() ) : $r->the_post(); ?>
                <li><a href="<?php the_permalink(); ?>"><?php get_the_title() ? the_title() : the_ID(); ?></a></li>
            <?php endwhile; ?>
            </ul>
            <?php
            endif;
            wp_reset_postdata();

        echo $args['after_widget'];
    }

    /**
     * Обновление настроек виджета.
     *
     * @param array $new_instance Новые настройки.
     * @param array $old_instance Предыдущие настройки.
     *
     * @return array Возвращаемые настройки виджета.
     */
    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance['title']  = sanitize_text_field( $new_instance['title'] );
        $instance['number'] = (int) $new_instance['number'];
        if ( $instance['number'] < 1 || 30 < $instance['number'] ) {
            $instance['number'] = 5;
        }
        return $instance;
    }

    /**
     * Вывод формы настроек виджета.
     *
     * @param array $instance Текущие настройки виджета.
     */
    function form( $instance ) {
        $title  = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
        $number = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5;
        ?>
        <p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Заголовок:' ); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text
post type в wp query добавить и заголовок изменить
Похожие вопросы