Intereting Posts
Использование Disqus, как остановить сохранение комментариев в базе данных wp? Как ограничить количество сообщений, которые получает WP_Query? Добавление дополнительных меню в детские темы Genesis Вместо того, чтобы отправлять всю запись, есть ли способ отправить сообщение в виде сообщения или простое сообщение? Устойчивость базы данных пользовательских сообщений. Почему нет? Как я могу создать функцию для получения времени видео YouTube Добавить размер изображения, где генерируется максимально возможный пропорциональный размер Создание собственного короткого кода – переменная echoeing php на основе переменной JS array_rand работает неправильно? Лицензирование плагина Изменение настраиваемого поля с лицевой стороны Создать страницу архива для пользовательских таксономий Как мне указать в бэкэнд всех пользователей, которым была назначена пользовательская роль? Раньше таблица стилей не перекрывалась позже Ошибка в скрипте системного знака Stackoverflow

Не удается получить страницу настроек плагина для сохранения данных

имеют простой плагин, который вставляет текст (объявление Google) частично через содержимое одной записи. Я пытаюсь создать страницу настроек, которая позволит пользователям изменить рекламный код и изменить, после какого абзаца появится объявление.

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

Вот что я имею:

<?php // add plugin options add_option( 'wpa_ad_insert_paragraph', '2' ); add_option( 'wpa_ad_insert_adcode', 'ad code goes here'); // update options update_option( 'wpa_ad_insert_paragraph', $_POST['wpa_ad_insert_paragraph'] ); update_option( 'wpa_ad_insert_adcode', $_POST['wpa_ad_insert_adcode'] ); // Add a menu for our option page add_action('admin_menu', 'wpa_ad_insert_add_page'); function wpa_ad_insert_add_page() { add_options_page( 'Ad Insertion', 'Ad Insertion', 'manage_options', 'wpa_ad_insert', 'wpa_ad_insert_option_page' ); } // Draw the option page function wpa_ad_insert_option_page() { ?> <div class="wrap"> <?php screen_icon(); ?> <h2>Ad Insertion</h2> <form action="options.php" method="post"> <?php settings_fields('wpa_ad_insert_options'); ?> <?php do_settings_sections('wpa_ad_insert'); ?> <input name="Submit" type="submit" value="Save Changes" /> </form> </div> <?php } // Register and define the settings add_action('admin_init', 'wpa_ad_insert_admin_init'); function wpa_ad_insert_admin_init(){ register_setting( 'wpa_ad_insert_options', 'wpa_ad_insert_options', 'wpa_ad_insert_validate_options' ); add_settings_section( 'wpa_ad_insert_main', 'Ad Insertion Settings', 'wpa_ad_insert_section_text', 'wpa_ad_insert' ); add_settings_field( 'wpa_ad_insert_paragraph', 'Ad will appear after paragraph number:', 'wpa_ad_insert_paragraph_setting', 'wpa_ad_insert', 'wpa_ad_insert_main' ); add_settings_field( 'wpa_ad_insert_adcode', 'Ad code:', 'wpa_ad_insert_adcode_setting', 'wpa_ad_insert', 'wpa_ad_insert_main' ); } function wpa_ad_insert_paragraph_setting() { $options = get_option('wpa_ad_insert_paragraph'); $items = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"); echo "<select id='wpa_ad_insert_paragraph' name='plugin_options[wpa_ad_insert_paragraph]'>"; foreach($items as $item) { $selected = ($options['wpa_ad_insert_paragraph']==$item) ? 'selected="selected"' : ''; echo "<option value='$item' $selected>$item</option>"; } echo "</select>"; } function wpa_ad_insert_adcode_setting() { $options = get_option('wpa_ad_insert_adcode'); echo "<textarea id='wpa_ad_insert_adcode' name='plugin_options[wpa_ad_insert_adcode]' rows='7' cols='50' type='textarea'>{$options['wpa_ad_insert_adcode']}</textarea>"; } function wpa_insert_ad($content) { $paragraphAfter = get_option('wpa_ad_insert_paragraph'); $ad = get_option('wpa_ad_insert_adcode'); if( is_single() && is_main_query() ) { $content = explode("</p>", $content); for ($i = 0; $i <count($content); $i++ ) { if ($i == $paragraphAfter) echo $content[$i] . "</p>"; } } return $content; } add_filter('the_content', 'wpa_insert_ad'); ?> 

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

