Aggiornare i meta dei custom post con AJAX

29 lug 2013, 02:58:57
Visualizzazioni: 18.6K
Voti: 7

Questa funzione AJAX viene chiamata al click:

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

Passa l'ID del post (contenuto in un input nascosto) alla funzione get_post_meta() che si trova in ajax.php. Ecco come appare 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);
}

Dovrebbe aggiornare il campo "cote" del custom post, ma il problema è che la funzione get_post_meta() non è definita in ajax.php. Questo è il messaggio di errore:

Fatal error: Call to undefined function get_post_meta() in /home2/electro/public_html/beta... on line 2
0
Tutte le risposte alla domanda 1
3
10

Se carichi un file direttamente, nessuna delle funzioni di WordPress funzionerà. Ecco perché dovresti quasi sempre utilizzare l'API AJAX. L'API AJAX risolve questo problema. Tutto viene caricato nel contesto di WordPress.

Dovresti racchiudere il tuo codice PHP di elaborazione in una funzione:

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

Collega questa funzione 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');

Invia la tua richiesta a http://site/wp-admin/admin-ajax.php e passa my_update_pm come argomento quando Javascript effettua una richiesta.

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) {
    // fai quello che ti serve; forse niente
});

Puoi impostare ajax_url in modo simile a questo esempio dal Codex:

add_action( 'admin_enqueue_scripts', 'my_enqueue' );
function my_enqueue($hook) {
    if( 'index.php' != $hook ) return;  // Si applica solo al pannello di dashboard
    wp_enqueue_script( 'ajax-script', plugins_url( '/js/my_query.js', __FILE__ ), array('jquery'));
    // in javascript, le proprietà degli oggetti sono accessibili come 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 lug 2013 03:20:19
Commenti

Grazie! Puoi spiegarmi questo per favore: Invia la tua richiesta a http://site/wp-admin/admin-ajax.php e passa my_update_pm come argomento quando Javascript effettua una richiesta. -- Cos'è admin-ajax.php?

User User
29 lug 2013 14:28:44

È come un endpoint per l'API?

User User
29 lug 2013 14:29:42

admin-ajax.php è un file utilizzato dal sistema AJAX del WordPress Core. Tutte le richieste API AJAX dovrebbero essere inviate a quell'indirizzo.

s_ha_dum s_ha_dum
29 lug 2013 16:57:21