WP проблема при сортировке (пагинация)

psics
На сайте с 02.04.2009
Offline
130
2081

Всем привет.

Есть вопрос. Нужна сортировка (товаров много), но существует проблема. При переходе на страинцу с например 2, 3, 4... исчезает сортировка.

вот эта функция выводится перед циклом


<?php if ($_POST && !empty($_POST)) {
go_filter();
} ?>

Сама функция пока так сделал


function go_filter(){
global $wp_query, $query_string;

$queried_object = get_queried_object();
$args = array();
$args['meta_query'] = array('relation' => 'AND');
$args['tax_query'] = array('relation' => 'AND');
$args['post_type']= 'product';
$args['order']= 'DESC';

query_posts(array_merge($args,$wp_query));
}

сортировка работает только на текущей странице

psics
На сайте с 02.04.2009
Offline
130
#1

c пагинацией вроде как разобрался, только выходит такая фигня:

что на первой странице при сортировке desc выводится количество постов не указанное (12 в моем случае), а лишь (11 в моем случае) - оставшиеся на последней странице при сортировке asc...

А на последней при сортировке desc - все 12

K
На сайте с 03.06.2015
Offline
45
#2

Значит на первой странице выводится - последняя.

В цитатах кодов нет действий со страницами, нет действий с сортировкой. Ничего не проверяете и не меняется. Понять ничего нельзя. Обычно страницы передаются в query string, а сортировку можно фиксировать в куках или поддерживать там же, в параметрах запроса.

ЗЫ WP такой древний что до сих пор global'ы приходится юзать?

---------- Добавлено 26.06.2015 в 13:11 ----------

Да, еще, смена сортировки должна убивать номер страницы, то есть была 3 и desc, поменяли на asc - страница сбросилась и загрузилась стартовая.

У них же должны быть плагины пагинации или вроде того. Зачем вообще что-то самому писать для этого древнего движка?

MYSQL PHP JS HTML CSS SEO TXT США СССР
psics
На сайте с 02.04.2009
Offline
130
#3

я фильтрацию пишу, а не пагинацию...

K
На сайте с 03.06.2015
Offline
45
#4

Все равно не видно как порядок сортировки меняется.

psics
На сайте с 02.04.2009
Offline
130
#5
kostyanet:
Все равно не видно как порядок сортировки меняется.

потому что, я только начинаю делать. А сортировку начал с убывания/возростания для правильности пагинации. Т.к. там был косяк до этого...

K
На сайте с 03.06.2015
Offline
45
#6

Сортировка и пагинация никак не связаны. При любом порядке у вас одинаковое количество записей выдается. Ну хорошо, как обычно делается, например в адресе

site/foo/bar/?page=2&sort=asc

Это значит код, который генерит адреса, должен взять текущий адрес, проверить на известные ему ключи, сохранить где-то найденные значения в нормальном виде (в переменных) и по полученным значениям + старые значения сгенерить новый адрес.

А если сортировка идет через куки, то все проще, конечно. JS сохраняет выбор юзера в куки и тупо перегружает страницу. Скрипт на сервере получает те же куки и выдает уже в другом порядке.

psics
На сайте с 02.04.2009
Offline
130
#7

смысл то да. Но в текущей ситуации это никак не помогло бы. Это в общих чертах...

Ну вроде разобрался) слава яйцам

---------- Добавлено 26.06.2015 в 15:56 ----------

Обновлю проблему и код)

Все сделал не пост,а гет


<?php
$args = array(
'post_type' => 'product',
'razdel' => 'kuritelnye-smesi'
);
$query = new WP_Query( $args );
$c = 1; ?>
<?php if ($_GET && !empty($_GET)) {
go_filter();
} ?>


