Guardando opciones de api de wordpress con ajax,

He estado luchando con este problema desde hace bastante tiempo. Tengo una página de opciones para un tema y una sola opción registrada.

He estado tratando de actualizar la opción a través de ajax cada vez que un usuario presiona el botón Guardar, aquí está mi código.

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(); 

El 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' ); 

La respuesta que veo en Firebug es 0. No estoy seguro de lo que me falta aquí, lo he intentado con algunas variaciones, pero nada parece funcionar.

Encontré una manera de guardar la configuración a través de ajax al usar la API de configuración.

El principal error que cometí en mi código es que usé la ruta url incorrecta.

En lugar de usar el ajaxurl estándar, que es lo que usualmente usaría al hacer llamadas ajax en wordpress; Usamos la llamada de acción de su configuración de forma de api, que es options.php .

Debido a que usamos esta ruta url, no es necesario que la función php maneje la solicitud, ya que options.php maneja todo esto por nosotros.

Por lo tanto, solo necesitamos manejar la función js que se ve así en mi caso.

  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(); 

Eso es todo, después de guardar recibí la alerta de éxito y mis opciones se guardaron.

Nota: Solo hay una peculiaridad que noté. Después de finalizar la solicitud POST y mostrar la alerta de éxito, la página realiza una solicitud GET para obtener una versión de la página de opciones que tenga los parámetros &settings-updated=true agregados al final de la URL.

No sé si esto es algo de qué preocuparse, no he encontrado ningún problema, pero podría ser algo a considerar a largo plazo.

Intente cambiar el valor de acción de wp_ajax_main_options_save a main_options_save . WordPress agrega el prefijo wp_ajax_ a su valor de acción automáticamente como wp_ajax_{your_posted_action} .

Lea 5 consejos excelentes aquí para conocer las mejores prácticas adicionales.