Actualizando meta de posts personalizados con AJAX

29 jul 2013, 02:58:57
Vistas: 18.6K
Votos: 7

Esta función AJAX se ejecuta al hacer clic:

$.ajax({
            url: 'site/ajax.php',
            data: {id: $('section#single article input:last-of-type').attr('value'), cote: 'like'}
        }).done(function(html) {}

Pasa el ID del post (que está contenido en un input oculto) para la función get_post_meta() que se encuentra en ajax.php. Así es como se ve AJAX.php:

$cote = get_post_meta($_GET['id'], 'cote', true);
if($_GET['cote'] == 'like') {
    $newCote = $cote++;
    update_post_meta($_GET['id'], 'cote', $newCote);
} else {
    $newCote = $cote--;
    update_post_meta($_GET['id'], 'cote', $newCote);
}

Se supone que debe actualizar el campo "cote" del post personalizado, pero el problema es que la función get_post_meta() no está definida en ajax.php. Este es el mensaje de error:

Fatal error: Call to undefined function get_post_meta() in /home2/electro/public_html/beta... on line 2
0
Todas las respuestas a la pregunta 1
3
10

Si cargas un archivo directamente, ninguna de las funciones de WordPress funcionará. Es por eso que casi siempre deberías usar la API AJAX. La API AJAX soluciona este problema. Todo se carga en el contexto de WordPress.

Envuelves tu PHP de procesamiento en una función:

function my_ajax_cb_wpse_108143() {
    $cote = get_post_meta($_POST['id'], 'cote', true);
    if($_POST['cote'] == 'like') {
        $newCote = $cote++;
        update_post_meta($_POST['id'], 'cote', $newCote);
    } else {
        $newCote = $cote--;
        update_post_meta($_POST['id'], 'cote', $newCote);
    }
}

Conecta eso al sistema AJAX:

add_action('wp_ajax_my_update_pm', 'my_ajax_cb_wpse_108143');
add_action('wp_ajax_nopriv_my_update_pm', 'my_ajax_cb_wpse_108143');

Envía tu solicitud a http://site/wp-admin/admin-ajax.php y pasa my_update_pm como argumento cuando Javascript haga una petición.

var data = {
    action: 'my_update_pm',
    id: jQuery('section#single article input:last-of-type').attr('value'), 
            cote: 'like'
};
jQuery.post(ajax_url, data, function(response) {
    // lo que necesites hacer; quizás nada
});

Puedes configurar ajax_url de manera similar a esto del Codex:

add_action( 'admin_enqueue_scripts', 'my_enqueue' );
function my_enqueue($hook) {
    if( 'index.php' != $hook ) return;  // Solo aplica al panel de dashboard
    wp_enqueue_script( 'ajax-script', plugins_url( '/js/my_query.js', __FILE__ ), array('jquery'));
    // en javascript, las propiedades del objeto se acceden como ajax_object.ajax_url, ajax_object.we_value
    wp_localize_script( 'ajax-script', 'ajax_object',
            array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'we_value' => $email_nonce ) );
}
29 jul 2013 03:20:19
Comentarios

¡Gracias! ¿Puedes explicar esto por favor: Envía tu solicitud a http://site/wp-admin/admin-ajax.php y pasa my_update_pm como argumento cuando Javascript haga la solicitud. -- ¿Qué es admin-ajax.php?

User User
29 jul 2013 14:28:44

¿Es como un endpoint para la API?

User User
29 jul 2013 14:29:42

admin-ajax.php es un archivo utilizado por el sistema AJAX del núcleo de WordPress. Todas las solicitudes de la API AJAX deben enviarse a esa dirección.

s_ha_dum s_ha_dum
29 jul 2013 16:57:21