function go_filter(){
global $wp_query;

$queried_object = get_queried_object(); //получаем такущую таксономию
$args = array();
$args['meta_query'] = array('relation' => 'AND');
$args['tax_query'] = array('relation' => 'AND');
$args['post_type'] = 'product';

//сортировка по убыванию/возрастанию
if ($_GET['sort'] != '') { // если передана фильтрация по разделу
$args['order'] = $_GET['sort'];
}

//сортировка по подразделу
if ($_GET['radio'] != '' & !in_array('all', $_GET['radio']))
{
$args['tax_query'][] = array(
'taxonomy' => 'razdel',
'field' => 'id',
'terms' => $_GET['radio']
);
}
//сортировка по бренду
if ($_GET['brand'] != '' and !in_array('all', $_GET['brand']))
{
$args['tax_query'][] = array(
'taxonomy' => 'razdel',
'field' => 'id',
'terms' => $_GET['brand']
);
}
//сортировка по крепости
if ($_GET['hardmin'] != '' || $_GET['hardmax'] != '') {
$args['meta_query'][] = array(
'key' => 'hards_%_hard',
'compare' => 'BETWEEN',
'value' => array((int)$_GET['hardmin'],(int)$_GET['hardmax']),
'type' => 'numeric'
);
}

//сортировка по объему
if ($_GET['volumemin'] != '' || $_GET['volumemax'] != '') {
$args['meta_query'][] = array(
'key' => 'volumes_%_volume',
'compare' => 'BETWEEN',
'value' => array((int)$_GET['volumemin'],(int)$_GET['volumemax']),
'type' => 'numeric'
);
}

$argsn = array_merge($args,$wp_query->query);
print_r($argsn);

query_posts($argsn);
}

Проблема вышла текущая

Array ( [meta_query] => Array ( [relation] => AND [0] => Array ( [key] => hards_%_hard [compare] => BETWEEN [value] => Array ( [0] => 0 [1] => 24 ) [type] => numeric ) ) [tax_query] => Array ( [relation] => AND [0] => Array ( [taxonomy] => razdel [field] => id [terms] => Array ( [0] => 55 ) ) ) [post_type] => product [order] => ASC [paged] => 8 [razdel] => kuritelnye-smesi [brand] => Array ( [0] => 55 ) )

выводит массив такой

Если откуда берется раздел [razdel] => kuritelnye-smesi - понятно. То откуда берется 2 раза [brand] => Array ( [0] => 55 ) ) и тут [terms] => Array ( [0] => 55 ) - не понятно

Вернее понятно откуда print_r($wp_query->query); даст


Array ( [paged] => 8 [razdel] => kuritelnye-smesi [brand] => Array ( [0] => 55 ) )

не понятно почему он возвращает [brand] => Array ( [0] => 55 ) <- это


<form method="get">
<div id="radio">

<p>Подраздел:</p><div class="clear"></div>
<p>
<input id="radio1" name="radio[]" value="15" type="checkbox">
<label for="radio1">Десертные</label>
</p>
<p>
<input id="radio2" name="radio[]" value="39" type="checkbox">
<label for="radio2">Специальные</label>
</p>
<p>
<input id="radio3" checked="" name="radio[]" value="16" type="checkbox">
<label for="radio3">Табачные</label>
</p>
<p>
<input id="radio4" name="radio[]" value="17" type="checkbox">
<label for="radio4">Фруктовые</label>
</p>
<p>
<input id="radio5" name="radio[]" value="all" type="checkbox">
<label for="radio5">Все</label>
</p>


</div>


<div class="clear"></div>
<div id="brand">
<p>Бренд:</p><div class="clear"></div>
<p>
<input id="brand1" checked="" name="brand[]" value="55" type="checkbox">
<label for="brand1">Dekang</label>
</p>
<p>
<input id="brand2" name="brand[]" value="53" type="checkbox">
<label for="brand2">Ecoliquid</label>
</p>
<p>
<input id="brand3" name="brand[]" value="all" type="checkbox">
<label for="brand3">Все</label>
</p>

</div>

<div class="clear"></div><div id="sort">
<p>Порядок:</p><div class="clear"></div>
<p><input id="sort1" name="sort" value="ASC" checked="" type="radio"><label for="sort1">по возрастанию</label></p>
<p><input id="sort2" name="sort" value="DESC" type="radio"><label for="sort2">по убыванию</label></p>
</div>

<div class="clear"></div><p class="m">
<label for="amount">Крепость:</label></p><div class="clear"></div>
<input id="amount" readonly="" style="border:0; color:#f6931f; font-weight:bold;" type="text">
<input id="amountmin" name="hardmin" value="0" type="hidden">
<input id="amountmax" name="hardmax" value="24" type="hidden">
<p></p>

