Как фильтровать сообщения по формату и категории по URL-адресу?
Я понял, что могу фильтровать сообщения по формату, просто выполнив /тип/{формат}, например /тип/галерея/ в URL.
Ищу способ фильтрации по категориям поверх этого, что-то вроде /тип/галерея/категория/инсталляция или /тип/галерея/искусство.
Я разобрался с запросом, но не знаю, как обрабатывать бит URL:
$galleryquery = wp_parse_args($query_string);
$galleryquery['tax_query'] = array(
array(
'taxonomy' => 'post_format',
'terms' => array('post-format-gallery'),
'field' => 'slug',
),
array(
'taxonomy' => 'category',
'terms' => array('installation'),
'field' => 'slug',
),
);
query_posts($galleryquery);
Идеи? Я предполагаю, что мне нужно перехватить постоянную ссылку и каким-то образом передать ее в свой запрос...
Сайт доступен здесь
3 answers
Я делаю нечто подобное, но для страниц участников. Я смог использовать код в своем ответе, связанный здесь, который анализирует информацию в URL, которой можно манипулировать в WordPress.
Https://wordpress.stackexchange.com/a/91399/12920
Вот фрагмент части обработки URL-адресов, которая, возможно, поможет вам начать? Конечно, вы делаете что-то другое, чем я, но основная функция должна быть очень похожа.
// Catch the URL and redirect it to a template file
function userpage_rewrite_catch() {
global $wp_query;
if ( array_key_exists( 'member', $wp_query->query_vars ) ) {
// Do something if member is in the URL
include (TEMPLATEPATH . '/user-profile.php');
exit;
}
}
add_action( 'template_redirect', 'userpage_rewrite_catch' );
Возможный подход заключается в создании нового правила перезаписи для обработки пользовательского URL-адреса. Я не тестировал код, но он выглядит примерно так:
function add_category_query_var($query_vars) {
array_push($query_vars, 'post_type');
array_push($query_vars, 'post_category');
return $query_vars;
}
add_filter('query_vars','add_category_query_var');
/* create new rewrite rule*/
function add_category_rewrite_rule($wp_rewrite_rules) {
$new_rewrite_rule['type/([^/]+)/category/([^/]+)/?$'] = 'index.php?post_type=$matches[1]&post_category=$matches[2]';
$wp_rewrite_rules = $new_rewrite_rule + $wp_rewrite_rules;
return $wp_rewrite_rules;
}
add_filter('rewrite_rules_array', 'add_category_rewrite_rule');
Затем вы получите доступ к новой переменной следующим образом:
$galleryquery['tax_query'] = array(
array(
'taxonomy' => 'post_format',
'terms' => array('post-format-gallery'),
'field' => 'slug',
),
array(
'taxonomy' => 'category',
'terms' => array($_GET['post_category']),
'field' => 'slug',
),
);
В итоге я получил следующее:
function when_rewrite_rules( $wp_rewrite ) {
$newrules = array();
$new_rules['type/([^/]+)/category/([^/]+)/?$'] = 'index.php?post_format=$matches[1]&category_name=$matches[2]';
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_filter('generate_rewrite_rules','when_rewrite_rules');
Нет необходимости добавлять новые переменные запроса. Вы можете получить обе таксономии из коробки: категории могут запрашиваться с помощью "?имя_категории=x" и форматов сообщений с "?post_format=x".
К сожалению, форматы сообщений являются таксономией, а не пользовательским типом сообщений, но имеют таксономию "тип". Например, вы фильтруете их следующим образом:
Mysite.com/type/gallery
Похоже, что "/формат/" будет лучшей таксономией для избегайте путаницы с пользовательским типом записи.