У меня есть кастомные тип записи "news"
function custom_post_type_news() {
$labels = array(
'name' => __('Новости'),
'singular_name' => __('Новость'),
'menu_name' => __('Новости'),
'all_items' => __('Все новости'),
'add_new' => __('Добавить новость'),
'add_new_item' => __('Добавить новую новость'),
'edit_item' => __('Редактировать новость'),
'new_item' => __('Новая новость'),
'view_item' => __('Просмотреть новость'),
'search_items' => __('Искать новость'),
'not_found' => __('Новости не найдены'),
'not_found_in_trash' => __('Новости в корзине не найдены'),
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'menu_icon' => 'dashicons-admin-post',
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
'rewrite' => array('slug' => 'news'),
'show_in_rest' => true,
);
register_post_type('news', $args);
}
add_action('init', 'custom_post_type_news');
Я создал архив archive-news.php
В ней вывел годы в которые были опубликованы посты.
Вывел посты (6 на одну страницу, сделал через админку вордпресс).
И вывел постраничную пагинацию.
Вот код
<ul class="tags">
<?php
global $wpdb;
$years = $wpdb->get_results("
SELECT YEAR(post_date) AS year
FROM $wpdb->posts
WHERE post_type = 'news'
AND post_status = 'publish'
GROUP BY YEAR(post_date)
ORDER BY YEAR(post_date) DESC
");
foreach ($years as $year_object) :
$year = $year_object->year;
$year_link = get_year_link($year);
$current_year = date('Y');
?>
<li><a href="<?php echo esc_url($year_link); ?>" class="tag <?php echo ($current_year == $year) ? 'active' : ''; ?>"><?php echo esc_html($year); ?></a></li>
<?php endforeach; ?>
</ul>
<?php if (have_posts()) : ?>
<div class="s-archive__list">
<?php while (have_posts()) : the_post(); ?>
<?php get_template_part('template-parts/archive-card'); ?>
<?php endwhile; ?>
</div>
<?php the_posts_pagination(array(
'prev_text' => 'назад',
'next_text' => 'вперед',
)); ?>
<?php else : ?>
<p><?php 'Новостей нет.' ?></p>
<?php endif; ?>
И вот что мне требуется сделать:
Нужно чтобы на странице были кнопки годов, и при нажатии на кнопку года - показывались только посты этого года + перерендривалась пагинация.
Сейчас сортировка работает, но постраничная пагинация не обновляется (я не знаю как это сделать).
Вот Аякс функция
add_action('wp_ajax_load_news_archive', 'load_news_archive_callback');
add_action('wp_ajax_nopriv_load_news_archive', 'load_news_archive_callback');
function load_news_archive_callback() {
$year = isset($_POST['year']) ? $_POST['year'] : date('Y');
$args = array(
'post_type' => 'news',
'posts_per_page' => -1,
'date_query' => array(
array(
'year' => $year,
),
),
);
$query = new WP_Query($args);
if ($query->have_posts()) {
$archive_content = '';
while ($query->have_posts()) {
$query->the_post();
get_template_part('template-parts/archive-card');
}
wp_reset_postdata();
echo $archive_content;
} else {
echo 'Новостей за ' . $year . ' год нет.';
}
wp_die();
}
и вот обработчик
$('.tags a.tag').on('click', function(e) {
e.preventDefault();
$('.tags a.tag').removeClass('active');
$(this).addClass('active');
var year = $(this).text();
var ajaxUrl = $('#ajax-url').data('url');
$.ajax({
url: ajaxUrl,
type: 'POST',
data: {
action: 'load_news_archive',
year: year
},
success: function(response) {
$('.s-archive__list').html(response);
$('.pagination').html($(response).find('.pagination').html());
},
error: function(xhr, status, error) {
console.error(xhr.responseText);
}
});
});
Помогите пж)