Второй архив пользовательских сообщений

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

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

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

Кроме того, существует ли способ создать «общую» страницу архива? Нужно ли мне переходить к правилам перезаписи?

Solutions Collecting From Web of "Второй архив пользовательских сообщений"

Я бы использовал параметр запроса, например ?time=future возможно, для изменения вашего запроса. Разница между запросом будущих должностей и запросом прошлых сообщений должна быть просто meta_query и meta_query , поэтому было бы относительно легко изменить это на основе параметра URL. У вас также есть дополнительное преимущество сокращения накладных расходов, сохраняя его на одной странице. Моя единственная забота об этом будет связана с меню, так как вам придется использовать настраиваемые ссылки, а те, которые менее гибкие.

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

 new My_Events_Are_Special; class My_Events_Are_Special { function __construct() { add_filter('rewrite_rules_array', array($this, 'insert_rewrite_rules')); add_filter('query_vars', array($this, 'insert_query_vars')); add_action('wp_loaded', array($this, 'flush_rules')); add_filter('posts_join', array($this, 'posts_join')); add_filter('posts_where', array($this, 'posts_where')); add_filter('posts_orderby', array($this, 'posts_orderby')); } function can_modify_query() { return !is_admin() && is_post_type_archive('event'); } // create rules for the archived events page var $rewrite_rules = array( 'events/archive$' => 'index.php?post_type=event&archive_type=archive', 'events/archive/page/([0-9]+)$' => 'index.php?post_type=event&archive_type=archive&paged=$matches[1]', ); // insert rules into rewrite system function insert_rewrite_rules($rules) { return $this->rewrite_rules + $rules; } // add special query var to system function insert_query_vars($vars) { array_push($vars, 'archive_type'); return $vars; } // flush rules if any are new function flush_rules() { $rules = get_option('rewrite_rules'); $flush = false; foreach ($this->rewrite_rules as $rule => $rewrite) { if (!isset($rules[$rule])) { global $wp_rewrite; $wp_rewrite->flush_rules(); break; } } } // add start and end type to query for events (not in admin) function posts_join($join) { global $wpdb; if ($this->can_modify_query()) { $join .= " JOIN $wpdb->postmeta starts on ($wpdb->posts.ID = starts.post_id AND starts.meta_key = '_starts') "; $join .= " JOIN $wpdb->postmeta ends on ($wpdb->posts.ID = ends.post_id AND ends.meta_key = '_ends') "; } return $join; } // only show future events for the main archive, only past events for the "archive archive" function posts_where($where) { global $wpdb; if ($this->can_modify_query()) { $compare = get_query_var('archive_type') == 'archive' ? '<' : '>'; $where .= " AND ends.meta_value $compare ".time(); } return $where; } // main archive is ordered ascending on event start date, "archive archive" is ordered descending function posts_orderby($orderby) { global $wpdb; if ($this->can_modify_query()) { $order = get_query_var('archive_type') == 'archive' ? 'DESC' : 'ASC'; $orderby = "starts.meta_value $order, $wpdb->posts.post_date $order"; } return $orderby; } }