Как заставить wp-pagenavi работать с пользовательским запросом, созданным на основе отправки формы?
Я также опубликовал этот вопрос на форумах поддержки WordPress для плагина wp-pagenavi от scribu:
http://wordpress.org/support/topic/plugin-wp-pagenavi-custom-query-form-submit-part-2?replies=1
Моя ситуация:
Я использую форму для создания пользовательского запроса, который отображает записи из архива пользовательского типа записей, соответствующие определенному пользовательскому полю (например: для "custom-post-type" показывать только записи, имеющие значение "custom-field", выбранное из формы). Да, это называется фильтрацией :P
Мой архив пользовательского типа записей выглядит так:
www.example.com/custom-post-type-archive
(примечание: я использую настройку постоянных ссылок "название записи")
После отправки формы URL становится таким:
www.example.com/custom-post-type-archive?key=value
Пользовательский запрос настроен на показ только записей со значением value пользовательского поля key:
$value = $_GET['value'];
$paged = get_query_var('page');
$args = array(
'post_type' => 'custom-post-type',
'meta_key' => 'key',
'meta_value' => $value,
'paged' => $paged,
'posts_per_page' => 10
);
$my_query = new WP_Query($args);
После цикла у меня есть:
wp_pagenavi(array('query' => $my_query));
wp_reset_postdata();
Запрос работает, я получаю правильные результаты. Но у меня проблемы с пагинацией. Когда я перехожу на следующую страницу, я получаю такой URL:
www.example.com/custom-post-type-archive/page/2?key=value
но пагинация все еще показывает, что я на первой странице, и результаты те же.
Если я вручную введу:
www.example.com/custom-post-type-archive?key=value&page=2
Я получаю правильные результаты (со второй страницы), но все ссылки навигации такие же, как URL, который я ввел вручную выше.
Пожалуйста, помогите (подсказки, ресурсы, что угодно).
Спасибо, Раду

Вы можете попробовать реализовать AJAX-пагинацию для плагина wp-pagenavi (см. http://wordpressapi.com/2011/05/16/add-ajax-pagination-in-wordpress-blog/ в качестве примера). Думаю, это решит вашу проблему.

Поскольку это часто встречается в поиске, хочу отметить, что WP Page Navi (начиная с версии 2.74) теперь поддерживает пользовательские запросы.
FAQ по WP_Pagenavi ссылается на следующую статью, которая объясняет как использовать плагин Pagenavi с вторичным запросом, передавая функции wp_pagenavi()
параметр запроса.
Из руководства:
$my_query = new WP_Query();
while ( $my_query->have_posts() ) : $my_query->the_post();
the_title();
// остальной код здесь
endwhile;
wp_pagenavi( array( 'query' => $my_query ) );
wp_reset_postdata(); // избегаем ошибок дальше на странице

Возможно, проблема уже решена здесь: https://stackoverflow.com/a/13216165/1801379
Также вы можете почерпнуть идеи отсюда: https://wordpress.stackexchange.com/a/4131/23290

Вот решения, которые я нашел (обратите внимание, я использую WP 3.3.2 и WP-Pagenavi 2.82):
Решение 1: Использование параметра paged
вместо page
в get_query_var
.
Решение 2: Использование AJAX-навигации, как указано в статье, на которую ссылается swtshweta.
(при использовании AJAX пагинация работает корректно даже с параметром page
).

Странно, но предложенное решение ничего не отображает в моем браузере. У меня последняя версия WordPress и последняя версия Chrome. В любом случае, спасибо.
Хотя wp_pagenavi отображается корректно, и ссылки показывают /page2/, /page3/ и так далее, и я добавил атрибут $paged или $page в свой wp_query, всегда отображается первая страница.

Раду, Следующее решение сработало у меня: Я модифицировал стандартный код пагинации, заставив его отправлять "&page=xxx" и ловить переменную $page из данных формы. Теперь всё работает идеально.
Обратите внимание на последнюю строку — именно там были внесены изменения.
global $paged;
$paged = ($_GET["page"]) ? ($_GET["page"]) : 1; // здесь я получаю запрашиваемую страницу
function pagenavi( $found_posts, $p = 2 ) { // количество страниц, отображаемых до и после текущей
if ( is_singular() ) return; // не показывать на одиночной странице
global $paged;
$max_page = intval($found_posts / 10) + 1;
echo('max_page=' . $max_page);
if ( $max_page == 1 ) return; // не показывать, если только одна страница
if ( empty( $paged ) ) $paged = 1;
echo '<span class="pages">Страница: ' . $paged . ' из ' . $max_page . ' <BR></span> '; // страницы
if ( $paged > $p + 1 ) p_link( 1, 'Первая' );
if ( $paged > $p + 2 ) echo '... ';
for( $i = $paged - $p; $i <= $paged + $p; $i++ ) { // Средние страницы
if ( $i > 0 && $i <= $max_page ) $i == $paged ? print "<span class='page-numbers current'>{$i}</span> " : p_link( $i );
}
if ( $paged < $max_page - $p - 1 ) echo '... ';
if ( $paged < $max_page - $p ) p_link( $max_page, 'Последняя' );
}
function p_link( $i, $title = '' ) {
if ( $title == '' ) $title = "Страница {$i}";
echo "<a class='page-numbers' href='", esc_html( $_SERVER['REQUEST_URI'] . '&page=' .$i ), "' title='{$title}'>{$i}</a> ";
}

<<Администраторам stachexchange>> пожалуйста, рассмотрите мой ответ как ответ на мой FAQ с наградой. Предложенные участниками решения были ценными, но не сработали в моем случае, так как предлагаемое решение $paged = get_query_var('page'); всегда возвращало ПУСТОЕ значение в моей системе. Спасибо.
