@NNovosad

Как реализовать пагинацию постов по категории через Ajax?

Здравствуйте.
На сайте используется 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
Заранее спасибо!
  • Вопрос задан
  • 28 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы