Postare nu se încarcă prin ajax
Am preluat un site WordPress 3.2.1 care folosește prettyPhoto pentru a încărca conținut prin ajax. Acest lucru funcționa înainte să activez permalink-urile pe site. Pluginul Custom Post Type UI este instalat. Pot accesa tipul meu de postare personalizată la mysite.com/story/numele-povestii dar încărcarea prin ajax rezultă într-o eroare 404.
Linkurile care declanșează codul $.get din prettyPhoto arată astfel:
<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>
Dacă schimb setările permalink-urilor înapoi la 'implicit', conținutul postării se încarcă în fereastra popup. URL-urile apelate prin XHR când funcționează arată astfel:
http://mysite.com/?story=numele-povestii&ajax=true&count=37
Am încercat să elimin toți parametrii din query de la URL-urile permalink dar această soluție nu a funcționat. Are cineva vreo idee despre ce ar putea fi problema?

Toate cererile Ajax ar trebui să fie direcționate prin fișierul util /wp-admin/admin-ajax.php
.
Acesta funcționează cu minunatul sistem de hook-uri din WordPress. Astfel, trimiteți o "acțiune" (action) cu cererea și utilizați aceasta ca parte a acțiunii în care vă conectați funcția.
Să presupunem că apelul vostru Ajax arată astfel (cu jQuery):
jQuery('a.ajax').click(function(e){
data = {
'action': 'wpse31321_action',
'story': 1 // ID-urile sunt mai ușor de gestionat...
}
jQuery.get(
'http://www.yoursite.com/wp-admin/admin-ajax.php',
data,
function(resp){
// procesați răspunsul.
}
);
e.preventDefault();
});
Apoi, în fișierul functions.php sau într-un plugin, trebuie să vă conectați la wp_ajax_wpse31321_action
și wp_ajax_nopriv_wpse31321_action
. Aceasta este partea care face treaba: aveți acces la întregul API WordPress în funcția conectată. Puteți obține postări sau orice altceva.
wp_ajax_[some_action]
este pentru utilizatorii autentificați. wp_ajax_nopriv_[some_action]
este pentru toți ceilalți. [some_action]
este, desigur, acțiunea pe care o trimiteți împreună cu cererea. În exemplul nostru, wpse31321_action
.
<?php
add_action( 'wp_ajax_wpse31321_action', 'wpse31321_ajax' );
add_action( 'wp_ajax_nopriv_wpse31321_action', 'wpse31321_ajax' );
function wpse31321_ajax()
{
// aici aveți acces la $_REQUEST, $_POST și $_GET...
if( isset ( $_REQUEST['story'] ) )
{
$story = get_post( (int) $_REQUEST['story'] );
if( ! $story ) die( '-1' );
echo $story->post_content;
die(); // Întotdeauna opriți scriptul după afișarea conținutului necesar.
}
else
{
die( '-1' );
}
}
Puteți face orice doriți pentru a manipula datele înainte de a le afișa. Exemplul de mai sus este foarte simplist, fără prea multă verificare a erorilor sau securitate integrată. Dar ar trebui să vă ofere un punct de plecare.
Lecturi suplimentare:

Mulțumesc pentru răspunsul detaliat. Totuși, ceea ce mă interesează cu adevărat este de ce apelul ajax funcționează cu permalink-urile dezactivate și nu atunci când sunt activate?

Ar trebui să vedem mai mult din codul tău pentru a răspunde la această întrebare (ce fac toți acei parametri din URL? Unde se află acel cod?). Dar bănuiesc că este pentru că trebuie să obții permalink-ul real cu șirul de interogare atașat (de ex. http://www.yoursite.com/story/story-slug/?para1=value1¶m2=value2
, etc).
