/ Wordpress / Сортировка постов (по дате, по заголовку, по дате изменений)

Сортировка постов (по дате, по заголовку, по дате изменений)

HIT

02.11.2015

22083

9

Создадим для удобства пользователей функционал сортировки постов (по дате, по заголовку, по дате изменений). Сортировка отличается от фильтрации тем, что при сортировке показываются все записи, но в другом порядке, а фильтр оставляет только те записи которые соответствуют параметру (параметрам). Сортировка и фильтрация не исключающие, а дополняющие друг друга функции.

Вставляем на странице вывода архивов, например category.php (перед <?php if(have_posts()) : ?>)

Первый вариант решения (не верный)

<?php
$order = "&orderby=date&order=DESC";
$s2 = ' selected="selected"';
if ($_POST['select'] == 'title') { $order = "&orderby=title&order=ASC"; $s1 = ' selected="selected"'; $s2 = ''; }
if ($_POST['select'] == 'newest') { $order = "&orderby=date&order=DESC"; $s2 = ' selected="selected"'; }
if ($_POST['select'] == 'lastest') { $order = "&orderby=date&order=ASC"; $s3 = ' selected="selected"'; $s2 = ''; }
if ($_POST['select'] == 'correct') { $order = "&orderby=modified"; $s4 = ' selected="selected"'; $s2 = ''; }
?>
<form method="post" id="order">
Сортировать:
<select name="select" onchange='this.form.submit()' style="width:200px">
<option value="title"<?=$s1?>>по заголовку</option>
<option value="newest"<?=$s2?>>по дате (сначала новые)</option>
<option value="lastest"<?=$s3?>>по дате (сначала старые)</option>
<option value="correct"<?=$s4?>>по дате изменения</option>
</select>
</form>
<?php $posts = query_posts ($query_string . $order); ?>
Данный модуль конфликтует с пэйджинацией: при переходе на другую страницу сортировка сбрасывается

Данное решение работает не правильно по двум причинам: не совсем правильно прописан запрос, и POST-запрос сбрасывается при переходе на другую страницу.

Второй вариант решения (правильный)

<?php

if ($_GET['select'] == 'newest') { $order = "&orderby=date&order=DESC"; $s1 = ' selected="selected"'; }
if ($_GET['select'] == 'lastest') { $order = "&orderby=date&order=ASC"; $s2 = ' selected="selected"'; }
if ($_GET['select'] == 'title') { $order = "&orderby=title&order=ASC"; $s3 = ' selected="selected"'; }
if ($_GET['select'] == 'correct') { $order = "&orderby=modified"; $s4 = ' selected="selected"'; }
?>
<form method="get" id="order">
<select name="select" onchange='this.form.submit()' style="width:200px">
<option value="newest"<?=$s1?>>по дате (сначала новые)</option>
<option value="lastest"<?=$s2?>>по дате (сначала старые)</option>
<option value="title"<?=$s3?>>по заголовку</option>
<option value="correct"<?=$s4?>>по дате изменения</option>
</select>
</form>

<?php global $query_string; // параметры базового запроса
query_posts($query_string.'&'.$order); // базовый запрос + свои параметры
?>

Скрипт, изменения URL. Нужен для того чтобы при выборе пункта сортировки страница перезагружалась. Работает на технологии window.location

$(document).ready(function() {

var paramsString = location.search
var searchParams = new URLSearchParams(paramsString);

//Iterate the search parameters.
for (let p of searchParams) {
  console.log(p);
}


//Сортировка select

$('#sort').change(function(){

var sortValues = $("#sort option:selected").val(); //получаем значение выбранного пункта select

if($("#sort").val()=="") { 
		
		searchParams.delete("select");
		window.history.replaceState({}, '', location.pathname + '?' + searchParams);
		location.reload(); //перезагрузить страницу (для ajax не нужно)
		
} else {
		
		searchParams.set("select", sortValues);
		window.history.replaceState({}, '', location.pathname + '?' + searchParams);
		location.reload(); //перезагрузить страницу (для ajax не нужно)
		
}

});

});

Изменение количества записей

<label><select name="posts_per_page" onchange='' id="number"> <!-- this.form.submit() -->
<?php $_GET['posts_per_page'] = ""; ?>	
<option value="">по 20 записей</option>
<option value="5" <?php if('40' == $_GET['posts_per_page']): ?> selected="selected"<?php endif; ?>>по 40 записей</option>
<option value="40" <?php if('60' == $_GET['posts_per_page']): ?> selected="selected"<?php endif; ?>>по 60 записей</option>
</select></label>

Можно дополнить сортировку выбором количества записей на странице 20 (по-умолчанию), 50, 100 и т.д.

Можно делать различные значения, но не меньше чем число выставленное в настройках количества записей на странице.
//Сортировка Количество записей

$('#number').change(function(){

var sortValues = $("#number option:selected").val(); //получаем значение выбранного пункта select
//alert( sortValues );

if($("#number").val()=="") { 
		
		searchParams.delete("posts_per_page");
		window.history.replaceState({}, '', location.pathname + '?' + searchParams);
		location.reload(); //перезагрузить страницу (для ajax не нужно)
		
} else {
		
		searchParams.set("posts_per_page", sortValues);
		window.history.replaceState({}, '', location.pathname + '?' + searchParams);
		location.reload(); //перезагрузить страницу (для ajax не нужно)
		
}

});
В woocommerce количество записей на странице изменяет запрос ?ppp=1. Также существует готовое решение — плагин Woocommerce Products Per Page

