как получить значение select-бокса в пользовательском виджете WordPress

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

Я пытаюсь создать пользовательский виджет. Мои коды следующие:

class techno_widget extends WP_Widget {

    function __construct() {
    parent::__construct(

    'techno_widget', 

     __('Recent Full Post', 'techno_widget_domain'), 

    array( 'description' => __( 'A full post will be appeared on Sidebar', 'techno_widget_domain' ), ) 
);
}

public function widget( $args, $instance ) {
$title = apply_filters( 'widget_title', $instance['title'] );
$blog-title = $instance['blog-title'];

echo $args['before_widget'];
if ( ! empty( $title ) )
echo $args['before_title'] . $title . $args['after_title'];

echo $instance['blog-title'];                   

echo $args['after_widget'];
}

public function form( $instance ) {
if ( isset( $instance[ 'title' ] ) ) {
$title = $instance[ 'title' ];
}
else {
$title = __( 'New title', 'wpb_widget_domain' );
}

$blog-title = $instance[ 'blog-title' ];

?>
<p>
<label for="<?php echo $this->get_field_id( 'blog-title' ); ?>"><?php  _e( 'Select Title:' ); ?></label> 
<select class="widefat" id="<?php echo $this->get_field_id( 'blog-title' ); ?>" name="<?php echo $this->get_field_name( 'blog-title' ); ?>">

<?php  

                $fullpost = new WP_Query(array(
                    'post_type' => 'post',                      
                ));

if($fullpost->have_posts()): while($fullpost->have_posts()): $fullpost->the_post(); ?>

    <option value="<?php the_title();?>"><?php the_title();?></option>

<?php endwhile; endif;?>

</select>
</p>
<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 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 techno_load_widget() {
register_widget( 'techno_widget' );
}
add_action( 'widgets_init', 'techno_load_widget' );

Теперь WordPress показывает ошибку. Он говорит:

Parse error: syntax error, unexpected ‘=’ in C:\xampp\htdocs\wpexperiment\wp-content\themes\lawyer\functions.php on line 87

Что не так с моим кодом? Как я могу получить значение из моего выпадающего списка?

Вы забыли закрывающую фигурную скобку класса techno_widget, вам нужно вызвать функцию techno_load_widget за пределами класса techno_widget, и вы неверно объявили переменную ‘$blog-title’. Нельзя объявлять переменную с -. Это основное правило PHP. Поэтому я переписал ваш код следующим образом:

class techno_widget extends WP_Widget {

    function __construct() {
        parent::__construct(

            'techno_widget',

            __('Recent Full Post', 'techno_widget_domain'),

            array( 'description' => __( 'A full post will be appeared on Sidebar', 'techno_widget_domain' ), )
        );
    }

    public function widget( $args, $instance ) {
        $title = apply_filters( 'widget_title', $instance['title'] );
        $blog_title = $instance['blog_title'];

        echo $args['before_widget'];
        if ( ! empty( $title ) )
            echo $args['before_title'] . $title . $args['after_title'];

        echo $instance['blog_title'];

        echo $args['after_widget'];
    }

    public function form( $instance ) {
        if ( isset( $instance[ 'title' ] ) ) {
            $title = $instance[ 'title' ];
        }
        else {
            $title = __( 'New title', 'wpb_widget_domain' );
        }

        $blog_title = $instance[ 'blog_title' ];

        ?>
        <p>
            <label for="<?php echo $this->get_field_id( 'blog_title' ); ?>"><?php  _e( 'Select Title:' ); ?></label>
            <select class="widefat" id="<?php echo $this->get_field_id( 'blog_title' ); ?>" name="<?php echo $this->get_field_name( 'blog_title' ); ?>">

                <?php

                $fullpost = new WP_Query(array(
                    'post_type' => 'post',
                ));

                if($fullpost->have_posts()): while($fullpost->have_posts()): $fullpost->the_post(); ?>

                    <option value="<?php the_title();?>"><?php the_title();?></option>

                <?php endwhile; endif;?>

            </select>
        </p>
        <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 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 techno_load_widget() {
    register_widget( 'techno_widget' );
}

add_action( 'widgets_init', 'techno_load_widget' );

И это сработало. Вот скриншот – enter image description here

Теперь вы можете изменить этот код по своему усмотрению. Но я думаю, там, где вы использовали $instance['blog-title'] (в моем коде это $instance['blog_title']), возможно, вы могли бы использовать $instance['title'].

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

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

Создание и настройка виджета в WordPress может быть достаточно сложной задачей, особенно при интеграции пользовательских элементов, таких как выпадающие списки. Проблемы, связанные с получением значения из селект-бокса, часто возникают из-за неправильной работы с массивом $instance или ошибок в синтаксисе PHP. Давайте подробно рассмотрим, как эта задача может быть выполнена на практике, отметив ключевые шаги и распространенные ошибки.

Теория

В контексте виджета WordPress, получение значения из селект-бокса требует правильного обращения с методами класса виджета, таких как widget, form и update.

  1. Конструктор (__construct): Здесь происходит регистрация виджета, настройка его описания и идентификатора.
  2. Метод widget: Отвечает за вывод данных на сайте, основываясь на сохраненных настройках.
  3. Метод form: Создает форму настройки виджета в панели администратора, в которой должно находиться селектор select.
  4. Метод update: Сохраняет изменения, внесенные администратором в настройках виджета.

Ключевым моментом является работа с массивом $instance, который хранит значения настроек виджета.

Пример

Фрагменты кода, представленные в вопросе, демонстрируют попытку интеграции селект-бокса в виджет WordPress. Полный рабочий код выглядит так:

class techno_widget extends WP_Widget {

    function __construct() {
        parent::__construct(
            'techno_widget',
            __('Recent Full Post', 'techno_widget_domain'),
            array('description' => __( 'A full post will be appeared on Sidebar', 'techno_widget_domain' ))
        );
    }

    public function widget($args, $instance) {
        $title = apply_filters('widget_title', $instance['title']);
        $blog_title = $instance['blog_title'];

        echo $args['before_widget'];
        if (!empty($title))
            echo $args['before_title'] . $title . $args['after_title'];

        echo $blog_title;

        echo $args['after_widget'];
    }

    public function form($instance) {
        $title = isset($instance['title']) ? $instance['title'] : __('New title', 'wpb_widget_domain');
        $blog_title = isset($instance['blog_title']) ? $instance['blog_title'] : '';

        ?>
        <p>
            <label for="<?php echo $this->get_field_id('blog_title'); ?>"><?php _e('Select Title:'); ?></label>
            <select class="widefat" id="<?php echo $this->get_field_id('blog_title'); ?>" name="<?php echo $this->get_field_name('blog_title'); ?>">
                <?php
                $fullpost = new WP_Query(array('post_type' => 'post'));
                if($fullpost->have_posts()): 
                    while($fullpost->have_posts()): 
                        $fullpost->the_post();
                ?>
                        <option value="<?php the_title(); ?>"<?php selected($blog_title, get_the_title()); ?>><?php the_title(); ?></option>
                <?php 
                    endwhile; 
                endif;
                ?>
            </select>
        </p>
        <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 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']) : '';
        $instance['blog_title'] = (!empty($new_instance['blog_title'])) ? strip_tags($new_instance['blog_title']) : '';
        return $instance;
    }
}

function techno_load_widget() {
    register_widget('techno_widget');
}

add_action('widgets_init', 'techno_load_widget');

Задачи, которые решает данный код:

  1. Устранение синтаксических ошибок: Код избавлен от "неожиданных" символов и использует правильные переменные, например, $blog_title вместо $blog-title.

  2. Корректное извлечение данных: Метод update сохраняет выбранные значения из селект-бокса, используя конструкцию strip_tags() для очистки данных.

  3. Структура и читаемость: Использование единообразного стиля кодирования повышает читаемость кода.

Применение

При разработке виджетов важно помнить о следующих моментах:

  • Правильная регистрация виджетов и их полей: Используйте методы WordPress API для обеспечения безопасности и надежности.
  • Очистка и проверка входящих данных: Соблюдайте безопасность данных, избегая открытия уязвимостей.
  • Проверка значений при заполнении форм: Применяйте функции selected() или checked() для поддержки функции предварительного заполнения значений.

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

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

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