it-swarm.com.de

Archive für jede Kategorie auf WP Multisite

Ich arbeite an einer mehrsprachigen Website für einen Kunden. Der einfachste Weg, dies (kostenlos) zu tun, war die Verwendung von WordPress Multisite Language Switcher ( http://lloc.de/msls ). Ich habe eine Weile an dieser Seite gearbeitet und sie hat gut funktioniert.

Ich musste eine generische Vorlage einfügen, damit der Client verschiedene Seiten als Listenseite festlegen konnte. Ich tue dies, indem ich die Kategorie-ID auf der Grundlage des Titels erhalte. Von hier aus liste ich die relevanten Beiträge dieser Kategorie auf. So weit, ist es gut.

Oben auf der Seite muss ein Dropdown-Menü für ein Jahr für ein Archiv dieser Kategorie angezeigt werden. Dies wurde früh ohne Rücksprache in das Design einbezogen, und der Kunde ist fest davon überzeugt, dass dies umgesetzt werden soll.

Ich habe vorher ein Plugin namens 'kwebble' ( http://kwebble.com/projects/wp-plugin-afac ) verwendet, das sogar Obwohl es nicht mehr unterstützt wird, funktioniert es gut und löst viele Probleme. Es funktioniert definitiv bei einer Standardinstallation an einem einzelnen Standort.

Mein Problem ist jetzt, dass ich auf meiner Archivseite die Kategorie ermitteln muss, die sich auf die Herkunftskategorie bezieht. Ich habe versucht, die Kategorie auf der Seite auszugeben, und es macht keinen Reim oder Grund. Wenn ich 2014 auswähle, erhalte ich eine Kategorie (unabhängig von der aktuellen). Wenn ich 2013 auswähle, erhalte ich eine andere Kategorie (wieder ohne Bezug). Diese Archivseiten befinden sich die ganze Zeit über unter der URL: domain.com/blog/2014 usw. Ohne/blog/in der URL scheint es auch nicht zu funktionieren.

Ich bin völlig verloren, wie ich weitermachen soll. Leider kann ich die Website nicht anzeigen, da sie durch die Privatsphäre des Kunden geschützt ist, aber ich kann Beispiele für Code geben, wenn dies hilfreich ist.

Jede Hilfe wäre sehr dankbar.

1
tadywankenobi

Ich dachte, ich würde Sie wissen lassen, wie ich das gelöst habe.

Nach einigen Gesprächen mit einem Kollegen stellte er fest, dass das Hinzufügen eines letzten Jahres zur URL keinen Einfluss auf die angezeigte Seite hat (ich hatte noch keine Zeit, die Gründe dafür herauszufinden).

/ category/subcat/2011 /

zeigt die gleiche Seite an wie

/ category/subcat /

Dies bedeutete, dass ich die URL analysieren und das Jahr daraus entnehmen und der Abfrage hinzufügen konnte.

Ich habe dies zum Header hinzugefügt, um die URL zu analysieren (ich bin sicher, dass es effizientere Möglichkeiten gibt, aber das hat bei mir gut funktioniert):

$current = $_SERVER['REQUEST_URI']; // get the url

$parts = explode('/',$current); // break the url down into parts
$parts = array_slice($parts, 1, -1); // for some reason, first and last array items were blank, so trim them

$pattern = "/\d{4}/"; // set the pattern to match a 4 digit number
$last = end($parts); // get the last item in the array
$year = ''; // set the year variable to be empty

if(preg_match($pattern, $last)) {  // test the last array item against the 4 digit pattern
    $year = $last; // if it is a number, then set the year variable to that value
    $parent_parts = array_slice($parts, 0, -1); // as I need this to work with both the url having a number at the end and on the parent page too (without a year in the URL), make the parent part path by trimming out the year component

    $parent = implode('/',$parent_parts); // remake the url parts
    $parent = '/'.$parent.'/';  // add leading and trailing slashes
} else {
    $parent = $current;  // if the test doesn't find a year, just set the parent to the REQUEST_URI
}

Dies mag für das, was es tut, zu komplex erscheinen, aber die Logik funktioniert. Wenn ich ein Jahr lang einen Test mache:

/ category/subcat /

Ich brauche den Code, um zu wissen, was mit diesem Bit zu tun ist. Da ich diesen Teil der URL immer brauchen werde, wenn die URL lautet:

/ category/subcat/2011 /

Ich muss 2011 davon abschneiden. Dies wird weiter unten deutlicher.

Ich habe die Titelanzeige geändert von:

<h2><?php the_title(); ?></h2>

zu:

<h2><?php echo get_the_title();
if($year !== ''){
    echo ': Archives '.$year;
}
?></h2>

Dies bedeutet nur, dass ich auf der übergeordneten Seite den Titel ausgeben und auf einer Jahresseite am Ende ein ": Archives 2011" anfügen kann, damit es wie ein richtiges Archiv aussieht.

Ich habe eine Dropdown-Liste für das Jahr oben auf der Seite. Früher war dies mit wp_get_archives gefüllt, aber das habe ich jetzt verschrottet. Jetzt muss ich einen ersten Eintrag namens "Alle" haben, der zur übergeordneten Liste mit allen Beiträgen zurückkehrt, und jeder nachfolgende Eintrag in der Dropdown-Liste ist ein Jahr.

<select name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;"> // standard wp_get_archives dropdown jump functionality
        <option value="<?php echo get_bloginfo('url'); ?><?php echo $parent; ?>">All</option> // the "All" option, with the parts formulating the url
        <?php
        $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts ORDER BY post_date DESC"); // getting a list of years for all the posts in the category
        foreach($years as $list_year) : 
        if($list_year == $year) {
            $select = ' selected="selected"'; // ensures that the current year stays selected
        } else {
            $select = '';
        } ?>

        <option value="<?php echo get_bloginfo('url'); ?><?php echo $parent; ?><?php echo $list_year; ?>/"<?php echo $select; ?>><?php echo $list_year; ?></option> // populates the option field
        <?php endforeach; ?>
</select>

Ziemlich einfaches Zeug. Ich habe den größten Teil des Dropdown-Codes erhalten von: http://wordpress.org/support/topic/archives-by-year-this-is-different

Wahrscheinlich muss ich der MySQL-Abfrage eine Kategorie-Komponente hinzufügen.

Schließlich habe ich die WP_Query so geändert, dass sie ein Year-Attribut enthält. Da dieses Feld leer bleibt, wenn die übergeordnete Seite ausgewählt wird, wird standardmäßig das neueste Datum verwendet. Andernfalls wird nur das ausgewählte Jahr angezeigt:

$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : false;
$args = array('cat' => $cat, 'posts_per_page' => '10', 'paged' => $paged, 'year' => $year );
$query = new WP_Query($args);

Nur zum guten Teil habe ich im Paging gelassen, das ich mit dem Plugin wp_pagenavi verwende.

Die Lehre hier ist, dass WordPress Multisite-Archivierung entsetzlich ist. DIY ist viel besser. Ich hoffe das hilft jemand anderem da draußen.

UPDATE: Habe in dieser Hinsicht große Probleme mit der Paginierung. Es scheint keinen einfachen Weg zu geben, an einer Lösung zu arbeiten. WordPress scheint Nizza nicht mit kategoriespezifischen Archiven UND Paginierungen zu spielen.

1
tadywankenobi