<div class="ui-slider ui-slider-horizontal ui-widget ui-widget-content ui-corner-all" id="slider-range"><div style="left: 0%; width: 100%;" class="ui-slider-range ui-widget-header ui-corner-all"></div><span style="left: 0%;" class="ui-slider-handle ui-state-default ui-corner-all" tabindex="0"></span><span style="left: 100%;" class="ui-slider-handle ui-state-default ui-corner-all" tabindex="0"></span></div>
<div class="clear"></div><p class="m">
<label for="volume" class="product-name-listview">Объем:</label></p><div class="clear"></div>
<input id="volume" readonly="" style="border:0; color:#f6931f; font-weight:bold;" name="volume" type="text">
<input id="volumemin" name="volumemin" value="" type="hidden">
<input id="volumemax" name="volumemax" value="" type="hidden">
<p></p>

<div class="ui-slider ui-slider-horizontal ui-widget ui-widget-content ui-corner-all" id="slider-volume"><div style="left: 0%; width: 100%;" class="ui-slider-range ui-widget-header ui-corner-all"></div><span style="left: 0%;" class="ui-slider-handle ui-state-default ui-corner-all" tabindex="0"></span><span style="left: 100%;" class="ui-slider-handle ui-state-default ui-corner-all" tabindex="0"></span></div>

<p><input value="Сортировать" id="button-filter" type="submit"></p>
</form>
html - для понимания
psics
На сайте с 02.04.2009
Offline
130
#8

ни у кого идей нету?

K
На сайте с 03.06.2015
Offline
45
#9

Вероятно из-за того, что вы не видите нормальных запросов, не различаете условия и сортировку. Посмотрите на текст запроса, там же наверняка, в ВП, есть какой-то лог или опция вывести куда-то этот текст. Получив текст, загоняете его в mysql через консоль или там phpMyAdmin, или может на wp свой конструктив есть. Загнав получаете результат запроса и видите все как на ладони. Это стандартная процедура проверки всех этих замороченных конструкторов.

---------- Добавлено 28.06.2015 в 21:06 ----------

Для $_GET должен быть объект, не может быть чтоб за столько лет ВП не обзавелся таким. Ну, чтобы не проверять каждый ключ, а мочь сделать например вот так

if($foo=$object_get->foo)

---------- Добавлено 28.06.2015 в 21:15 ----------

В смысле что ваш вариант

$_GET['sort'] != ''

работает только потому, что все проверяемые ключи есть и/или вы отключили вывод предупреждений.

Обычно так делают

if(isset($_GET['sort']))

---------- Добавлено 28.06.2015 в 21:19 ----------

Ключей может не быть. Браузер передает только successful элементы формы. Там целая статья что это такое на w3c.org, а вкратце, например чекбокс без галки не уйдет на сервер, то есть его имени в массиве $_GET вообще не будет.

psics
На сайте с 02.04.2009
Offline
130
#10
kostyanet:
Вероятно из-за того, что вы не видите нормальных запросов, не различаете условия и сортировку. Посмотрите на текст запроса, там же наверняка, в ВП, есть какой-то лог или опция вывести куда-то этот текст. Получив текст, загоняете его в mysql через консоль или там phpMyAdmin, или может на wp свой конструктив есть. Загнав получаете результат запроса и видите все как на ладони. Это стандартная процедура проверки всех этих замороченных конструкторов.

---------- Добавлено 28.06.2015 в 21:06 ----------

Для $_GET должен быть объект, не может быть чтоб за столько лет ВП не обзавелся таким. Ну, чтобы не проверять каждый ключ, а мочь сделать например вот так

if($foo=$object_get->foo)

---------- Добавлено 28.06.2015 в 21:15 ----------

В смысле что ваш вариант

$_GET['sort'] != ''

работает только потому, что все проверяемые ключи есть и/или вы отключили вывод предупреждений.

Обычно так делают

if(isset($_GET['sort']))

---------- Добавлено 28.06.2015 в 21:19 ----------

Ключей может не быть. Браузер передает только successful элементы формы. Там целая статья что это такое на w3c.org, а вкратце, например чекбокс без галки не уйдет на сервер, то есть его имени в массиве $_GET вообще не будет.

ну насколько мне известно объектами в текущем вопросе и не пахнет...

По поводу isset соглашусь, вероятнее так правильнее. Но пока надо сделать работоспособным скрипт...

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий