Вопрос или проблема
В моем page-members.php
я вывожу свой список категорий
<?php
$args = array(
'orderby' => 'slug'
);
$categories = get_categories($args);
foreach ($categories as $category) {
echo '<a href="' . get_category_link($category->term_id) . '"><div class="category-block">' . $category->name . '</div></a>';
}
?>
Я хотел бы, чтобы клик по этим ссылкам заполнил правую колонку записями этой категории.
У меня есть js файл, загружаемый для этой страницы; мой functions.php
:
if (is_page()) {
global $post;
if ($post->post_name == 'members') {
wp_enqueue_script('jquery', get_template_directory_uri() . '/js/jquery.js', array(), '', true);
wp_enqueue_script('blog', get_template_directory_uri() . '/js/blog.js', array('jquery'), '', true);
wp_localize_script('blog', 'ajaxposts', array(
'ajaxurl' => admin_url('admin-ajax.php')
));
}
}
Мой blog.js
загружается корректно только на странице участников.
Что я могу добавить в blog.js
, чтобы загружать записи по категории?
Добавьте ID категории к элементам списка категорий <div class="category-block" data-cid="{ID-OF-CAT}">
, он вам понадобится в ajax запросе. Также необходимо включить action
в запрос и отобразить полученные данные.
Здесь вы можете прочитать больше о AJAX в WP.
blog.js
(function($) {
$(document).ready(function() {
var cat_buttons = $(".category-block");
cat_buttons.on( 'click', function(event){
//
event.preventDefault();
var cid = $(this).data('cid');
$.ajax({
type: "POST",
url: ajaxposts.ajaxurl,
data: {
action: 'my_action_name',
cat_id: cid // <-- ID категории кликнутого элемента / ссылки
}
})
.done( function(data){
// отображение записей
});
});
});
})(jQuery);
Вам также нужна PHP функция для обработки AJAX запроса:
functions.php
add_action( 'wp_ajax_my_action_name', 'ajx_handle_my_action' );
add_action( 'wp_ajax_nopriv_my_action_name', 'ajx_handle_my_action' );
function ajx_handle_my_action() {
$category_id = (int)$_POST['cat_id'];
//
// чтение записей категории
echo json_encode( $result );
wp_die();
}
Ответ или решение
Чтобы реализовать функциональность загрузки постов по категории с использованием AJAX на странице page-members.php
, вам нужно внести несколько изменений в JavaScript и PHP код. В этом ответе я подробно опишу необходимые шаги и приведу пример реализации.
1. Обновление HTML-кода с учетом ID категорий
Для того чтобы отправить ID категории через AJAX, необходимо добавить атрибут data-cid
в элементы категорий. Измените код в page-members.php
следующим образом:
<?php
$args = array(
'orderby' => 'slug'
);
$categories = get_categories($args);
foreach ($categories as $category) {
echo '<a href="#"><div class="category-block" data-cid="' . $category->term_id . '">' . $category->name . '</div></a>';
}
?>
2. Код JavaScript (blog.js
)
Следующим шагом будет добавление функциональности в blog.js
для обработки кликов на блоки категорий и отправки запроса AJAX:
(function($) {
$(document).ready(function() {
var cat_buttons = $(".category-block");
cat_buttons.on('click', function(event) {
event.preventDefault();
var cid = $(this).data('cid');
$.ajax({
type: "POST",
url: ajaxposts.ajaxurl,
data: {
action: 'fetch_posts_by_category', // задаем действие
cat_id: cid // идентификатор категории
}
})
.done(function(data) {
// Обработка полученных данных
var posts = JSON.parse(data);
var output = '';
if(posts.length){
posts.forEach(function(post) {
output += '<h2>' + post.title + '</h2>'; // выводим заголовки постов
output += '<div>' + post.content + '</div>'; // выводим содержание постов
});
} else {
output = '<p>Посты не найдены для этой категории.</p>';
}
$('#posts-container').html(output); // отображаем данные в контейнере
});
});
});
})(jQuery);
В этом коде мы обрабатываем данные, полученные с сервера, и отображаем посты в элементе с ID posts-container
, который вы должны добавить на вашу страницу для отображения результатов.
3. PHP-обработка AJAX-запроса
Теперь необходимо определить функцию, которая будет обрабатывать AJAX-запросы. Добавьте следующий код в файл functions.php
:
add_action('wp_ajax_fetch_posts_by_category', 'ajx_handle_fetch_posts_by_category');
add_action('wp_ajax_nopriv_fetch_posts_by_category', 'ajx_handle_fetch_posts_by_category');
function ajx_handle_fetch_posts_by_category() {
check_ajax_referer('ajax_nonce', 'security'); // проверка безопасности, если требуется
$category_id = intval($_POST['cat_id']);
$query_args = array(
'cat' => $category_id,
'post_status' => 'publish',
'posts_per_page' => -1 // получить все посты
);
$query = new WP_Query($query_args);
$result = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$result[] = array(
'title' => get_the_title(),
'content' => get_the_content()
);
}
} else {
$result = array(); // если постов нет
}
echo json_encode($result); // возвращаем результат в формате JSON
wp_die();
}
4. Добавление контейнера для постов
Не забудьте добавить в ваш HTML-код контейнер для отображения загруженных постов. Например:
<div id="posts-container"></div>
Заключение
С вышеописанными изменениями ваша страница page-members.php
теперь будет динамически загружать посты по категориям с использованием AJAX без перезагрузки страницы. Убедитесь, что вы правильно настроили все скрипты и правильно подключили jQuery
. Попробуйте протестировать функциональность и адаптировать стили под ваши нужды.