Actualizando meta de posts personalizados con AJAX
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

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

¡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?

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.
