AJAX подгрузка WordPress постов
В этой статье я попытаюсь объяснить как работает AJAX подгрузка WordPress постов (ajax load more), то есть без перезагрузки страницы , а также приведу работающий пример, который установлен на некоторых сайтах.
Для осуществления задуманного нам придётся создать кнопку «Загрузить ещё» по клику на которую будут подгружаться посты, а также написать код в js файле нашей темы(шаблона) и код в php. Начнём пожалуй с простого — а именно с кнопки «Загрузить ещё». Сейчас покажу вам код кнопки и опишу некоторые параметры которые там установлены дата атрибутами.
Код кнопки «Загрузить ещё»
<?php global $wp_query; if ( $wp_query->max_num_pages > 1 ): ?> <p class="text-center"> <button class="load-more btn btn-red" data-action="loadmore" data-ajaxurl="<?php echo esc_url( admin_url( 'admin-ajax.php' ) ) ?>" data-query='<?php echo esc_attr( serialize( $wp_query->query_vars ) ) ?>' data-container=".products__list" data-nonce="<?php echo wp_create_nonce() ?>" data-paged="<?php echo esc_attr( get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1 ) ?>" data-max="<?php echo esc_attr( $wp_query->max_num_pages ) ?>" data-template="template-part/content-product">Загрузить ещё </button> </p> <?php endif ?>
- параметр «data-container» — нужно указать класс или id html контейнера куда будут подгружаться посты, данном случае класс «.portfolioContainer»
- параметр «data-query» — параметры текущего запроса
- параметры «data-ajaxurl, data-query, data-action, data-paged» являются служебными, их изменять не рекомендуется, только если понимаете, на свой страх и риск
- параметр «data-paged» — указывает страницу пагинации на которой мы находимся, его не нужно менять
- параметр «data-template» — путь к шаблону php внутри текущей темы, используется в функции
get_template_part()
И самое главное это дата атрибут кнопки data-action=»loadmore», который обязательно нужно указать, чтобы кнопка работала!
Код Javascript
Этот небольшой кусок кода поможет отправить параметры на сервер и оттуда получить код подгружаемых постов.
// ajax загрузка постов $(document).on('click', '[data-action="loadmore"]', function (event) { event.preventDefault(); var el = $(this); var container = $(el.data("container")); var paged = Number(el.attr('data-paged')); paged++; var data = { action: el.data("action"), query: el.data('query'), template: el.data('template'), nonce: el.data('nonce'), max: el.data('max'), paged: paged } el.attr('data-paged', paged); $.ajax({ type: 'POST', url: el.data("ajaxurl"), data: data, cache: false, beforeSend: function () { container.animate({"opacity": "0.5"}, 400); }, success: function (result) { var json = JSON.parse(result); container.animate({"opacity": "1"}, 100) if (json.content) { container.append(json.content); } if (!json.button) el.remove(); } }); });
PHP код
Обычно, самый рекомендуемый способ вставлять php код в файл под названием «functions.php» который находится в корне вашей темы. Вот эти функции и хуки помогают получить посты и вывести нужный нам контент.
<?php add_action( 'wp_ajax_loadmore', 'load_more_callback' ); add_action( 'wp_ajax_nopriv_loadmore', 'load_more_callback' ); function load_more_callback() { if ( ! wp_verify_nonce( $_POST['nonce'] ) ) { echo json_encode( array( 'status' => 0, 'content' => 'Ошибка!', 'button' => 0 ) ); wp_die(); } $query_string = unserialize( stripslashes( $_POST['query'] ) ); $template = $_POST['template']; $query_string['paged'] = max( intval( $_POST['paged'] ), 1 ); $query_string['post_status'] = 'publish'; query_posts( $query_string ); ob_start(); if ( have_posts() ) { while ( have_posts() ) { the_post(); get_template_part( $template ); } } $content = ob_get_clean(); echo json_encode( array( 'status' => 1, 'content' => $content, 'button' => $_POST['max'] - $query_string['paged'] ) ); wp_die(); } ?>
В этом коде есть два параметра которые нужно изменить под себя:
- Внутри вызова класса «WP_Query» параметр ‘post_type’ необходимо заменить на название типа записи, который нужно вывести. У WordPress стандартный тип записи носит название «post’
- Указать путь к шаблону так называемого лупа внутри цикла «while» — get_template_part( ‘loop’, get_post_type() ) или написать код как альтернатива.
Вот и всё. Я постарался просто показать AJAX подгрузку WordPress постов. Могу напоследок пожелать только хорошей работы вашему коду!
Обновления кода:
- 20.07.2018 — сделал возможность указывать настройки в самой кнопке «Загрузить ещё» в виде дата атрибутов.
- 30.08.2018 — модификация с целью улучшения работы