web-dev-qa-db-fra.com

Archives pour chaque catégorie sur WP Multisite

Je travaille sur un site multilingue pour un client. Le moyen le plus simple de le faire (gratuitement) est d’utiliser WordPress Multisite Language Switcher ( http://lloc.de/msls ). Je travaille sur ce site depuis un certain temps et tout fonctionne bien.

J'ai eu l'obligation d'inclure un modèle générique pour permettre au client de définir différentes pages en tant que page de liste. Je le fais en obtenant l'ID de la catégorie sur la base du titre. À partir de là, je liste les postes pertinents de cette catégorie. Jusqu'ici tout va bien.

En haut de la page, je dois inclure un menu déroulant pour une archive de cette catégorie. Cela a été inclus au début de la conception sans consultation et le client est catégorique: il veut que cela soit mis en place.

J'ai utilisé un plugin appelé 'kwebble' ( http://kwebble.com/projects/wp-plugin-afac ) auparavant, qui, même bien que n'étant plus pris en charge, fonctionne correctement et résout de nombreux problèmes, et fonctionne certainement sur une installation standard à site unique.

Mon problème maintenant est que sur ma page d'archive, je dois détecter la catégorie relative à la catégorie d'origine. J'ai essayé de sortir la catégorie sur la page et cela ne fait ni rime ni raison. Si je sélectionne 2014, j'obtiens une catégorie (non liée au courant). Si je sélectionne 2013, j'obtiens une catégorie différente (à nouveau non liée). Pendant ce temps, ces pages d'archives sont sous l'URL: domain.com/blog/2014 etc. Je n'arrive pas à le faire fonctionner sans le/blog/dans l'URL.

Je suis complètement perdu quant à la façon de continuer. Malheureusement, je ne peux pas montrer le site car il protège la confidentialité du client, mais je peux donner des exemples de code si cela peut aider.

Toute aide serait très appréciée.

1
tadywankenobi

Je pensais que je vous ferais savoir comment j'ai résolu ce problème.

Après une discussion avec un collègue, il a fait remarquer que l'ajout d'une année de fin à l'URL n'a pas d'incidence sur la page affichée (je n'ai pas encore eu le temps de trouver la raison de cela):

/ catégorie/subcat/2011 /

affiche la même page que

/ catégorie/subcat /

Cela signifiait que je pouvais analyser l'URL, en prendre l'année et l'ajouter à la requête.

J'ai ajouté ceci à l'en-tête pour analyser l'URL (je suis sûr qu'il existe des moyens plus efficaces, mais cela a bien fonctionné pour moi):

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

Cela peut sembler excessivement complexe pour ce qu'il fait, mais la logique fonctionne. Si je fais un test pendant un an:

/ catégorie/subcat /

J'ai besoin du code pour savoir quoi faire avec ce bit. Comme je vais toujours avoir besoin de cette partie de l'URL, si l'URL est:

/ catégorie/subcat/2011 /

Je vais avoir besoin de couper 2011 hors de celui-ci. Cela devient plus évident plus bas.

J'ai changé l'affichage du titre de:

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

à:

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

Cela signifie simplement que sur la page parente, je sors le titre et sur une sous-page d'année, je peux ajouter un ": Archives 2011" à la fin de celui-ci pour lui donner l'apparence d'une archive appropriée.

J'ai un menu déroulant pour l'année en haut de la page. Auparavant, cela était peuplé de wp_get_archives, mais je l'ai abandonné maintenant. Maintenant, je dois avoir un premier élément appelé "Tous" qui reviendra au parent, la liste complète des publications et chaque élément suivant dans la liste déroulante est une année.

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

Des choses assez simples. J'ai obtenu l'essentiel du code déroulant de: http://wordpress.org/support/topic/archives-by-year-this-is-different

J'ai probablement besoin d'ajouter un composant de catégorie à la requête MySQL.

Enfin, j'ai changé le WP_Query, pour inclure un attribut year. Comme il est laissé vide lorsque la page parent est sélectionnée, la date la plus récente est celle par défaut. Sinon, il ne montre que l'année sélectionnée:

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

Pour faire bonne mesure, j’ai laissé dans la pagination que j’utilise avec le plugin wp_pagenavi.

La leçon à tirer est que l’archivage WordPress multisites est épouvantable. Le bricolage c'est beaucoup mieux. J'espère que cela aide quelqu'un d'autre là-bas.

UPDATE: Nous avons rencontré de gros problèmes de pagination à cet égard. Il ne semble pas y avoir de solution simple à ce problème, même si l’on cherche une solution. WordPress ne semble tout simplement pas jouer à Nice avec des archives ET des paginations spécifiques à une catégorie.

1
tadywankenobi