Функция фильтра

Все вышеописанные виды сортировки не будут работать без функции фильтра.

Вызываем фильтр перед формой

<?php
if ($_GET && !empty($_GET)) { // если было передано что-то из формы
go_filter(); // запускаем функцию фильтрации
}
?>

Функция фильтра

/* Фильтрация */

function go_filter() { // наша функция

//$args = array(); // подготовим массив (не нужна, потом удалить)

if ($_GET['tags'] != '') {
$tags = explode(" ", $_GET['tags']); //в URLSearchParams разделить в url + в строке разделяется пробелом
$args['tag__in'] = $tags; //tag__and — содержит все перечисленные тэги
}

//$args['cat'] = 37; /* $_GET['category'] */

global $wp_query; // нужно заглобалить текущую выборку постов (нужна!, когда мы вклиниваемся в основной массив)

//$args['paged'] = 2;

$args['meta_query'] = array('relation' => 'AND');
$args['tax_query'] = array('relation' => 'AND');
if ($_GET['country'] != '') {
$args['meta_query'][] = array( // пешем условия в meta_query
'key' => 'country', // название произвольного поля
'value' => $_GET['country'] // переданное значение произвольного поля
);
}
if ($_GET['label'] != '') {
$labels = explode(" ", $_GET['label']); //в URLSearchParams разделить в url + в строке разделяется пробелом
$args['tax_query'][] = array(
'taxonomy' => 'label',
'field' => 'slug',
'terms' => $labels, //$_GET['label']
//'operator' => 'IN' //AND - в записи должны быть все выбранные термины, IN - в записи должен быть хотя бы один из выбранных терминов

);
}
// Варианты сортировки

if ($_GET['select'] == 'newest') { $args['orderby'] = 'date'; $args['order'] = 'DESC';}
if ($_GET['select'] == 'lastest') { $args['orderby'] = 'date'; $args['order'] = 'ASC';}
if ($_GET['select'] == 'title') { $args['orderby'] = 'title'; $args['order'] = 'ASC';}
if ($_GET['select'] == 'correct') { $args['orderby'] = 'modified';}
if ($_GET['select'] == 'power') { $args['orderby'] = 'meta_value_num'; $args['meta_key'] = 'power';}
if ($_GET['select'] == 'count') { $args['orderby'] = 'meta_value_num'; $args['meta_key'] = 'post_views_count';}
$args['posts_per_page'] = $_GET['posts_per_page'];

//$args['paged'] = 0;



query_posts(array_merge($args,$wp_query->query)); // сшиваем текущие условия выборки стандартного цикла wp с новым массивом переданным из формы и фильтруем

//$query = new WP_Query( $args );

}

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Сортировка по произвольным полям

Сортировка по произвольным полям

Более продвинутая форма сортировки — сортировка по произвольным полям. Для рассматриваемого функционала сортировки, нет принципиальной разницы: создано поле штатными средствами wordpress или плагином ACF. Метод сортировки по произвольному полю Ранее Читать далее »

Варианты сортировки woocommerce

Варианты сортировки woocommerce

Добавляем свои варианты сортировки в woocommerce, кроме стандартных: по цене, по новизне, по популярности, по рейтингам. Сортировке поддаются только числовые свойства товаров содержащихся у каждого товара. Сортировка по атрибуту относится Читать далее »

/
Доработка сортировки постов

Доработка сортировки постов

В wordpress существуют следующие варианты сортировки записей: author — сортировать по ID авторов content — сортировать по контенту date — сортировать по дате создания записи (по умолчанию) ID — сортировать Читать далее »

Добавить комментарий

9 комментариев

  1. Юрец

    Красавчики. Данная инструкция очень помогла!

  2. Королев Сергей

    В топ яши! годнота

  3. Антон

    Я только лишь 2 код (где правильный) скопировал и у меня все заработало. Подскажите, для чего нужен тот код, что ниже и как его вставлять. Про записи понятно, а скрипты и функции фильтра зачем, если после 1 вставки уже все работает?

    1. Alexandr

      Ко второму варианту (правильному) относится только php (который Вы использовали) и скрипт для изменения url (он не обязателен). То что описано после заголовка Изменение количества записей, это уже пошло немного из другого функционала (Фильтрации). Я его до конца еще не доработал, а здесь сохранил, чтобы не потерять мысль. Изначально этот сайт задумывался как некий аналог записной книжки в процессе изучения различных технологий, но в последствии я стал давать небольшие пояснения — и мне легче понять что и откуда (связи) и людям помощь.

  4. Александр

    Спасибо большое! Применил у себя на сайте. Скажите, а можно сделать не выпадающий список, а ссылки? 

    1. Alexandr

      Весь принцип данного решения отправка GET-запроса. Можно конечно сделать кнопками, но эти кнопки должны имитировать изменение/отправку формы. Именно такой функционал (с кнопками) я еще нигде не делал. Как сделаю — опубликую.

  5. Руслан

    Здравствуйте. У меня нет category.php, но есть archieve.php. Вставил код php перед указанной строкой и ничего не изменилось. Что я сделал не так? Благодарю за ответ!

  6. Венер

    Спасибо дружище ))) Где ж ты раньше был, как долго я искал подобную инструкцию. Respect!!!

  7. Венер

    Руслан, скинь все что у тебя в archive.php я гляну

Сортировка постов (по дате, по заголовку, по дате изменений)
Массовое изменение цен
Рекомендации для васМассовое изменение ценOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.