Что мне здесь не хватает?

Solutions Collecting From Web of "Не удается получить страницу настроек плагина для сохранения данных"

Хотя вы используете Settins API, поэтому вам не нужно использовать функции update_option или add_option . API настроек будет обрабатывать это самостоятельно.

Было несколько проблем, поэтому ваш код не работает.

1.

 add_settings_section( 'wpa_ad_insert_main', 'Ad Insertion Settings', 'wpa_ad_insert_section_text', 'wpa_ad_insert' ); 

Третий параметр – это функция обратного вызова. Поскольку вам не нужна эта функция, просто добавьте __return false в качестве обратного вызова. Тогда ваш код для этой функции будет выглядеть так:

 add_settings_section( 'wpa_ad_insert_main', 'Ad Insertion Settings', '__return_false', 'wpa_ad_insert' ); 

2.

 register_setting( 'wpa_ad_insert_options', 'wpa_ad_insert_options', 'wpa_ad_insert_validate_options' ); 

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

 $options = get_option('wpa_ad_insert_paragraph'); $options = get_option('wpa_ad_insert_adcode'); 

Поскольку вы использовали другое имя параметра в функции register_setting , поэтому вам не удалось получить эту опцию в базе данных. Вы должны вызвать функцию get_option с именем параметра, которое вы зарегистрировали с помощью функции register_setting . И это будет выглядеть так:

 $options = get_option('wpa_ad_insert_options'); 

3. Но все же данные не сохраняются в базе данных, не так ли? Потому что вы использовали plugin_options как имя ввода формы и textarea. Поскольку вы используете WordPress Settings API, поэтому вы должны использовать то же имя, которое вы зарегистрировали как option_name в функции register_setting .

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

 register_setting( 'wpa_ad_insert_options', 'plugin_options', 'wpa_ad_insert_validate_options' ); 

Замените функцию add_settings_section следующим образом:

 add_settings_section( 'wpa_ad_insert_main', 'Ad Insertion Settings', '__return_false', 'wpa_ad_insert' ); 

Замените все функции get_option следующим образом: $ options = wpa_options ('plugin_options');

И, наконец, добавьте этот новый код:

 function wpa_options() { $default = array( 'wpa_ad_insert_paragraph' => 1, 'wpa_ad_insert_adcode' => '' ); return get_option('plugin_options', $default); } 

Положил все это вместе:

 // Add a menu for our option page add_action('admin_menu', 'wpa_ad_insert_add_page'); function wpa_ad_insert_add_page() { add_options_page( 'Ad Insertion', 'Ad Insertion', 'manage_options', 'wpa_ad_insert', 'wpa_ad_insert_option_page' ); } // Draw the option page function wpa_ad_insert_option_page() { ?> <div class="wrap"> <?php screen_icon(); ?> <h2>Ad Insertion</h2> <form action="options.php" method="post"> <?php settings_fields('wpa_ad_insert_options'); ?> <?php do_settings_sections('wpa_ad_insert'); ?> <input name="Submit" type="submit" value="Save Changes" /> </form> </div> <?php } // Register and define the settings add_action('admin_init', 'wpa_ad_insert_admin_init'); function wpa_ad_insert_admin_init(){ register_setting( 'wpa_ad_insert_options', 'plugin_options', 'wpa_ad_insert_validate_options' ); add_settings_section( 'wpa_ad_insert_main', 'Ad Insertion Settings', // 'wpa_ad_insert_section_text', '__return_false', 'wpa_ad_insert' ); add_settings_field( 'wpa_ad_insert_paragraph', 'Ad will appear after paragraph number:', 'wpa_ad_insert_paragraph_setting', 'wpa_ad_insert', 'wpa_ad_insert_main' ); add_settings_field( 'wpa_ad_insert_adcode', 'Ad code:', 'wpa_ad_insert_adcode_setting', 'wpa_ad_insert', 'wpa_ad_insert_main' ); } register_setting( 'wpa_ad_insert_options', 'plugin_options', 'wpa_ad_insert_validate_options' ); function wpa_ad_insert_paragraph_setting() { $options = wpa_options('plugin_options'); $items = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"); echo "<select id='wpa_ad_insert_paragraph' name='plugin_options[wpa_ad_insert_paragraph]'>"; foreach($items as $item) { $selected = ($options['wpa_ad_insert_paragraph']==$item) ? 'selected="selected"' : ''; echo "<option value='$item' $selected>$item</option>"; } echo "</select>"; } function wpa_ad_insert_adcode_setting() { $options = wpa_options('plugin_options'); echo "<textarea id='wpa_ad_insert_adcode' name='plugin_options[wpa_ad_insert_adcode]' rows='7' cols='50' type='textarea'>{$options['wpa_ad_insert_adcode']}</textarea>"; } function wpa_insert_ad($content) { $paragraphAfter = get_option('wpa_ad_insert_paragraph'); $ad = get_option('wpa_ad_insert_adcode'); if( is_single() && is_main_query() ) { $content = explode("</p>", $content); for ($i = 0; $i <count($content); $i++ ) { if ($i == $paragraphAfter) echo $content[$i] . "</p>"; } } return $content; } add_filter('the_content', 'wpa_insert_ad'); function wpa_options() { $default = array( 'wpa_ad_insert_paragraph' => 1, 'wpa_ad_insert_adcode' => '' ); return get_option('plugin_options', $default); } 

