Точка "." в значении опции вызывает проблемы при сохранении настроек

24 нояб. 2010 г., 00:27:17
Просмотры: 209
Голосов: 0

Ниже приведена процедура сохранения настроек моей темы. Я обнаружил, что если $value['id'], передаваемый из массива опций, содержит точку, данные не передаются, и настройки перестают работать на этом месте. Стоит ли мне выбрать другой символ или есть обходное решение для использования точки в имени опции?

Например, это работает нормально:

 "id" => "myTheme_color|sidebar",

но это не работает (значение не передается):

 "id" => "myTheme_color.sidebar",

Функция сохранения:

function mytheme_add_admin(){
global $themename, $shortname, $options; 
if ( $_GET['page'] == basename(__FILE__) )
{
    if ( 'save' == $_REQUEST['action'] ) 
    {
        foreach ($options as $value) 
        {
            update_option( $value['id'], stripslashes($_REQUEST[$value['id']]) ); 
        }
        foreach ($options as $value) 
        {
            if( isset( $_REQUEST[ $value['id'] ] ) ) 
            {
                update_option( $value['id'], stripslashes($_REQUEST[ $value['id'] ])  ); 
            echo $value['id'].": ".$_REQUEST[$value['id']]."<br>";
            echo $value['id'].": ".stripslashes($_REQUEST[$value['id']])."<br>";
            } 
        }
    }
}
2
Комментарии

Вы делаете одно и то же дважды (2xforeach), и предыдущий вариант может просто перезаписать опцию, если она не установлена в $_REQUEST. Возможно, в этом проблема?

hakre hakre
24 нояб. 2010 г. 01:13:17

Не уверен, почему это там было, но я убрал это, и это не помогло. Оказывается, нельзя использовать точки в именах опций при использовании цикла for для массива опций во время сохранения.

Scott B Scott B
26 нояб. 2010 г. 06:10:02
Все ответы на вопрос 2
0

Точки и пробелы в индексах массивов через POST и GET заменяются PHP. Это может быть причиной вашей проблемы.

26 нояб. 2010 г. 22:02:26
1

Я не уверен, в чем именно проблема, этот тестовый код у меня работает нормально:

$options = array( 'test_option' => array('id' => 'myTheme_color.sidebar') );
$test = 'test';
var_dump($options);
foreach ($options as $value) {
    var_dump($value['id']);
    update_option( $value['id'], $test );
}

Если бегло взглянуть на исходный код, наиболее вероятная причина, по которой update_option может завершиться неудачей - это ошибка SQL-запроса при вставке данных.

Мои рекомендации: выполнить $wpdb->print_error() после операции для проверки на ошибки запроса и подключиться к действиям update_option_{$option} и updated_option, чтобы проверить их срабатывание (источник).

26 нояб. 2010 г. 09:20:26
Комментарии

И если вы этого не сделали, добавьте `define('WP_DEBUG', TRUE);` на тестовом стенде. Это может выявить больше информации, включая данные от $wpdb.

hakre hakre
26 нояб. 2010 г. 13:32:32