Actualizarea metadatelor personalizate ale postărilor cu AJAX

29 iul. 2013, 02:58:57
Vizualizări: 18.6K
Voturi: 7

Această funcție AJAX este apelată la click:

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

Transmite ID-ul postării (conținut într-un input hidden) către funcția get_post_meta() care se află în ajax.php. Iată cum arată 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);
}

Ar trebui să actualizeze câmpul "cote" al postării personalizate, dar problema este că funcția get_post_meta() este nedefinită în ajax.php. Acesta este mesajul de eroare:

Fatal error: Call to undefined function get_post_meta() in /home2/electro/public_html/beta... on line 2
0
Toate răspunsurile la întrebare 1
3
10

Dacă încarci un fișier direct, niciuna dintre funcțiile WordPress nu va funcționa. De aceea, aproape întotdeauna ar trebui să folosești API-ul AJAX. API-ul AJAX rezolvă această problemă. Totul se încarcă în contextul WordPress.

Ai putea înfășura codul PHP de procesare într-o funcție:

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

Conectează această funcție la sistemul 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');

Trimite cererea către http://site/wp-admin/admin-ajax.php și transmite my_update_pm ca argument atunci când JavaScript face o cerere.

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) {
    // orice ai nevoie să faci; poate nimic
});

Poți seta ajax_url similar cu acest exemplu din Codex:

add_action( 'admin_enqueue_scripts', 'my_enqueue' );
function my_enqueue($hook) {
    if( 'index.php' != $hook ) return;  // Se aplică doar panoului de control
    wp_enqueue_script( 'ajax-script', plugins_url( '/js/my_query.js', __FILE__ ), array('jquery'));
    // în JavaScript, proprietățile obiectului sunt accesate ca 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 iul. 2013 03:20:19
Comentarii

Mulțumesc! Poți să explici acest lucru, te rog: Trimiteți cererea la http://site/wp-admin/admin-ajax.php și transmiteți my_update_pm ca argument atunci când JavaScript face o solicitare. -- Ce este admin-ajax.php?

User User
29 iul. 2013 14:28:44

Este ca un punct final pentru API?

User User
29 iul. 2013 14:29:42

admin-ajax.php este un fișier utilizat de sistemul WordPress Core AJAX. Toate cererile AJAX API ar trebui să fie trimise la această adresă.

s_ha_dum s_ha_dum
29 iul. 2013 16:57:21