Пользовательский заказ на главную страницу

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

Сейчас я использую строку запроса для определения порядка сортировки. Например: http://example.com/?sort=popular или http://example.com/?sort=trending . Затем в home.php я проверяю строку запроса и редактирую предложение wp_query .

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

В home.php

 /** * check query for most popular. */ function check_for_popular() { return get_query_var('sort') == "popular"; } function mp_home_loop() { global $wp_query; if( check_for_popular() ) { $query = $wp_query->query_vars; $wp_query = new WP_Query( wp_parse_args( array( 'meta_key' => 'popularity_score', 'orderby' => 'meta_value_num', 'order' => 'DESC', ), $query ) ); } include( CHILD_DIR . '/mp_home_loop.php' ); } 

В functions.php

 add_filter('query_vars', 'add_query_vars' ); function add_query_vars( $qvars ) { $qvars[] = 'sort'; return $qvars; } 

Solutions Collecting From Web of "Пользовательский заказ на главную страницу"

С точки зрения именования кажется, что термин «фильтр» будет более уместным, поскольку сначала вы фильтруете по критериям, а затем при заказе применяется сортировка (направленность). Но это скорее точка зрения на именование …

Из структуры кода, если вы используете метод check_for_popular() в нескольких местах, имеет смысл структурировать его так же, как и вы. Если это только для фильтрации функции, я бы пошел с оператором switch в args для WP_Query а затем выполнил запрос. Что-то в этом роде:

 function mp_home_loop() { global $wp_query; $filter_args = array(); switch( get_query_var('sort') ){ case 'popular': $filter_args = array( 'meta_key' => 'popularity_score', 'orderby' => 'meta_value_num', 'order' => 'DESC' ); break; case 'trending': // obviously assign your own query args $filter_args = array( 'meta_key' => 'trending_score', 'orderby' => 'meta_value_num', 'order' => 'DESC' ); break; } $wp_query = new WP_Query( wp_parse_args( $filter_args, $wp_query->query_vars ) ); include( CHILD_DIR . '/mp_home_loop.php' ); } 

В зависимости от того, как этот запрос используется (например, если он управляет вашим основным запросом), вы можете перенести его дальше на крючок pre_get_posts; однако, поскольку вы упомянули, что именно для домашней страницы я предполагаю, что у вас есть этот отдельный подраздел страницы.