Привет всем. В прошлой статье мы с вами делали живой поиск на WordPress и я надеюсь, что у вас получилось реализовать live search на своем сайте, ведь это не так сложно, как может показаться. Сейчас же мы займемся созданием Ajax подгрузки постов в WordPress без использования дополнительных плагинов, хоть и есть подобные готовые решения и если вы пришли сюда как раз за этим, то вот вам плагин с говорящим названием — Ajax Load More, который не требует специфических знаний, интуитивно понятен и разобраться сможет даже тот, кто с программированием на ВЫ. Сам лично использовал его в некоторых проектах в том случае, когда необходимо было сделать Ajax подгрузку статей быстро.
Но пишу я это специально для тех, кто хочет научиться делать все самостоятельно и более детально вникнуть в работу WordPress. Как я уже писал ранее, в WP Ajax уже есть и он активно применяется в админке. Но чтобы он стал работать на фронтенде, мы напишем немного кода. А потом создадим сам Ajax запрос, который можно поместить как в сам footer.php, так и через файл functions.php.Вот, что у вас должно получиться:
Демо
Покажу на примере своего блога и создам отдельную страницу для вывода записей из определенной категории. Пускай это будет PHP. ля этого я напишу следующий код:
1
2
3
4
5
6
7
| query_posts('cat=30&posts_per_page=5');
while (have_posts()) : the_post(); ?>
<div class="col-md-12">
<h2><a href="<?php echo esc_url(the_permalink()); ?>">< ?php the_title(); ?></a></h2>
< ?php //the_excerpt(); // если нужно ?>
</div>
< ?php endwhile; |
query_posts('cat=30&posts_per_page=5');
while (have_posts()) : the_post(); ?>
<div class="col-md-12">
<h2><a href="<?php echo esc_url(the_permalink()); ?>">< ?php the_title(); ?></a></h2>
< ?php //the_excerpt(); // если нужно ?>
</div>
< ?php endwhile;
Таким образом мы выводим 5 кликабельных заголовков и короткое описание, если нужно, из указанной категории. Теперь внизу разместим ссылку-кнопку, по нажатию на которую будем подгружать данные через Ajax.
1
2
3
4
5
6
7
8
| $paged = get_query_var('paged') ? get_query_var('paged') : 1;
$max_pages = $wp_query->max_num_pages;
if ($paged < $max_pages) {
echo '<div id="loadmore" style="text-align:center;">
<a href="#" data-max-pages="' . $max_pages . '" data-paged="' . $paged . '" class="btn btn-warning mt-3">Загрузить ещё</a>
';
}
wp_reset_query(); |
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$max_pages = $wp_query->max_num_pages;
if ($paged < $max_pages) {
echo '<div id="loadmore" style="text-align:center;">
<a href="#" data-max-pages="' . $max_pages . '" data-paged="' . $paged . '" class="btn btn-warning mt-3">Загрузить ещё</a>
';
}
wp_reset_query();
Разберем этот кусок более детально:
1 |
Получаем текущую страницу пагинации |
2 |
Количество страниц пагинации |
3-7 |
Проверка. Если paged меньше max_pages, то выводим кнопку |
8 |
Сброс данных произвольного цикла |
В файле functions.php размещаем этот код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| add_action('wp_ajax_loadmore', 'true_loadmore');
add_action('wp_ajax_nopriv_loadmore', 'true_loadmore');
function true_loadmore()
{
$paged = !empty($_POST['paged']) ? $_POST['paged'] : 1;
$paged++;
$args = array('posts_per_page' => 10, 'paged' => $paged, 'cat' => 30);
query_posts($args);
while (have_posts()) : the_post();
?>
<div class="col-md-12">
<h2><a href="<?php echo esc_url(the_permalink()); ?>">< ?php the_title(); ?></a></h2>
</div>
< ?php
endwhile;
die;
} |
add_action('wp_ajax_loadmore', 'true_loadmore');
add_action('wp_ajax_nopriv_loadmore', 'true_loadmore');
function true_loadmore()
{
$paged = !empty($_POST['paged']) ? $_POST['paged'] : 1;
$paged++;
$args = array('posts_per_page' => 10, 'paged' => $paged, 'cat' => 30);
query_posts($args);
while (have_posts()) : the_post();
?>
<div class="col-md-12">
<h2><a href="<?php echo esc_url(the_permalink()); ?>">< ?php the_title(); ?></a></h2>
</div>
< ?php
endwhile;
die;
}
И самое главное, без чего подгрузка постов в WordPress не будет работать, это непосредственно сам Ajax запрос:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| <script>
var button = $('#loadmore a'),
paged = button.attr("data-paged"),
maxPages = button.attr("data-max-pages"),
loadmore = $('#loadmore');
button.click(function (event) {
event.preventDefault();
$.ajax({
type: 'POST',
url: '< ?php echo admin_url('admin-ajax.php'); ?>
data: {
paged: paged,
action: 'loadmore'
},
beforeSend: function (xhr) {
button.addClass('border_none');
button.html('<img src="ссылка на gif загрузчик"/>');
},
success: function (data) {
button.removeClass('border_none');
paged++;
button.parent().before(data);
button.text('Загрузить ещё');
if (paged == maxPages) {
button.remove();
}
}
});
});
</script> |
<script>
var button = $('#loadmore a'),
paged = button.attr("data-paged"),
maxPages = button.attr("data-max-pages"),
loadmore = $('#loadmore');
button.click(function (event) {
event.preventDefault();
$.ajax({
type: 'POST',
url: '< ?php echo admin_url('admin-ajax.php'); ?>
data: {
paged: paged,
action: 'loadmore'
},
beforeSend: function (xhr) {
button.addClass('border_none');
button.html('<img src="ссылка на gif загрузчик"/>');
},
success: function (data) {
button.removeClass('border_none');
paged++;
button.parent().before(data);
button.text('Загрузить ещё');
if (paged == maxPages) {
button.remove();
}
}
});
});
</script>
Прошу обратить внимание, что мой редактор ставит пробел между символами < и ? из-за чего код перестает быть рабочим. Поэтому от пробелов необходимо избавиться.
После того, как будут выведены все записи, кнопка «Загрузить еще» будет скрыта. Это произойдет только в том случае, когда начальное количество статей будет совпадать с выводимыми. То есть если при загрузке страницы выведено 5 записей, то при клике на кнопку тоже должно выводится пять. Как вы уже, наверное, догадались, можно сделать автоматическую подгрузку статей при скроллинге. Для этого нужно немного изменить JS. Здесь есть пример кода. Ну а мне остается вас поздравить, вы научились писать Ajax запросы в WordPress. А если по какой-то причине у вас что-то не получилось, то пишите свои вопросы в комментариях, будем разбираться вместе.
Спасибо большое за подробную информацию.
Не получается, не понятно код кнопки куда разместить? надо добавлять все в один или каждый код отдельно ? может есть готовый код полностью ?
Откройте исходный код демо страницы и там все есть. PHP код написан здесь. Что именно не получается?
А как-то кэшировать подгруженные посты можно? А то, если их очень много в рубрике, то долго грузится все.
Использовать плагины кэширования. Непонятно чему там долго грузиться, вы же делаете ограничение на вывод и достаете посты «порционно». Точно так же, как постраничная навигация.
Плагины кэширования не будут же кэшировать подгружаемые через аякс посты.
Не знаю, у меня долго грузятся, можете не сайте посмотреть
Ограничьте вывод 10-15 записями.
Вряд ли это зависит от количества подгружаемых публикаций. В разделах, где в принципе немного постов, все подгружается довольно быстро, в тех же Концертах, например. А вот на главной или в Мероприятиях, где очень много постов, там грузится относительно долго.
Здравствуйте Александр! Как сделать если на странице нужно два запроса? Кликаю на первую кнопку открывается контент во втором блоке, где вторая кнопка.
Не очень понятно. В чем именно проблема?
У меня есть две кнопки на одной странице «показать еще», при клике добавляются новые посты, задал им разные id. При клике на вторую кнопку просто крутится «прилоудер» а при клике на первую кнопку, открываются новые посты как положено, но во втором блоке. Просто я ещё только учусь всему.
Очень непонятное объяснение. И совершенно непонятно как именно должно быть и что работает не так, как надо. Тем более не видя код, что-то посоветовать в этом случае сложно.