За последние 24 часа нас посетили 22824 программиста и 1210 роботов. Сейчас ищут 629 программистов ...

Как передать $_POST через пагинацию ?

Тема в разделе "Wordpress", создана пользователем Artur_hopf, 14 ноя 2019.

  1. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Добрый день. Суть проблемы. Для вывода данных на страницу используется фильтр, $_POST параметры от пользователя.
    Для пагинации использую встроенную функцию: (для проверки вывел пост данные)
    PHP:
    1. print_r($_POST);
    2. the_posts_pagination(array(
    3.     'mid_size' => 1,
    4.     'prev_next' => true,
    5. ) );
    То есть, первая страница данные есть, переходим на вторую, $_POST пустой.

    Решил передать пост данные таким образом:
    PHP:
    1. print_r($_POST);
    2. the_posts_pagination(array(
    3.     'mid_size' => 1,
    4.     'prev_next' => true,
    5.     'add_args' => $_POST
    6. ) );
    Итак перехожу на вторую страницу и $_POST превращается, угадайте во что? в $_GET.
    Я удивился такой трансмогрификации. И Вот пишу вам сюда, подскажите как можно передать $_POST на следующую страницу чтобы он не изменился.
     
  2. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    :D :D :D

    [​IMG]
     
  3. kazadai90

    kazadai90 Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    103
    Симпатии:
    19
    так как тут пагинация, можно и $_REQUEST использовать
     
  4. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Протестируй на отдельной странице.
    Ссылка с параметрами в обоих случаях одинаковая? Ну должно по факту измениться только page=1 / 2
    И проблема возникает только со 2-й страницей? А если обратно на 1-ю перейти?
    Теоретически может повлиять перенаправление, сверь ссылки в обоих случаях и/или добавь ещё какой-то параметр к ней))
     
  5. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @lastdays Нет, все в разы проще. Человек передает на страцу 1 используя пост данные. У него согласно его данным создается пагинация. Например такая:
    HTML:
    1.  
    2. <a class="page-numbers" href="/page/1/">1</a>
    3. <a class="page-numbers" href="/page/2/">2</a>
    4. <a class="page-numbers" href="/page/3/">3</a>
    5. <a class="page-numbers" href="/page/2/">Далее</a>
    Человек жмет 2 или Далее, переходит на страницу страцу 2 . Естественно его пост данных на второй странице нет, его фильтр сбрасывается.

    Я вижу только решение с помощью js. Перехватить событие и перейти на 2ую страницу с пост данными

    Просто я думал что у этой функции the_posts_pagination есть какое то решение по поводу этого
    --- Добавлено ---
    @lastdays вообще если разбираешься в wp может что то посоветуешь, этот фильтр работает так:
    PHP:
    1. $custom_filter = new WP_Query($args);
    2.  
    3. /* тут магия чтобы эта пагинация вообще работала */
    4. $temp_query = $wp_query;
    5. $wp_query   = NULL;
    6. $wp_query   = $custom_filter;
    7. /* конец магии, даже не спрашивай на кой хрен это нужно */
    8.  
    9. if (  $custom_filter->have_posts() ) :
    10.           while ( $custom_filter->have_posts() ) :
    11.           $custom_filter->the_post();
    12.           endwhile
    13. endif;
    14. the_posts_pagination(array(
    15.           'mid_size' => 1,
    16.           'prev_next' => true,
    17. ) );
    18.  
    19. /* отголоски магии */
    20. $wp_query = NULL;
    21. $wp_query = $temp_query;
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Решил проблему таким образом, в интернетах такого нет, берите на заметку:

    PHP:
    1. <?php
    2. $custom_filter = new WP_Query($args);
    3. /* тут магия чтобы эта пагинация вообще работала */
    4. $temp_query = $wp_query;
    5. $wp_query   = NULL;
    6. $wp_query   = $custom_filter;
    7. /* конец магии, даже не спрашивай на кой хрен это нужно */
    8. if (  $custom_filter->have_posts() ) :
    9.           while ( $custom_filter->have_posts() ) :
    10.           $custom_filter->the_post();
    11.           endwhile
    12. endif;
    13. the_posts_pagination(array(
    14.           'mid_size' => 1,
    15.           'prev_next' => true,
    16. ) );
    17. /* отголоски магии */
    18. $wp_query = NULL;
    19. $wp_query = $temp_query;
    20. ?>
    21. <div id="form-container" style="display: none"></div>
    22. <script>
    23. jQuery('#my-form-pagination ul li a').click(function(event) {
    24.     event.preventDefault();
    25.     var href = $(this).attr( "href" );
    26.     var obj = <?=json_encode($_POST)?>;
    27.     $('#form-container').append( $('<form />', { action: href, method: 'POST' }));
    28.  
    29.     for (var prop in obj) {
    30.         $('#form-container form').append(
    31.             $('<input />', { name: prop, value: obj[prop] })
    32.         );
    33.     }
    34.  
    35.     $('#form-container form').submit();        
    36. });
    37. </script>
    как побочный эффект от js есть задержка в одну секунду
    --- Добавлено ---
    Я пробовал не создавая dom объект, но не получилось так:
    Код (Javascript):
    1. var formData = new FormData();
    2. for (var prop in obj) {
    3.       formData.append(prop, obj[prop]);
    4. }
    5. formData.submit(); //не работает  
     
    Roman __construct нравится это.
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Походу костыль.

    Не применительно к WP, а вообще это делается через Post-Redirect-Get. Т.е. ты уже в ответ на первый и единственный POST не должен ничего выводить, а преобразовывать POST-параметры фильтрации в GET-параметры (или во фрагмент пути) и делать по полученному адресу редирект. В постраничной навигации эти параметры должны наследоваться.

    P.S. Некоторые даже сразу GETом с формы делают.
     
  8. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Да костыль, но работает. По другому не получилось. Да с GET параметрами бы все работало. но url будет некрасивый, параметров много.
    --- Добавлено ---
    Сейчас чтобы не было задержки, пробую без записи формы на страницу
     
  9. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Все параметры в гет... Это единственный правильный вариант..
     
  10. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Алекс8 не единственный, второй правильный это мой :D
     
  11. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Фильтры должны передаваться через ссылку.. это и людям и поисковикам важно)
     
  12. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Тут поисковик не при делах. Есть POST форма поиска на сайте, по ней пользователь ищет данные. Там много параметров, например как тут слева https://www.svyaznoy.ru/catalog/phone/225
    Пользователь выбрал фильтр. Но когда по отфильтрованым товарам он переходит на страницу 2, фильтр сбрасывается.
    И чтобы post не потерялся, прикрутил туда js. Из за этого теряется где то 0.5 секунд производительности.
     
  13. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Я понимаю)) но это не правильный путь))
     
  14. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
  15. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    На самом деле можно извратиться, и сделать пагинацию через post, а параметры передавать через hidden-ы, это наверное будет быстрее чем через js

    Но это реально извращение)))
    --- Добавлено ---
    //то есть вместо ссылок - сделать сабмиты, и отправлять каждый раз новую форму со скрытыми полями :)