it-swarm.com.de

Kategoriearchiv nach Jahr mit Permalink-Unterstützung/category/YYYY

Ich bin gerade dabei, einen neuen Typ von Site-Archiv in WordPress zu erstellen, mit dem Benutzer nach Kategorie UND nach Jahr filtern können, anstatt nach der Standardkategorie OR Jahr.

Ich hoffe, ein Sidebar-Widget zu erstellen, das die Benutzeroberfläche erstellt, suche aber nach Ideen und Ratschlägen zum Erstellen des benutzerdefinierten Permalink-Setups. Idealerweise arbeitet das Archiv mit URLs wie folgt:

/ kategorie/jahr /

/ Kategorie-1/Jahr /

usw.

Ich muss nicht tiefer als bis zu einem Jahr filtern. Ich habe dieses Codefragment entdeckt, aber es funktioniert nicht wie erwartet.

Vielen Dank

5
Scott

Auf Anregung von @StephenHarris habe ich den Code etwas weiterentwickelt und mir folgendes ausgedacht:

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;
}

Auf diese Weise kann eine Site URLs unterstützen, die wie folgt aussehen:

/ news/meine-kategorie/jahr/2011/seite/2

ebenso gut wie

/ news/meine-kategorie/jahr/2011

Dem Posts-/Blog-Teil meiner Site wird das Präfix "news" vorangestellt. Daher möchten Sie möglicherweise den ersten Teil der regulären Ausdrücke optimieren und das Wort "news" entfernen.

Wenn Sie es verwenden möchten, stellen Sie sicher, dass Sie Ihre Umschreiberegeln löschen, indem Sie die Seite mit den Einstellungen für Permalinks besuchen.

2
Scott

Was Sie suchen, ist ein Endpunkt . Es gibt bereits mehrere dieser Funktionen: /feed/some-feed/ für Feeds oder /trackback/ für Posts. Das sind beide Endpunkte.

Glücklicherweise bietet WordPress eine praktische Funktion, mit der Sie Ihre eigenen Endgeräte ganz einfach hinzufügen können. add_rewrite_endpoint

Dies ist der gesamte Code, den Sie benötigen, damit Ihre jährlichen Kategoriearchive funktionieren:

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

Als Plugin: https://Gist.github.com/1296860

Es funktioniert genau wie die Antwort von Stephen Harris, und Sie können ein jährliches Kategoriearchiv erreichen, indem Sie yoursite.com/category/some-cat-slug/year/2011/ besuchen.

Durch das Hinzufügen eines Endpunkts wird eine Abfragevariable mit demselben Namen wie das erste Argument der Funktion add_rewrite_endpoint erstellt. In diesem Fall year. Da diese Abfragevariable bereits in WP vorhanden ist (um die datenbasierten Archive zu pflegen), müssen wir hier eigentlich nichts Besonderes tun.

6
chrisguitarguy

Dies ist nicht getestet, aber versuchen Sie es (nachdem Sie den Code hinzugefügt haben, müssen Sie zu Einstellungen> Permalinks gehen und auf Speichern klicken, damit er wirksam wird):

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;
}

Das sollte dauern: http://yourwebsite.com/foobar/year/2011 und die Ergebnisse in der Kategorie foobar im Jahr 2011 zurückgeben.

Ich bin mir nicht sicher, ob Struktur der beste Weg ist. Um unerwünschte Probleme zu vermeiden, würde ich vorschlagen, Folgendes zu verwenden: http://yourwebsite.com/category/foobar/year/2011 und stattdessen Folgendes zu verwenden:

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

Hoffe das hilft!

2
Stephen Harris

Ich habe es geschafft, indem ich die Lösung von StephenHarris und Scott mit einer kleinen Modifikation verwendet habe:

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

Beachten Sie den in der Definition der Umschreiberegeln hinzugefügten index.php.

0
vlatkorun