web-dev-qa-db-fra.com

Comment filtrer les publications par format et catégorie via URL?

Je me suis dit que je pouvais filtrer les publications par format simplement en faisant/type/{format} par exemple./type/gallery/dans l'URL.

Vous cherchez un moyen de filtrer les catégories par-dessus, quelque chose comme:/type/galerie/catégorie/installation ou/type/galerie/art.

J'ai compris la requête, mais je ne sais pas comment gérer le bit d'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);

Des idées? Je suppose que je dois intercepter le permalien et le transmettre à ma requête ...

Le site est accessible ici

1
two7s_clash

J'ai fini avec ceci:

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');

Il n'est pas nécessaire d'ajouter de nouveaux vars de requête. Vous pouvez obtenir les deux taxonomies prêtes à l'emploi: les catégories peuvent être interrogées avec "? Category_name = x" et les formats de publication avec "? Post_format = x".

De manière confuse, les formats de publication sont une taxonomie et pas un type de publication personnalisé, tout en ayant la taxonomie de "type". Par exemple. vous les filtrez comme suit:

mysite.com/type/gallery

On dirait que "/ format /" serait une meilleure taxonomie pour éviter toute confusion avec le type de message personnalisé.

0
two7s_clash

Une approche possible consiste à créer une nouvelle règle de réécriture pour gérer l'URL personnalisée. Je n'ai pas testé le code, mais cela ressemble à ceci:

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');

Ensuite, vous accéderiez à la nouvelle variable comme suit:

$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
KalenGi

Je fais quelque chose de similaire, mais pour les pages membres. J'ai pu utiliser le code de ma réponse liée ici, qui analyse les informations de l'URL pouvant être manipulées dans WordPress.

https://wordpress.stackexchange.com/a/91399/12920

Voici un extrait de la partie relative à la gestion des URL qui vous permettra peut-être de commencer? Certes, vous faites quelque chose de différent de moi, mais la fonction sous-jacente devrait être très similaire.

// 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
Pat