Здравствуйте.
На сайте используется
Timber.
Нужно было сделать ajax фильтрацию по категориям постов. С этим проблем не было до момента работы пагинации с отфильтрованными постами.
Вот что в методе где происходит обработка фильтрации:
function handler_insights_category()
{
global $paged;
$context['exist_filter'] = true;
$category = $_POST['category_slug'];
$context = Timber::context();
if (!isset($paged) || !$paged){
$paged = 1;
}
$insightsQuery = array(
'posts_per_page' => get_option('posts_per_page'),
'paged' => $paged,
'post_type' => 'post',
'orderby' => 'menu_order',
'order' => 'ASC',
'post_status' => 'publish',
);
if ($category !== 'all') {
$taxQuery = array('tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $category,
)
));
$insightsQuery = array_merge($insightsQuery, $taxQuery);
}
$context['insights'] = new Timber\PostQuery($insightsQuery);
$base = '/insights/' . $category;
$orig_req_uri = $_SERVER['REQUEST_URI'];
$_SERVER['REQUEST_URI'] = $base;
get_pagenum_link( $paged - 1 );
Timber::render('views/partial/filter-insights.twig', $context);
$_SERVER['REQUEST_URI'] = $orig_req_uri;
die();
}
Во вьюхе filter-insights.twig происходит вывод постов и пагинации
{% if insights.pagination.pages|length > 0 %}
<div class="c-pagination">
<ul class="c-pagination__list">
{% if insights.pagination.prev %}
<li class="c-pagination__item c-pagination__item--prev">
<a href="{{ insights.pagination.prev.link }}">
<svg viewbox="0 0 24 24">
<use xlink:href="#icon-arrow-left-black"></use>
</svg>
</a>
</li>
{% else %}
<li class="c-pagination__item c-pagination__item--prev c-pagination__item--disabled">
<svg viewbox="0 0 24 24">
<use xlink:href="#icon-arrow-left-black"></use>
</svg>
</li>
{% endif %}
{% for page in insights.pagination.pages %}
<li class="c-pagination__item">
{% if page.link %}
<li class="c-pagination__item">
<a href="{{ page.link }}" class="{{ page.class }}">{{ page.title }}</a>
</li>
{% else %}
<li class="c-pagination__item c-pagination__item--current">
<span class="{{ page.class }}">{{ page.title }}</span>
</li>
{% endif %}
</li>
{% endfor %}
{% if insights.pagination.next %}
<li class="c-pagination__item c-pagination__item--next">
<a href="{{ pagination.next.link }}">
<svg viewbox="0 0 24 24">
<use xlink:href="#icon-arrow-left-black"></use>
</svg>
</a>
</li>
{% else %}
<li class="c-pagination__item c-pagination__item--next c-pagination__item--disabled">
<svg viewbox="0 0 24 24">
<use xlink:href="#icon-arrow-left-black"></use>
</svg>
</li>
{% endif %}
</ul>
</div>
{% endif %}
Пагинация формируется как надо. Если всех постов 3 страницы пагинации то допустим у самой большой категории 2 страницы пагинации.
Проблема с переходом по пагинации. Изначально ссылка была такого вида
localhost/wp-admin/admin-ajax.php/page/2
Сделать урл вида
localhost/insights/for-individuals/page/2 удалось после
ответа со stackoverflow вот таким образом
$base = '/insights/' . $category;
$orig_req_uri = $_SERVER['REQUEST_URI'];
$_SERVER['REQUEST_URI'] = $base;
get_pagenum_link( $paged - 1 );
Но теперь при переходе по пагинации получаю 404. Пытался задать правило записи через add_rewrite_rule банальным образом хотя бы так
add_action('init', 'my_add_custom_rewrite_rules');
function my_add_custom_rewrite_rules()
{
$page_num = 2;
$page_slug = 'insights/for-individuals';
$category = 'for-individuals';
add_rewrite_rule(
'insights/([^/]+)/' . $category . '/([^/]+)/page/([0-9]{1,})/?',
'index.php?pagename=' . $page_slug . '/page/' . $page_num, 'top'
);
}
но нечего не вышло.
Подскажите пожалуйста как сделать чтобы пагинация для фильтрованных постов отображалась по урлу
localhost/insights/for-individuals/page/2
Заранее спасибо!