Пост не загружается через AJAX
Я унаследовал сайт на WP 3.2.1, который использует prettyPhoto для загрузки контента через AJAX. Это работало до того, как я включил постоянные ссылки на сайте. Установлен плагин Custom Post Type UI. Я могу просматривать свой кастомный тип записи по адресу mysite.com/story/name-of-story, но загрузка через AJAX приводит к ошибке 404.
Ссылки, которые запускают код $.get в prettyPhoto, выглядят так:
<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>
Если я верну настройки постоянных ссылок обратно на 'по умолчанию', контент поста загружается во всплывающее окно. URL-адреса, которые вызываются через XHR, пока это работает, выглядят так:
http://mysite.com/?story=name-of-story&ajax=true&count=37
Я пробовал удалить все параметры запроса из URL постоянных ссылок, но это не решило проблему. Может кто-нибудь объяснить, что здесь происходит?

Все AJAX-запросы должны направляться через удобный файл /wp-admin/admin-ajax.php
.
Он работает с отличной системой хуков WordPress. Вы отправляете "action" с вашим запросом и используете его как часть действия, к которому подключаете свою функцию.
Допустим, ваш AJAX-запрос выглядит так (с использованием jQuery):
jQuery('a.ajax').click(function(e){
data = {
'action': 'wpse31321_action',
'story': 1 // С ID проще работать...
}
jQuery.get(
'http://www.yoursite.com/wp-admin/admin-ajax.php',
data,
function(resp){
// обрабатываем ответ.
}
);
e.preventDefault();
});
Затем, в файле functions.php или в плагине, вам нужно подключиться к хукам wp_ajax_wpse31321_action
и wp_ajax_nopriv_wpse31321_action
. Это та часть, которая выполняет работу: внутри вашей функции у вас есть доступ ко всему API WordPress. Получайте записи, что угодно.
wp_ajax_[some_action]
предназначен для авторизованных пользователей. wp_ajax_nopriv_[some_action]
— для всех остальных. [some_action]
— это действие, которое вы отправляете вместе с запросом. В нашем примере это wpse31321_action
.
<?php
add_action( 'wp_ajax_wpse31321_action', 'wpse31321_ajax' );
add_action( 'wp_ajax_nopriv_wpse31321_action', 'wpse31321_ajax' );
function wpse31321_ajax()
{
// здесь у вас есть доступ к $_REQUEST, $_POST и $_GET...
if( isset ( $_REQUEST['story'] ) )
{
$story = get_post( (int) $_REQUEST['story'] );
if( ! $story ) die( '-1' );
echo $story->post_content;
die(); // Всегда завершайте скрипт после вывода необходимых данных.
}
else
{
die( '-1' );
}
}
Вы можете делать что угодно для манипуляции данными перед их выводом. Выше приведен очень упрощенный ответ без проверки ошибок и безопасности. Но этого достаточно, чтобы начать.
Дополнительное чтение:

Спасибо за развернутый ответ. Однако меня действительно интересует, почему ajax-запрос работает с отключенными постоянными ссылками, но не работает при их включении?

Нам нужно увидеть больше вашего кода, чтобы ответить на этот вопрос (что делают все эти параметры URL? Где находится этот код?). Но я подозреваю, что это потому, что вам нужно получить фактический постоянный URL с добавленной строкой запроса (например, http://www.yoursite.com/story/story-slug/?para1=value1¶m2=value2
и т.д.).
