Страница выбора темы не сохраняет настройки.

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

Я пытаюсь практиковаться в добавлении страницы параметров темы с использованием API настроек, но, к сожалению, код, который я написал в соответствии с кодексом, не работает правильно. Когда я тестировал код, ошибки не возникали, но опция pe_bannar_heading не может быть сохранена. Можете ли вы помочь мне найти, в чем проблема в следующем коде?

    <?php
    /*
    Название плагина: Тестовая страница параметров
    Текстовый домен: test-option-page
    */

    function reg_settings(){
        register_setting('pe_theme_options','pe_theme_options');
        add_settings_section('pe_main_settings','Основные параметры', '', __FILE__);
        add_settings_field('pe_bannar_heading', 'Заголовок баннера:', 'pe_bannar_heading_setting', __FILE__, 'pe_main_settings');
    }

    add_action('admin_init','reg_settings');

    function pe_bannar_heading_setting(){ 

                $options = get_option('pe_theme_options');?>
                <input name="pe_bannar_heading" type="text" value="<?php if(isset($options['pe_bannar_heading'])) echo $options['pe_bannar_heading'] ?>"/>

            <?php }

    function pe_add_menu_page(){
                add_options_page('Параметры темы', 'Параметры темы', 'administrator', __FILE__ , 'display_options_page');
            }

    add_action('admin_menu','pe_add_menu_page');

    function display_options_page(){

                $options = get_option('pe_theme_options');?>
                <div class="wrap">
                    <h2>Параметры жёлтого блога</h2>
                    <form action="options.php" method="post" enctype="multipart/form-data">
                        <?php 
                            settings_fields('pe_theme_options');
                            do_settings_sections(__FILE__);
                            submit_button( 'Сохранить настройки' );
                        ?>
                    </form>
                </div>  
    <?php   }

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

<?php
/*
Название плагина: Тестовая страница параметров
Текстовый домен: test-option-page
*/

function reg_settings(){
    register_setting('pe_theme_options','pe_theme_options_item');
    add_settings_section('pe_main_settings','Основные параметры', '', __FILE__);
    add_settings_field('pe_bannar_heading', 'Заголовок баннера:', 'pe_bannar_heading_setting', __FILE__, 'pe_main_settings');
}

add_action('admin_init','reg_settings');

function pe_bannar_heading_setting() { 
    $options = get_option('pe_theme_options_array'); ?>
    <input id="pe_theme_options_item" name="pe_theme_options_item" type="text" value="<?php if ( isset( $options['pe_bannar_heading'] ) ) { echo $options['pe_bannar_heading']; } ?>"/>
    <?php 
}

function pe_add_menu_page(){
    add_options_page('Параметры темы', 'Параметры темы', 'administrator', __FILE__ , 'display_options_page');
}

add_action('admin_menu','pe_add_menu_page');

function display_options_page() {
    $options = get_option('pe_theme_options_array');?>
    <div class="wrap">
        <h2>Параметры жёлтого блога</h2>
        <form action="options.php" method="post" enctype="multipart/form-data">
            <?php 
            settings_fields('pe_theme_options');
            do_settings_sections(__FILE__);
            submit_button( 'Сохранить настройки', 'primary', 'pe_new_option' );
            ?>
        </form>
    </div>  
<?php }

add_action( 'admin_init', 'pe_save_settings' );

function pe_save_settings() {
    if ( isset( $_POST['pe_new_option'] ) ) {
        $new_value = trim( $_POST[ 'pe_theme_options_item'] );
        $options_array = get_option('pe_theme_options_array');
        $options_array['pe_bannar_heading'] = $new_value;
        update_option( 'pe_theme_options_array', $options_array );
    }
}

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

Проблема с сохранением параметров на странице настроек темы WordPress

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

Анализ и решение

1. Регистрация настройки и полей:

Для начала необходимо убедиться, что вы правильно регистрируете настройки и поля. В вашем первоначальном коде возникло несоответствие в именовании. Вместо pe_theme_options следует использовать уникальное имя для массива параметров:

register_setting('pe_theme_options_group', 'pe_theme_options');

Также следует убедиться, что в функции add_settings_field указано правильное хранилище параметров:

add_settings_field('pe_bannar_heading', 'Bannar Heading:', 'pe_bannar_heading_setting', 'pe_theme_options_group', 'pe_main_settings');

2. Вывод поля ввода:

В функции pe_bannar_heading_setting необходимо убедиться, что вы правильно выводите значение поля для сохранения:

$options = get_option('pe_theme_options');
?>
<input id="pe_bannar_heading" name="pe_theme_options[pe_bannar_heading]" type="text" value="<?php echo isset($options['pe_bannar_heading']) ? esc_attr($options['pe_bannar_heading']) : ''; ?>" />
<?php

Здесь вы используете esc_attr для экранирования выходного значения, что увеличивает безопасность.

3. Обработка формирования страницы настроек:

В функции display_options_page вы правильно вызываете settings_fields и do_settings_sections, однако важно указывать правильную группу настроек:

settings_fields('pe_theme_options_group');
do_settings_sections('pe_theme_options_group');

4. Сохранение данных и использование хуков:

Код для сохранения параметров можно исключить, так как функция register_setting уже автоматически обрабатывает сохранение. Убедитесь, что вы передаете правильное имя для обновления опций:

add_action('admin_init', 'reg_settings');

Итоговый код:
Вот полный исправленный код для вашего плагина:

<?php
/*
Plugin Name: Test option page
Text Domain: test-option-page
*/

function reg_settings(){
    register_setting('pe_theme_options_group', 'pe_theme_options');
    add_settings_section('pe_main_settings','Main Settings', '', 'pe_theme_options_group');
    add_settings_field('pe_bannar_heading', 'Bannar Heading:', 'pe_bannar_heading_setting', 'pe_theme_options_group', 'pe_main_settings');
}

add_action('admin_init','reg_settings');

function pe_bannar_heading_setting(){ 
    $options = get_option('pe_theme_options');
    ?>
    <input id="pe_bannar_heading" name="pe_theme_options[pe_bannar_heading]" type="text" value="<?php echo isset($options['pe_bannar_heading']) ? esc_attr($options['pe_bannar_heading']) : ''; ?>" />
    <?php
}

function pe_add_menu_page(){
    add_options_page('Theme Options', 'Theme Options', 'administrator', 'pe_theme_options_page', 'display_options_page');
}

add_action('admin_menu','pe_add_menu_page');

function display_options_page(){
    ?>
    <div class="wrap">
        <h2>Yellow Blog Options</h2>
        <form action="options.php" method="post">
            <?php 
                settings_fields('pe_theme_options_group');
                do_settings_sections('pe_theme_options_group');
                submit_button('Save Settings');
            ?>
        </form>
    </div>  
    <?php
}

Заключение

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

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

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