Вопрос по ajax, php, wordpress, options – Сохранение настроек API в WordPress с помощью AJAX,

5

Я уже давно борюсь с этой проблемой. У меня есть страница опций для темы, и зарегистрирован один вариант.

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

JS:

       function save_main_options_ajax() {

        $('.main-options-form').submit( function () { 

            var b       =  $(this).serialize(),
                optdata =  { action : "wp_ajax_main_options_save", data: b };

            $.post( ajaxurl, b, function (response) {
                if (response == 1 ) { alert('sucess'); }
                else { alert(optdata);}
            });
            return false;               
        });
    }
save_main_options_ajax();

Php:

 function main_options_save_ajax() { 

        check_ajax_referer('_wpnonce', '_wpnonce' );

        $data = $_POST;
        unset($data['option_page'], $data['action'], $data['_wpnonce'], $data['_wp_http_referer']);


        if ( update_option('main_options', $data ) )
        { die(1); }
        else { die (0); }           
}
add_action('wp_ajax_main_options_save', 'main_options_save_ajax' );

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

ты пробовалecho '1' а такжеecho '2' вместоdie? Prasenjit Kumar Nag
die является языковой конструкцией, эквивалентнойexit который используетinteger argument в качестве состояния выхода и не печатает это. Prasenjit Kumar Nag
хм, так вы говорите, что использовать die в этом случае бессмысленно? Alex
К сожалению, не знаю, как это произошло, должно быть, не думал прямо, спасибо за указание на это :) Alex
на самом деле, я не знал, что попробую без него, однако примеры подобных реализаций, подобных той, что я пытаюсь сделать здесь, все используют die () в конце. Как этот человек напримерlink  редактировать: я удалил die () из своей функции, но, к сожалению, я все еще столкнулся с ошибкой. Alex

Ваш Ответ

2   ответа
9

API.

Основная ошибка, которую я сделал в своем коде, заключается в том, что я использовал неправильный путь URL.

Вместо того, чтобы использовать стандартajaxurl это то, что вы обычно используете при вызовах ajax в WordPress; мы используем вызов действия вашей формы настройки API, котораяoptions.php.

Поскольку мы используем этот URL-путь, нет необходимости в функции php для обработки запроса, так как options.php обрабатывает все это за нас.

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

 function save_main_options_ajax() {
           $('.main-options-form').submit( function () {
                var b =  $(this).serialize();
                $.post( 'options.php', b ).error( 
                    function() {
                        alert('error');
                    }).success( function() {
                        alert('success');   
                    });
                    return false;    
                });
            }
 save_main_options_ajax();

Вот и все, после сохранения я получил предупреждение об успехе, и мои настройки были сохранены.

Note: Есть только одна особенность, которую я заметил. После окончанияPOST запрос и показывая предупреждение об успехе, страница делаетGET запросить страницу версии вашей страницы параметров, которая имеет параметры&settings-updated=true добавлен в конце URL.

Я не знаю, стоит ли беспокоиться об этом, я не сталкивался с какими-либо проблемами, но это может быть чем-то, что стоит рассмотреть в долгосрочной перспективе.

Привет, спасибо @Alex за информацию. Могу ли я использовать эти функции из файла плагинов? В настоящее время я использую эту функцию, но данные не сохраняются в таблице wp_options
Следует отметить, что по умолчанию WordPress запускает jQuery в бесконфликтном режиме. Поэтому вы должны изменить$ вjQuery
Удалось ли вам заставить его работать без перенаправления, вызванного & amp; settings-updated = true?
Этот код работал для меня, однако он не будет сохранять данные, которые вводятся из полей редактора TinyMCE. Вы знаете, почему это будет?
2

wp_ajax_main_options_save вmain_options_save, Wordpress добавляет префиксwp_ajax_ на ваше значение действия автоматически, какwp_ajax_{your_posted_action}.

Прочитайте 5 отличных советовВот для дополнительных лучших практик.

Похожие вопросы