PhP_Raz
@PhP_Raz
Web - developer

Создание виджета Wordpress — как сделать?

Здравствуйте!
Хочу добавить новые виджеты к уже имеющимя в WP виджетам.
Нужно два виджета:
  1. Виджет для вывода последних постов с миниатюрой и цитатой поста;
  2. Виджет для вывода небольшой новости с картинкой.

Решил создать эти виджеты на основе имеющихся в WP виджетов, это виджеты вывода последних постов и текстовый виджет. Получилось сделать так, что бы виджет последних постов выводил не только название постов, но и их миниатюры и цитату. Хочу сделать так, что бы пользователь сам мог задать длину цитаты. Получилось создать текстовое поле с значением длины цитаты по умолчание. Так вот, проблема заключается в том что когда я ввожу другое число, отличное от числа которое стоит по умолчанию, то оно меняется, но когда я пытаюсь сохранить внесенные изменения, то цифра опять становиться по умолчанию.
Вот внешний вид виджета на сайте и в админке:
ea98045a2aa840c1b09dee159dd3ed0f.jpgd0d19ad3f99349e2a79a84f0514c9758.jpg
Вот код виджета:
<?php
 
class My_Recent_Posts extends WP_Widget {
 
    public function __construct() {
        $widget_ops = array(
            'description' => "Последние записи с миниатюрой и цитатой."
        );
        parent::__construct( 'recent-posts', 'Последние записи с миниатюрой', $widget_ops );
        $this->alt_option_name = 'widget_recent_entries';
    }
 
    // Отоброжение виджета на сайте
    public 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 );
 
        $number = (!empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5;
        if ( !$number )
            $number = 5;
        $show_date = isset( $instance['show_date'] ) ? $instance['show_date'] : false;
        // Длина поста
        $post_length = (!empty( $instance['post_length'] ) ) ? absint( $instance['post_length'] ) : 200;
 
        // Выбор последних постов
        $r = new WP_Query( apply_filters( 'widget_posts_args', array(
                    'posts_per_page' => $number,
                    'no_found_rows' => true,
                    'post_status' => 'publish',
                    'ignore_sticky_posts' => true
                ) ) );
 
        if ( $r->have_posts() ) :
            ?>
            <?php echo $args['before_widget']; ?>
            <?php
            if ( $title ) {
                echo $args['before_title'] . $title . $args['after_title'];
            }
            ?>
            <ul class="divided">
                <?php while ( $r->have_posts() ) : $r->the_post(); ?>
                    <li>
                        <article class="box highlight">
                            <header>
                                <h3><a href="<?php the_permalink(); ?>"><?php get_the_title() ? the_title() : the_ID(); ?></a></h3>
                                <a href="<?php the_permalink(); ?>" class="image left"><?php the_post_thumbnail( 'strongly-min' ); ?></a>
                                <p><?php
                                    // Вывод поста
                                    echo mb_substr( strip_tags( get_the_content() ), 0, $post_length );
                                    ?>
                                </p>
                                <?php if ( $show_date ) : ?>
                                    <span class="post-date"><?php echo get_the_date(); ?></span>
                <?php endif; ?>
                                <ul class="actions">
                                    <li><a href="<?php the_permalink(); ?>" class="button icon fa-file">Читать далее...</a></li>
                                </ul>
 
                        </article>
                    </li>
            <?php endwhile; ?>
            </ul>
            <?php echo $args['after_widget']; ?>
            <?php
            // Reset the global $the_post as this query will have stomped on it
            wp_reset_postdata();
 
        endif;
    }
 
    // Обновление данных
    public function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance['title'] = sanitize_text_field( $new_instance['title'] );
        $instance['number'] = (int) $new_instance['number'];
        // Обновление значения длины поста
        $instance['post_length'] = (int) $new_instance['post_length'];
        $instance['show_date'] = isset( $new_instance['show_date'] ) ? (bool) $new_instance['show_date'] : false;
        return $instance;
    }
 
    // Отображение виджета в админке
    public function form( $instance ) {
        $title = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
        $number = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5;
        $post_length = isset( $instance['post_length'] ) ? absint( $instance['post_length'] ) : 200;
        $show_date = isset( $instance['show_date'] ) ? (bool) $instance['show_date'] : false;
        ?>
        <p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
            <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" /></p>
 
        <p><label for="<?php echo $this->get_field_id( 'number' ); ?>"><?php _e( 'Number of posts to show:' ); ?></label>
            <input class="tiny-text" id="<?php echo $this->get_field_id( 'number' ); ?>" name="<?php echo $this->get_field_name( 'number' ); ?>" type="number" step="1" min="1" value="<?php echo $number; ?>" size="3" /></p>
 
        <p><input class="checkbox" type="checkbox"<?php checked( $show_date ); ?> id="<?php echo $this->get_field_id( 'show_date' ); ?>" name="<?php echo $this->get_field_name( 'show_date' ); ?>" />
            <label for="<?php echo $this->get_field_id( 'show_date' ); ?>"><?php _e( 'Display post date?' ); ?></label></p>
 
        <!--Текстовое поле для ввода длины поста-->
        <p><label for="<?php echo $this->get_field_id( 'post_length' ); ?>"><?php _e( 'Длина поста:' ); ?></label>
            <input class="" id="<?php echo $this->get_field_id( 'post_length' ); ?>" name="<?php echo $this->get_field_name( 'post_length' ); ?>" type="number" step="1" min="1" value="<?php echo $post_length; ?>" size="3" /></p>
        <?php
    }
 
}
 
function top_posts_widget() {
    register_widget( 'My_Recent_Posts' );
}
 
add_action( 'widgets_init', 'top_posts_widget' );

Как быть и что делать? В чем ошибка? Подскажите пожалуйста.

На счет второго виджета.
Как добавить к текстовому виджету кнопку, которая будет открывать окошко выбора медиафайла из библиотеки WP? Хочу добавлять небольшие новости/заметки с картинкой. На сайте что бы выводилось почти также как и последние записи с миниатюрой и цитатой, только без кнопки "Читать далее..."
  • Вопрос задан
  • 513 просмотров
Пригласить эксперта
Ответы на вопрос 1
@sl1m_dogg
ну код конечно плохо читаем, но как увидел хтмл там не в тему в пхп коде, может в переменную писать или <
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы