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 и по-прежнему получить правильный URL для подкачки?

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

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

  • Чтобы написать собственную версию get_pagenum_link(), которая позволит вам указать базовый URL
  • Чтобы перезаписать переменную $_SERVER['REQUEST_URI'] во время вызова get_pagenum_link()
  • Чтобы вызвать функцию 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

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