Как фильтровать сообщения по формату и категории по 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);

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

Сайт доступен здесь

Author: two7s_clash, 2013-03-19

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' );
 1
Author: Pat, 2017-04-13 12:37:54

Возможный подход заключается в создании нового правила перезаписи для обработки пользовательского 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',
    ),
);
 1
Author: KalenGi, 2013-03-26 17:44:03

В итоге я получил следующее:

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

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

 0
Author: two7s_clash, 2013-03-27 20:09:36