Эффективно сортировать только определенные категории по специальному полю

У меня есть сайт с около 1000 сообщений, распространяемых более чем на 70 или 80 категорий. Некоторые из этих категорий требуют, чтобы сообщения сортировались по настраиваемому полю, а другие – нет.

У меня есть рабочее решение, имея файлы шаблонов более 60 категорий (например, category-123.php, category-124.php), и каждый из них вызывает отдельный файл цикла:

get_template_part( 'loop-123', 'category' ); 

Затем файл loop-123 запускает новый запрос и сортирует его правильно, прежде чем передать его в цикл:

 <?php $the_query = new WP_Query("cat=123&meta_key=programnumber&orderby=meta_value&order=ASC"); ?> <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> 

Тем не менее, должен быть более эффективный способ сделать это, чем создавать 60+ пар файлов. Я просто не вижу этого.

Solutions Collecting From Web of "Эффективно сортировать только определенные категории по специальному полю"

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

Ниже показано это, а также поле настроек бонусов администратора (в разделе «Чтение»), чтобы выбрать категории, к которым применяется специальная сортировка, – посмотрите, насколько легко API настроек действительно!

 /** * Intercept the query & attach our own parameters if the conditions are met. */ function wpse_42457_custom_category_order( $wp_query ) { if ( ! $wp_query->is_category() ) // save proceeding processing return; $special_categories = wp_parse_id_list( get_option( 'sorted_categories' ) ); if ( $wp_query->is_category( $special_categories ) ) { // We've got a winner - set our special params. $wp_query->set( 'meta_key', 'programnumber' ); $wp_query->set( 'orderby', 'meta_value' ); $wp_query->set( 'order', 'ASC' ); } } add_action( 'pre_get_posts', 'wpse_42457_custom_category_order' ); /** * Register the sorted categories option & the settings field. */ function wpse_42457_admin_init() { add_settings_field( 'sorted_categories', 'Special Categories', 'wpse_42457_setting_field', 'reading', 'default' ); register_setting( 'reading', 'sorted_categories', 'wpse_42457_setting_sanitize' ); } add_action( 'admin_init', 'wpse_42457_admin_init' ); /** * Sanitize our checked categories by turning back to a comma-delimited string. * * This'll save bytes in the options table, plus it can be "unserialized" more * efficiently with wp_parse_id_list() when it's actually needed. */ function wpse_42457_setting_sanitize() { // wp_terms_checklist uses "post_category" POST name. if ( isset( $_POST['post_category'] ) ) $value = $_POST['post_category']; else $value = array(); // none checked return implode( ',', wp_parse_id_list( $value ) ); } /** * Display the sorted categories field. */ function wpse_42457_setting_field() { // Please forgive me for this dirty HTML! ?> <style>#sorted_categories li li { margin: 0 0 0 15px }</style> <ul id="sorted_categories"> <?php wp_terms_checklist( 0, array( 'selected_cats' => wp_parse_id_list( get_option( 'sorted_categories' ) ), 'checked_ontop' => false, 'taxonomy' => 'category' )); ?> </ul> <?php } 

Хотя я всегда чувствую, что должен поощрять других к тому, чтобы предпринимать шаги для себя, это оказалось проще для кода, чем для прогулок – надеюсь, что это будет беззаботно!


Вам нужно будет отбросить это в настраиваемом плагине или в functions.php вашей темы.

Как насчет этого, создайте опцию в таблице опций (в базе данных) с массивом идентификаторов категорий, которым нужна пользовательская сортировка ex:

 <?php $cats_to_sort = array(21,33,43,66); //add as many as you need. update_option('cats_to_sort',$cats_to_sort); ?> 

затем создайте один файл category.php с простым циклом, но перед циклом проверьте, нужно ли эту категорию сортировать по настраиваемому полю ex:

 <?php //get the saved array $cats_to_sort = get_option('cats_to_sort'); //get the category id, this works for custom taxonomies as well. $term_slug = get_query_var( 'term' ); $taxonomyName = get_query_var( 'taxonomy' ); $term = get_term_by( 'slug', $term_slug, $taxonomyName ); if (in_array($term->term_id,$cats_to_sort)){ query_posts("cat=".$term->term_id."&meta_key=programnumber&orderby=meta_value&order=ASC"); } //you loop here ?> , <?php //get the saved array $cats_to_sort = get_option('cats_to_sort'); //get the category id, this works for custom taxonomies as well. $term_slug = get_query_var( 'term' ); $taxonomyName = get_query_var( 'taxonomy' ); $term = get_term_by( 'slug', $term_slug, $taxonomyName ); if (in_array($term->term_id,$cats_to_sort)){ query_posts("cat=".$term->term_id."&meta_key=programnumber&orderby=meta_value&order=ASC"); } //you loop here ?>