Вопрос или проблема
У меня есть пользовательские страницы архивов таксономии с выпадающим списком, который позволяет пользователям переупорядочивать/сортировать записи. Это, по сути, ждет, пока пользователь выберет вариант из выпадающего списка, а затем использует array_merge( $wp_query->query.....
для создания нового запроса и пересортировки записей. Это работает хорошо. Я также использую wp-pagination для отображения нумерованной пагинации. Это тоже работает нормально.
Проблема в том, что когда пользователь пересортирует список и затем нажимает на пагинацию, чтобы перейти на страницу 2, новая сортировка теряется и возвращается к первоначальной. Я не могу это понять. Есть идеи?
У меня была такая же проблема. Я использовал форму для сортировки данных и пагинацию с помощью paginate_links. Моё решение заключалось в том, чтобы использовать $_SESSIONS
для хранения данных $_POST
от сортировки (вместо простого разбора данных $_POST
), и установить действие формы на get_permalink()
. Убедитесь, что вы очищаете сессию, если не используете пагинацию или если не отправляете форму сортировки $_POST
.
<script>
function submitform(val) {
document.getElementById('sort-option').value = val;
document.getElementById('form-sort').submit();
}
</script>
<form id="form-sort" action="<?php echo get_permalink(); ?>" method="post">
<ul>
<li>Сортировать по:</li>
<li><a href="#!" onclick="javascript: submitform('newest');">Новый рейтинг</a>
</li>
<li><a href="#!" onclick="javascript: submitform('highest');">Высший рейтинг</a>
</li>
<li><a href="#!" onclick="javascript: submitform('lowest');">Низший рейтинг</a>
</li>
</ul>
<input type="hidden" id='sort-option' name="sort-option" value="">
</form>
–
if($wp_query->get('page') == 0 && empty($_POST) && !empty($_SESSION)) session_unset();
if(!empty($_POST) || !empty($_SESSION)) {
switch($_POST['sort-option']) {
case 'newest':
$_SESSION["sort"] = SORT_DESC;
$_SESSION["sort_by"] = 'review_date';
break;
case 'highest':
$_SESSION["sort"] = SORT_DESC;
$_SESSION["sort_by"] = 'rating';
break;
case 'lowest':
$_SESSION["sort"] = SORT_ASC;
$_SESSION["sort_by"] = 'rating';
break;
}
foreach($reviews as $k => $v) {
$column_id[$k] = $v[$_SESSION["sort_by"]];
}
array_multisort($column_id, $_SESSION["sort"], SORT_NUMERIC, $reviews);
}
Если вы покажете немного кода, я смогу помочь вам больше.
Ответ или решение
Для решения проблемы сохранения сортировки кастомных записей на архивной странице с пагинацией в WordPress, вы можете воспользоваться следующими шагами. Я предложу способ сохранить выбранный вариант сортировки через сессии, чтобы он не терялся при переходе на следующую страницу пагинации.
Шаг 1: Используйте сессии для хранения параметров сортировки
Первым делом, необходимо начать сессию и использовать её для хранения выбранного способа сортировки. Это позволит вам сохранять состояние сортировки даже при смене страниц. Например:
session_start();
if(isset($_POST['sort-option'])) {
$_SESSION['sort_option'] = $_POST['sort-option'];
}
if(!isset($_SESSION['sort_option']) && empty($_POST)) {
// Убедитесь, что сессия очищена, если это не требуется
unset($_SESSION['sort_option']);
}
Шаг 2: Создайте HTML форму для сортировки
Используйте <form>
со скрытым полем для отправки выбранного варианта сортировки. Пример кода формы:
<script>
function submitform(val) {
document.getElementById('sort-option').value = val;
document.getElementById('form-sort').submit();
}
</script>
<form id="form-sort" action="<?php echo get_permalink(); ?>" method="post">
<ul>
<li>Сортировать по:</li>
<li><a href="#!" onclick="submitform('newest');">Новейшие</a></li>
<li><a href="#!" onclick="submitform('highest');">По наивысшему рейтингу</a></li>
<li><a href="#!" onclick="submitform('lowest');">По наименьшему рейтингу</a></li>
</ul>
<input type="hidden" id="sort-option" name="sort-option" value="">
</form>
Шаг 3: Обработка сортировки
Теперь добавьте обработку сортировки, используя значения сохраненные в сессии. Например:
if(!empty($_SESSION['sort_option'])) {
switch($_SESSION['sort_option']) {
case 'newest':
$args['orderby'] = 'date';
$args['order'] = 'DESC';
break;
case 'highest':
$args['meta_key'] = 'rating';
$args['orderby'] = 'meta_value_num';
$args['order'] = 'DESC';
break;
case 'lowest':
$args['meta_key'] = 'rating';
$args['orderby'] = 'meta_value_num';
$args['order'] = 'ASC';
break;
}
}
// Запрос на получение записей
$query = new WP_Query($args);
Шаг 4: Пагинация
Теперь, чтобы сохранить сортировку при смене страниц, просто убедитесь, что параметры пагинации корректно обрабатываются. При использовании paginate_links
, не забудьте передать текущие параметры запроса, включая сортировку.
Пример для пагинации:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args['paged'] = $paged;
$total_posts = new WP_Query($args);
$pagination_links = paginate_links(array(
'total' => $total_posts->max_num_pages,
'current' => $paged,
'add_args' => array('sort-option' => $_SESSION['sort_option']) // Сохранить параметр сортировки
));
Заключение
Теперь у вас есть полное решение для сохранения параметров сортировки при пагинации. При выборе другого метода сортировки он будет актуализироваться при каждом переходе на другую страницу архивной записи. Не забывайте очищать сессии там, где это необходимо, чтобы не сохранять старые данные по окончании использования.