WordPress Pagination не работает с AJAX

Вопрос:Я загружаю некоторые сообщения, хотя AJAX и мое разбиение на WordPress использует следующую функцию для вычисления поискового вызова: get_pagenum_link($paged - 1) Проблема заключается в том, что разбиение на страницы создается с помощью AJAX, поэтому эта ссылка выглядит так: http://localhost:1234/vendor_new/wp-admin/admin-ajax.php Однако фактический URL, который я пытаюсь достичь, для этого: http://localhost:1234/vendor_new/display-vendor-results Есть ли способ использовать эту функцию

Вопрос:

Я загружаю некоторые сообщения, хотя AJAX и мое разбиение на WordPress использует следующую функцию для вычисления поискового вызова:

get_pagenum_link($paged — 1)

Проблема заключается в том, что разбиение на страницы создается с помощью AJAX, поэтому эта ссылка выглядит так: http://localhost:1234/vendor_new/wp-admin/admin-ajax.php

Однако фактический URL, который я пытаюсь достичь, для этого:
http://localhost:1234/vendor_new/display-vendor-results

Есть ли способ использовать эту функцию с AJAX и по-прежнему получить правильный URL для подкачки?

Лучший ответ:

Я могу представить вам три варианта:

  • Чтобы написать собственную версию get_pagenum_link(), которая позволит вам указать базовый URL
  • Чтобы перезаписать переменную $_SERVER[‘REQUEST_URI’] во время вызова get_pagenum_link()
  • Чтобы вызвать функцию paginate_links(), верните весь HTML-код с разбивкой по страницам и затем обработайте это с помощью JS, чтобы использовать только предыдущие/следующие ссылки.

Содержание

  1. # 1 Пользовательская версия get_pagenum_link()
  2. # 2 перезаписать переменную $_SERVER[‘REQUEST_URI’]
  3. # 3 Используйте paginate_links() и манипулируйте HTML с помощью JS

Плюсы: вам нужно будет изменить небольшую сумму вашего текущего кода – в основном просто измените имя вызываемой функции и передайте дополнительный аргумент.

Минусы: если функция изменится в будущем (маловероятно, но возможно), вам также придется настроить свою функцию.

Я отправлю только соответствующий код пользовательской функции – вы можете предположить, что все остальное можно оставить в базовой версии.

