Как заставить wp-pagenavi работать с пользовательским запросом, созданным на основе отправки формы?

2 июл. 2012 г., 16:27:53
Просмотры: 13.6K
Голосов: 5

Я также опубликовал этот вопрос на форумах поддержки 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, который я ввел вручную выше.

Пожалуйста, помогите (подсказки, ресурсы, что угодно).

Спасибо, Раду

4
Комментарии

У меня похожая проблема, вы уже нашли решение? Можете поделиться им здесь?

dev-jim dev-jim
24 окт. 2012 г. 17:21:28

Есть решение для этой проблемы?

p.a. p.a.
5 нояб. 2012 г. 19:45:35

@p.a, @tc.k, я решил проблему, используя параметр paged (вместо page) в get_query_var и реализовав AJAX-пагинацию, как указал @swtshweta. Думаю, это сработало бы даже без AJAX.

rereradu rereradu
6 нояб. 2012 г. 21:03:34

Да, решение определенно заключается в использовании параметра paged вместо page (я использую WP 3.3.2 и WP-pagenavi 2.82). Работает без Ajax-пагинации, хотя использование этой техники выглядит потрясающе :)

rereradu rereradu
6 нояб. 2012 г. 21:10:28
Все ответы на вопрос 6
0

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

6 нояб. 2012 г. 11:03:33
0

Поскольку это часто встречается в поиске, хочу отметить, что 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();    // избегаем ошибок дальше на странице
27 окт. 2013 г. 16:39:44
0

Возможно, проблема уже решена здесь: https://stackoverflow.com/a/13216165/1801379

Также вы можете почерпнуть идеи отсюда: https://wordpress.stackexchange.com/a/4131/23290

6 нояб. 2012 г. 10:25:58
0

Вот решения, которые я нашел (обратите внимание, я использую WP 3.3.2 и WP-Pagenavi 2.82):

Решение 1: Использование параметра paged вместо page в get_query_var.

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

6 нояб. 2012 г. 22:08:54
2

Странно, но предложенное решение ничего не отображает в моем браузере. У меня последняя версия WordPress и последняя версия Chrome. В любом случае, спасибо.

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

7 нояб. 2012 г. 10:06:44
Комментарии

Вы правильно вызываете функцию wp_pagenavi: wp_pagenavi(array('query' => $your_custom_query)); ?

rereradu rereradu
7 нояб. 2012 г. 16:07:09

Я пробовал оба варианта, но ни один не сработал. Я понял, что переменная $paged всегда передается пустой.

p.a. p.a.
12 нояб. 2012 г. 09:39:14
1

Раду, Следующее решение сработало у меня: Я модифицировал стандартный код пагинации, заставив его отправлять "&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> ";

}

12 нояб. 2012 г. 09:45:13
Комментарии

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

p.a. p.a.
12 нояб. 2012 г. 11:15:19