Il post non si carica via ajax

17 ott 2011, 19:57:11
Visualizzazioni: 2.08K
Voti: 0

Ho ereditato un sito WordPress 3.2.1 che utilizza prettyPhoto per caricare i contenuti via ajax. Questo funzionava prima di abilitare i permalink sul sito. È installato il plugin Custom Post Type UI. Posso navigare verso il mio custom post type all'indirizzo mysite.com/story/nome-della-storia ma il caricamento via ajax restituisce un errore 404.

I link che attivano il codice $.get in prettyPhoto sono così:

<a href="<?php echo get_permalink(); ?>&ajax=true&count=<?php echo $count ?>" rel="story[ajax]"><?php echo wp_get_attachment_image($attachment->ID, array(75, 75));?></a>

Se cambio le impostazioni dei permalink tornando a 'predefinito', il contenuto del post viene caricato nel popup. Gli href chiamati via XHR quando funziona sono così:

http://mysite.com/?story=nome-della-storia&ajax=true&count=37

Ho provato a rimuovere tutti i parametri query dagli URL dei permalink ma questo non ha risolto il problema. Qualcuno può spiegare cosa potrebbe succedere qui?

1
Commenti

Sembra che tu debba approfondire come utilizzare ajax sui siti WordPress. Dai un'occhiata a questo: http://wpajax.com/.

chrisguitarguy chrisguitarguy
17 ott 2011 20:12:15
Tutte le risposte alla domanda 1
3

Tutte le richieste Ajax devono essere instradate attraverso il comodo file /wp-admin/admin-ajax.php.

Funziona con il fantastico sistema di hook di WordPress. Quindi invii un'azione ("action") con la tua richiesta e la usi come parte dell'azione a cui colleghi la tua funzione.

Quindi, supponiamo che la tua chiamata Ajax sia così (con jQuery)

jQuery('a.ajax').click(function(e){
    data = {
        'action': 'wpse31321_action',
        'story': 1 // Gli ID sono più facili da gestire...
    }
    jQuery.get(
        'http://www.yoursite.com/wp-admin/admin-ajax.php',
        data,
        function(resp){
            // fai qualcosa con la risposta.
        }
    );

    e.preventDefault();
});

Poi, nel tuo file functions.php o in un plugin, devi agganciarti a wp_ajax_wpse31321_action e wp_ajax_nopriv_wpse31321_action. Questa è la parte che fa il lavoro: hai accesso all'intera API di WP all'interno della tua funzione agganciata. Puoi ottenere post, ecc.

wp_ajax_[some_action] è per gli utenti loggati. wp_ajax_nopriv_[some_action] è per tutti gli altri. [some_action] è, ovviamente, l'azione che invii con la tua richiesta. wpse31321_action nel nostro esempio.

<?php
add_action( 'wp_ajax_wpse31321_action', 'wpse31321_ajax' );
add_action( 'wp_ajax_nopriv_wpse31321_action', 'wpse31321_ajax' );
function wpse31321_ajax()
{
    // hai accesso a $_REQUEST, $_POST e $_GET qui...
    if( isset ( $_REQUEST['story'] ) )
    {
        $story = get_post( (int) $_REQUEST['story'] );
        if( ! $story ) die( '-1' );
        echo $story->post_content;
        die(); // Termina sempre lo script dopo aver stampato ciò che ti serve.   
    }
    else
    {
        die( '-1' );
    }
}

Puoi fare qualsiasi cosa per manipolare i dati prima di stamparli. Quanto sopra è una risposta molto semplicistica, senza molti controlli di errore o sicurezza. Ma dovrebbe aiutarti a iniziare.

Ulteriori letture:

http://wpajax.com/

http://codex.wordpress.org/AJAX_in_Plugins

http://codex.wordpress.org/AJAX

17 ott 2011 20:35:45
Commenti

Grazie per la tua risposta dettagliata. Tuttavia, quello che mi interessa veramente capire è perché la chiamata ajax funziona con i permalink disattivati e non quando sono abilitati?

codecowboy codecowboy
18 ott 2011 01:21:12

Dovremmo vedere più del tuo codice per rispondere (cosa fanno tutti quei parametri nell'URL? Dove si trova quel codice?). Ma sospetto che sia perché devi ottenere il permalink effettivo con la query string aggiunta (es. http://www.yoursite.com/story/story-slug/?para1=value1&param2=value2, ecc.).

chrisguitarguy chrisguitarguy
18 ott 2011 02:10:22

Il problema era che il vecchio link aveva già il '?' nell'URL ma non era presente nel permalink dopo aver attivato i permalink personalizzati. Grazie!

codecowboy codecowboy
18 ott 2011 11:17:36