function my_get_pagenum_link( $pagenum = 1, $escape = true, $base = null ) { global $wp_rewrite; $pagenum = (int) $pagenum; $request = $base ? remove_query_arg( ‘paged’, $base ) : remove_query_arg( ‘paged’ );

Итак, в этом случае у нас есть еще один аргумент, который позволяет нам указать базовый URL-адрес – вам будет сложно либо скорректировать URL-адрес (не очень хорошая идея), либо динамически генерировать его. Вот как изменится ваш код, обрабатывающий запрос AJAX:

my_get_pagenum_link( $paged — 1, true, ‘http://localhost:1234/vendor_new/display-vendor-results’ );

И что об этом для этого решения.

# 2 перезаписать переменную $_SERVER[‘REQUEST_URI’]

Плюсы: достаточно просты в применении, должны быть надежными в будущем.

Минусы: возможны побочные эффекты (теоретически это не должно быть, но вы никогда не знаете); вам может потребоваться отредактировать код JS.

Вы можете перезаписать его со значением, которое вы получаете на внутреннем сервере, или со значением, которое вы передаете с помощью вашего запроса AJAX (поэтому в вашем запросе AJAX вы можете иметь параметр, например base, который будет что-то вроде window.location.pathname + window.location.search). Разница заключается в том, что во втором случае ваш JS будет работать с любой страницы (если в будущем вы закончите с несколькими местоположениями, используйте один и тот же обработчик AJAX).

Я отправлю код, который перезаписывает переменную, а затем восстанавливает ее.

// Static base — making it dynamic is highly recommended $base = ‘/vendor_new/display-vendor-results’; $orig_req_uri = $_SERVER[‘REQUEST_URI’]; // Overwrite the REQUEST_URI variable $_SERVER[‘REQUEST_URI’] = $base; // Get the pagination link get_pagenum_link( $paged — 1 ); // Restore the original REQUEST_URI — in case anything else would resort on it $_SERVER[‘REQUEST_URI’] = $orig_req_uri;

Что здесь происходит, так это то, что мы просто переопределяем переменную REQUEST_URI нашим собственным – таким образом мы обманываем функцию add_query_arg в мышлении, что мы находимся на странице результатов /vendor _new/display-vendor-results, а не в /wp -admin/admin-ajax.php

Плюсы: На данный момент я не могу думать ни о чем.

Минусы: вам нужно будет настроить как ваш PHP, так и код JavaScript.

Вот идея: вы используете paginate_links() с его аргументами для создания всех ссылок на страницы (ну, по крайней мере, четыре из них – prev/next и first/last). Затем вы передаете весь этот HTML в качестве аргумента в своем ответе (если вы используете JSON – или как часть ответа, если вы просто возвращаете HTML).

PHP-код:

global $wp_rewrite, $wp_query; // Again — hard coded, you should make it dynamic though $base = trailingslashit( ‘http://localhost:1234/vendor_new/display-vendor-results’ ) . «{$wp_rewrite->pagination_base}/%#%/»; $html = ‘<div class=»mypagination»>’ . paginate_links( array( ‘base’ => $base, ‘format’ => ‘?paged=%#%’, ‘current’ => max( 1, $paged ), ‘total’ => $wp_query->max_num_pages, ‘mid_size’ => 0, ‘end_size’ => 1, ) ) . ‘</div>’;

JS-код (он должен находиться внутри вашего обратного вызова успеха AJAX):

// the html variable is supposed to hold the AJAX response // either just the pagination or the whole response jQuery( html ).find(‘.mypagination > *:not(.page-numbers.next,.page-numbers.prev)’).remove();

Что здесь происходит, так это то, что мы находим все элементы внутри <div class=»mypagination»>, кроме предыдущих/следующих ссылок, и мы удаляем их.

Чтобы обернуть его:

Самое простое решение, вероятно, # 2, но если кому-то по какой-то причине нужно знать, что текущая страница – admin-ajax.php , а, вы создаете ссылки, то у вас может быть проблема. Вероятно, никто не заметил бы, так как это будет ваш код, который работает, и любые функции, которые могут быть привязаны к фильтрам, также должны думать, что они находятся на требуемой странице (иначе они могут что-то испортить).

PS: Если это зависит от меня, я всегда буду использовать функцию paginate_links() и отображать номера страниц в интерфейсе. Затем я использовал бы ту же функцию для генерации обновленного HTML в обработчике AJAX.

Ответ №1

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

Лучше всего получить через AJAX страницу с разбивкой по страницам и захватить соответствующую разметку.
Предположим, что у вас есть сообщение http://www.yourdomain.com/post-1/

Я думаю, вы хотите захватить разбивку на страницы следующей страницы, поэтому вам нужно что-то вроде этого:

$( «#pagination» ).load( «http://www.yourdomain.com/post-1/page/2 #pagination» );

Это может легко работать с get_next_posts_link() вместо get_pagenum_link().

Теперь, чтобы ваш вызов AJAX был динамическим, вы могли бы что-то вроде:

$( «#pagination» ).load( $(«#pagination a»).attr(‘href’) + » #pagination» );

Это будет захватывать ссылку следующей страницы с вашей текущей страницы и загружать ее разметку страницы вместо старого.

Это также можно сделать с помощью get_pagenum_link(), однако вам нужно соответствующим образом изменить селектор $(«#pagination a»).attr(‘href’), чтобы получить следующую страницу (поскольку у вас будет более одного элемента a внутри #pagination

Оцените статью
Добавить комментарий