Разрешить фильтрацию циклов для всех категорий

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

Solutions Collecting From Web of "Разрешить фильтрацию циклов для всех категорий"

Я бы рекомендовал определить запрос var для определения ваших настраиваемых фильтров, а затем передать (дезинфицированное) значение этого запроса var в query_posts() (чтобы изменить первичный цикл, если это ваш ojbective).

Сначала (в functions.php ) определите свой запрос var:

 <?php function wpse47974_queryvars( $qvars ) { $qvars[] = 'wpse47974_filter'; return $qvars; } add_filter( 'query_vars', 'wpse47974_queryvars' ); ?> 

Затем в шаблоне запросите свой запрос var. Я предполагаю, что у вас есть предопределенный набор фильтров, определенных в массиве, $wpse47974_valid_filters :

 <?php // Query Tag Filter $wpse47974_filter = ''; if ( isset( $wp_query->query_vars['wpse47974_filter'] ) && in_array( $wp_query->query_vars['wpse47974_filter'], $wpse47974_valid_filters ) ) { $wpse47974_filter = $wp_query->query_vars['wpse47974_filter']; } ?> 

Далее (где-то) вам нужно будет определить параметры запроса на основе ваших типов фильтров. Я оставляю это как упражнение для ОП; однако в следующем коде эти параметры запроса представлены « $wpse47974_filter_args['key'] => 'value'; ", и мы добавляем их в массив здесь (в файле шаблона):

 <?php // Define an empty array to hold our filter parameters. // This needs to be an array, in order not to generate // errors later in the array_merge(), if no filter parameters // are being applied to the default query $wpse47974_filter_args = array(); // If our query var is set, apply the filter parameter if ( '' != $wpse47974_filter ) { $wpse47974_filter_args['key'] = 'value'; }; ?> 

Затем, все еще в файле шаблона, объедините запрос по умолчанию с нашими параметрами фильтра выше, чтобы изменить query_posts() (обратите внимание: перед выходом Loop):

 <?php // Globalize $wp_query global $wp_query; // Merge the default query with our filter parameters $wpse47974_query_posts_args = array_merge( $wp_query->query, $wpse47974_filter_args ); // Modify the default query query_posts( $wpse47974_query_posts_args ); ?> 

Теперь запрос первичного цикла изменяется в соответствии с вашим фильтром.

редактировать

Я забыл важную роль: как получить URL-адрес запроса в URL-адрес!

В вашем шаблоне, где у вас есть ссылки на фильтры (или кнопки или что-то еще), я предполагаю, что у вас есть якорь HTML. Установите атрибут href следующим образом, используя add_query_arg() :

 <a href="<?php echo add_query_arg( array( 'wpse47974_filter' => 'value' ) ); ?>">FILTER NAME</a> 

Теперь, когда вы нажимаете на ссылку, страница перезагружается, а ваш запрос var добавляется к URL-адресу.