La publicación no se carga mediante Ajax
Heredé un sitio con WordPress 3.2.1 que utiliza prettyPhoto para cargar contenido mediante Ajax. Esto funcionaba antes de habilitar los permalinks en el sitio. El plugin Custom Post Type UI está instalado. Puedo navegar a mi tipo de publicación personalizada en mysite.com/historia/nombre-de-historia pero al cargar mediante Ajax obtengo un error 404.
Los enlaces que activan el código $.get en prettyPhoto se ven así:
<a href="<?php echo get_permalink(); ?>&ajax=true&count=<?php echo $count ?>" rel="historia[ajax]"><?php echo wp_get_attachment_image($attachment->ID, array(75, 75));?></a>
Si cambio la configuración de permalinks de vuelta a 'por defecto', el contenido de la publicación se carga en el popup. Los hrefs que se llaman mediante XHR cuando funciona se ven así:
http://misitio.com/?historia=nombre-de-historia&ajax=true&count=37
Intenté eliminar todos los parámetros de consulta de las URLs de los permalinks y esto no resolvió el problema. ¿Alguien puede arrojar algo de luz sobre lo que podría estar pasando aquí?

Todas las solicitudes AJAX deben ser enrutadas a través del útil archivo /wp-admin/admin-ajax.php
.
Funciona con el excelente sistema de hooks de WordPress. Así que envías una "acción" con tu solicitud y usas eso como parte de la acción en la que enganchas tu función.
Digamos que tu llamada AJAX se ve así (con jQuery):
jQuery('a.ajax').click(function(e){
data = {
'action': 'wpse31321_action',
'story': 1 // Los IDs son más fáciles de manejar...
}
jQuery.get(
'http://www.yoursite.com/wp-admin/admin-ajax.php',
data,
function(resp){
// hacer algo con la respuesta.
}
);
e.preventDefault();
});
Luego, en tu archivo functions.php o en un plugin, necesitas engancharte a wp_ajax_wpse31321_action
y wp_ajax_nopriv_wpse31321_action
. Esta es la parte que hace el trabajo: tienes acceso a toda la API de WP dentro de tu función enganchada. Obtener posts, lo que sea.
wp_ajax_[alguna_accion]
es para usuarios logueados. wp_ajax_nopriv_[alguna_accion]
es para todos los demás. [alguna_accion]
es, por supuesto, la acción que envías con tu solicitud. wpse31321_action
en nuestro ejemplo.
<?php
add_action( 'wp_ajax_wpse31321_action', 'wpse31321_ajax' );
add_action( 'wp_ajax_nopriv_wpse31321_action', 'wpse31321_ajax' );
function wpse31321_ajax()
{
// tienes acceso a $_REQUEST, $_POST y $_GET aquí...
if( isset ( $_REQUEST['story'] ) )
{
$story = get_post( (int) $_REQUEST['story'] );
if( ! $story ) die( '-1' );
echo $story->post_content;
die(); // Siempre termina el script después de mostrar lo que necesitas.
}
else
{
die( '-1' );
}
}
Puedes hacer lo que quieras para manipular los datos antes de mostrarlos. Lo anterior es una respuesta realmente simplista, sin mucha verificación de errores o seguridad integrada. Pero debería ayudarte a comenzar.
Lecturas adicionales:

Gracias por tu extensa respuesta. Sin embargo, lo que realmente me interesa es por qué la llamada ajax funciona con los permalinks desactivados y no cuando están habilitados.

Tendríamos que ver más de tu código para responder eso (¿qué hacen todos esos parámetros de URL? ¿Dónde está ese código?). Pero sospecho que es porque necesitas obtener el permalink real con la cadena de consulta añadida (ej. http://www.yoursite.com/story/story-slug/?para1=value1¶m2=value2
, etc).
