Пост не загружается через AJAX

17 окт. 2011 г., 19:57:11
Просмотры: 2.08K
Голосов: 0

Я унаследовал сайт на 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 постоянных ссылок, но это не решило проблему. Может кто-нибудь объяснить, что здесь происходит?

1
Комментарии

Похоже, вам нужно глубже изучить, как использовать ajax на сайтах WordPress. Посмотрите это: http://wpajax.com/.

chrisguitarguy chrisguitarguy
17 окт. 2011 г. 20:12:15
Все ответы на вопрос 1
3

Все 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' );
    }
}

Вы можете делать что угодно для манипуляции данными перед их выводом. Выше приведен очень упрощенный ответ без проверки ошибок и безопасности. Но этого достаточно, чтобы начать.

Дополнительное чтение:

http://wpajax.com/

http://codex.wordpress.org/AJAX_in_Plugins

http://codex.wordpress.org/AJAX

17 окт. 2011 г. 20:35:45
Комментарии

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

codecowboy codecowboy
18 окт. 2011 г. 01:21:12

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

chrisguitarguy chrisguitarguy
18 окт. 2011 г. 02:10:22

Проблема была в том, что старая ссылка уже содержала '?' в URL, но его не было в постоянной ссылке после включения пользовательских постоянных ссылок. Спасибо!

codecowboy codecowboy
18 окт. 2011 г. 11:17:36