Il post non si carica via ajax
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?

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:

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?

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¶m2=value2
, ecc.).
