web-dev-qa-db-fra.com

Archives par catégories avec support permanent/catégorie/AAAA

Je cherche actuellement à créer un nouveau type d'archive de site dans WordPress qui permette aux utilisateurs de filtrer par catégorie ET par année plutôt que par la catégorie par défaut OR année.

J'espère créer un widget de barre latérale qui crée l'interface, mais je cherche des idées et des conseils sur la création d'une configuration personnalisée à permalien. Idéalement, l’archive fonctionnera avec des URL du type:

/ catégorie/année /

/ catégorie-1/an /

etc.

Je n'ai aucune obligation de filtrer plus profondément que l'année. J'ai découvert cet extrait de code mais cela ne fonctionne pas comme prévu.

Merci

5
Scott

En suivant les suggestions de @StephenHarris, j'ai développé le code un peu plus loin et propose ce qui suit:

add_action('generate_rewrite_rules', 'my_rewrite_rules');
function my_rewrite_rules( $wp_rewrite ) {

    // handles paged/pagination requests
    $new_rules = array('news/(.+)/year/(.+)/page/?([2-9][0-9]*)' => '?category_name='.$wp_rewrite->preg_index(1).'&year='.$wp_rewrite->preg_index(2).'&paged='.$wp_rewrite->preg_index(3));

    // handles standard requests
    $new_rules1 = array('news/(.+)/year/(.+)' => '?category_name='.$wp_rewrite->preg_index(1).'&year='.$wp_rewrite->preg_index(2));

    // Add the new rewrite rule into the top of the global rules array
    $wp_rewrite->rules = $new_rules + $new_rules1 + $wp_rewrite->rules;
}

Cela permet à un site de prendre en charge des URL ressemblant à ceci:

/ nouvelles/ma-catégorie/année/2011/page/2

aussi bien que

/ nouvelles/ma-catégorie/année/2011

La partie posts/blog de mon site est précédée de "news". Vous pouvez donc modifier la première partie des expressions régulières et supprimer le mot "news".

Si vous allez l'utiliser, assurez-vous de vider vos règles de réécriture en visitant la page des paramètres de permaliens.

2
Scott

Ce que vous cherchez, c'est un endpoint . Il en existe déjà plusieurs: /feed/some-feed/ pour les flux ou /trackback/ pour les publications. Ce sont les deux points finaux.

Heureusement, WordPress fournit une fonction pratique qui facilite l’ajout de vos propres finalistes. add_rewrite_endpoint

C'est tout le code dont vous avez besoin pour que vos archives de catégorie annuelles fonctionnent:

<?php
add_action( 'init', 'wpse31422_init' );
function wpse31422_init()
{
    add_rewrite_endpoint( 'year', EP_CATEGORIES );
}

En tant que plugin: https://Gist.github.com/1296860

Cela fonctionne exactement comme la réponse de Stephen Harris, et vous pouvez accéder à une archive de catégorie annuelle en visitant yoursite.com/category/some-cat-slug/year/2011/.

L'ajout d'un noeud final crée une variable de requête portant le même nom que le premier argument de la fonction add_rewrite_endpoint. Dans ce cas, year. Comme cette requête var existe déjà dans WP (pour prendre en charge les archives basées sur les données), nous n'avons pas vraiment besoin de faire quelque chose de spécial ici.

6
chrisguitarguy

Ceci n’a pas été testé, mais essayez (après avoir ajouté le code, vous devez accéder à Paramètres> Permaliens et cliquer sur Enregistrer pour qu’il prenne effet):

add_action('generate_rewrite_rules', 'my_rewrite_rules');
function my_rewrite_rules( $wp_rewrite ) {
  $new_rules = array(
     '(.+)/year/(.+)' => '?category_name='.$wp_rewrite->preg_index(1).'&year='.$wp_rewrite->preg_index(2),
       );

  // Add the new rewrite rule into the top of the global rules array
  $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}

Cela devrait prendre: http://votrewebsite.com/foobar/année/2011 et renvoyer les résultats dans la catégorie foobar, en 2011.

Je ne suis pas sûr que cette structure soit la meilleure façon de s'y prendre. Pour éviter les problèmes indésirables, je vous suggérons d'utiliser: http://votrewebsiteweb.com/category/foobar/year/2011 et d'utiliser plutôt:

'category/(.+)/year/(.+)' => '?category_name='.$wp_rewrite->preg_index(1).'&year='.$wp_rewrite->preg_index(2)

J'espère que cela t'aides!

2
Stephen Harris

J'ai réussi à le faire fonctionner en utilisant la solution de StephenHarris et Scott avec une petite modification:

function add_events_by_year_rewrite_rules($wp_rewrite){
    // handles paged/pagination requests
    $new_rules_with_pagination = array('c/(.+)/year/(.+)/page/?([2-9][0-9]*)' => 'index.php?category_name='.$wp_rewrite->preg_index(1).'&year='.$wp_rewrite->preg_index(2).'&paged='.$wp_rewrite->preg_index(3));

    // handles standard requests
    $new_rules_without_pagination = array('c/(.+)/year/(.+)' => 'index.php?category_name='.$wp_rewrite->preg_index(1).'&year='.$wp_rewrite->preg_index(2));

    // Add the new rewrite rule into the top of the global rules array
    $wp_rewrite->rules = $new_rules_with_pagination + $new_rules_without_pagination + $wp_rewrite->rules;

    return $wp_rewrite->rules;
}

add_filter('generate_rewrite_rules', 'add_events_by_year_rewrite_rules');

Notez le index.php ajouté dans la définition des règles de réécriture.

0
vlatkorun