Я загружаю некоторые сообщения, хотя 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 Пользовательская версия get_pagenum_link()
Плюсы: вам нужно будет изменить небольшую сумму вашего текущего кода – в основном просто измените имя вызываемой функции и передайте дополнительный аргумент.
Минусы: если функция изменится в будущем (маловероятно, но возможно), вам также придется настроить свою функцию.
Я отправлю только соответствующий код пользовательской функции – вы можете предположить, что все остальное можно оставить в базовой версии.
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
# 3 Используйте paginate_links()
и манипулируйте HTML с помощью JS
Плюсы: На данный момент я не могу думать ни о чем.
Минусы: вам нужно будет настроить как ваш 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.
На самом деле трудно ответить без особых подробностей о том, что и как называется. Бьюсь об заклад, вы хотите реализовать это на каком-то бесконечном веб-сайте, правильно?
Лучше всего получить через 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