После обновления нескольких старых постов своего блога, я понял, что было бы полезно реализовать функционал, который смог бы сортировать мои записи, опираясь на последнюю дату изменения. Что из этого получилось читайте далее…
Вообще на написание этого поста, меня почему-то подтолкнула моя старая запись — Решение partition problem на PHP, обязательно почитайте ее, она очень познавательная 🙂 .
WordPress сортировка
Как вы уже поняли речь пойдет о WordPress и его стандартных блоговых записях. Реализация и работа сортировки довольно примитивная и будет представлять из себя просто ссылку, при нажатии на которую, будет происходить изменение WordPress запроса, и недавно обновленные записи будут отображаться в порядке убывания.
Для начала, добавьте где-нибудь в своем шаблоне ссылку вида — http://example.com/?sortby=modified
или создайте ее с помощью add_query_arg. В любом случае нас будет интересовать, часть ссылки со значением (sortby=modified
) в которой как раз все волшебство и происходит. Затем, в файл functions.php необходимо добавить параметр запроса WP_Query
используя query_vars фильтр. Весь необходимый код, который должен быть в functions.php представлен ниже:
if ( ! function_exists( 'query_vars_filter' ) ) { function query_vars_filter( $vars ) { $vars[] = 'sortby'; //$vars[] .= 'another'; return $vars; } add_filter( 'query_vars', 'query_vars_filter' ); } if ( ! function_exists( 'alter_query' ) ) { function alter_query( $query ) { $sortby = get_query_var( 'sortby' ); if ( $sortby == 'modified' && ! is_admin() && $query->is_main_query() ) { $query->set( 'orderby', 'modified' ); } } add_action( 'pre_get_posts', 'alter_query' ); }
Как вы можете видеть, в коде используется функция pre_get_posts, чтобы изменить WordPress запрос по умолчанию, который возвращает все посты по дате создания. Внутри, я использую get_query_var, чтобы получить URL-адрес и убеждаюсь/проверяю, что значение обновлено и пользователь видит нужные посты в отсортированном порядке. Условие также гарантирует, что изменения WP Query предназначены только для основного запроса и не для админ-панели. Если все условия истины, код $query->set( 'orderby', 'modified' );
будет сортировать записи по последней дате изменения.