Я начал все с помощью плагина Plugin Options Starter Kit – http://www.presscoders.com/plugins/plugin-options-starter-kit/ . Это хороший плагин. На самом деле это не плагин, это всего лишь страница настроек плагина со всеми параметрами, которые вы, возможно, захотите использовать, поэтому легко скопировать / вставить / вырезать / настроить, чтобы делать то, что вы хотите. Я до сих пор не знаю, почему мой код выше не работает (кроме того, что версия, вставленная выше, не имеет функции проверки, но добавление этой функции не устраняет проблему), поэтому, если кто-то хочет скажите мне, что еще мне нужно было сделать, чтобы это сработало, я бы с удовольствием узнал.

Проблема заключается в местоположении в коде, в котором вы кодируете обновление.

После отправки формы загружается файл options.php и ваш плагин с ним. В этот момент параметры обновляются из почтовых данных. Затем вы перенаправляетесь обратно на страницу настроек, и ваш код запускается снова, но на этот раз в $_POST нет значений, поэтому ваши параметры заполняются некоторым пустым значением.

Если вы используете API настроек, вы должны оставить обновление для него, и даже если бы ваш код обновления не был

 if (isset($_POST['wpa_ad_insert_paragraph'] )) { pdate_option( 'wpa_ad_insert_paragraph', $_POST['wpa_ad_insert_paragraph'] ); update_option( 'wpa_ad_insert_adcode', $_POST['wpa_ad_insert_adcode'] ); } 

Теперь add_option – это почти псевдоним update_option, если опция существует, он будет вести себя как update_option, и если update_option вызывается, когда опция не существует, опция будет добавлена. Поэтому перед его инициализацией необходимо проверить отсутствие существующего параметра.

 if (!get_option('wpa_ad_insert_paragraph')) { add_option( 'wpa_ad_insert_paragraph', '2' ); add_option( 'wpa_ad_insert_adcode', 'ad code goes here'); } 

get_option возвращает false, когда опция не существует (но вам нужно быть осторожным, если false – это одно из значений, которое может иметь ваш вариант)

Кажется, у вас есть несколько проблем. Первый вопрос заключается в том, что вы должны отделить вывод от логики. В принципе, действие admin_init вы вызываете, вероятно, не выполняется правильно, потому что слишком поздно на временной шкале. См. Этот аналогичный вопрос здесь и ответ: невозможно вывести do_settings_sections. Не могу понять, почему

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

  // Register and define the settings add_action('admin_init', 'wpa_ad_insert_admin_init'); function wpa_ad_insert_admin_init(){ // This will make sure your options are created in the database if( false === get_option( 'wpa_ad_insert_options' ) ) { add_option( 'wpa_ad_insert_options' ); } register_setting( 'wpa_ad_insert_options', 'wpa_ad_insert_options', 'wpa_ad_insert_validate_options' ); ... 

Проверка в начале функции будет гарантировать, что вы создаете параметр для сохранения настроек. Здесь была аналогичная проблема: почему register_setting () не создает параметр?

Как сказал @MarkKaplun в своем ответе, вы также должны удалить материал update_option и позволить WordPress обрабатывать это для вас.

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

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