Bonjour à tous !

Je fais appel à vos connaissances pour résoudre un petit problème dans une boucle wordpress. J'ai créé une boucle qui permet d'afficher le dernier article publié et de le mettre en forme différemment du reste. La boucle affiche ensuite les articles suivants. Or, j'ai 2 catégories mères, et j'aimerais séparer les articles restants en 2 listes par catégorie. J'obtiens bien 2 listes d'articles mais ils sont mélangés...
Sauriez-vous d'où vient le problème ? Merci d'avance ;)

Voilà mon code :

<?php /*Boucle d'appel du dernier biller publié et de tous les suivants*/
$post_counter = 0;
if(have_posts()) : while(have_posts()) : the_post();
$post_counter++;
if($post_counter == 1) :
?>
<div id="highlight">
    <div id="lire">
    <a href=""><img alt="plus" src="<?php bloginfo('template_directory') ?>/images/plus.png"/> <span>Lire</span></a>
    </div>
    <div id="categories">
        <?php the_category(' /') ?>
    </div>

    <div id="gros_titre">
        <?php the_title() ?>
    </div>
    <div id="hidden_text">
        <?php /*the_content()*/ ?>
    </div>
</div>

<div id="list">
    <div id="list_articles">
    <?php elseif ( in_category('articles') ) : ?>
            <div class="photo_box">
                <h1><?php the_title() ?></h1>
                <?php the_category(' /') ?>
            </div>
    <?php ?>
    </div>
    <div id="list_interviews">
    <?php else : ?>
            <div class="photo_box">
                <h1><?php the_title() ?></h1>
                <?php the_category(' /') ?>
            </div>
    <?php ?>
    </div>
    <?php endif; endwhile; endif; ?>
</div>

13 réponses


GentlemanOwl
Réponse acceptée

(j'aime bien le design : soft et classe)

<?php
global $query_string;
parse_str($query_string, $args);
$args = array(
    'category_name'=>array('articles', 'interviews'),
    'show_posts'=>1
);
$highlight = new WP_query($args);
if($highlight->have_posts()) : while($highlight->have_posts()) : $highlight->the_post();
$last_ID_Post = get_the_ID();;
endwhile; endif;
?>

<div id="list">
    <div id="list_articles">
        <?php
        $articles = new WP_query('category_name=articles&showposts=4');
        if($articles->have_posts()) : while($articles->have_posts()) : $articles->the_post(); ?>
        <?php
            if(get_the_ID() != $last_ID_Post){
                ...
            }
        ?>
        <?php endwhile; endif;
        wp_reset_query(); ?>
    </div>
    <div id="list_interviews">
        <?php
        $interviews = new WP_query('category_name=interviews&showposts=4');
        if($interviews->have_posts()) : while($interviews->have_posts()) : $interviews->the_post(); ?>
        <?php
            if(get_the_ID() != $last_ID_Post){
                ...
            }
        ?>
        <?php endwhile; endif;
        wp_reset_query(); ?>
    </div>

</div>

Je suis pas sur du category_name avec un arrray mais ça peut donner ceci sinon :

<?php
$args = "category_name=articles, interviews&show_posts=1"
$highlight = new WP_query($args);
if($highlight->have_posts()) : while($highlight->have_posts()) : $highlight->the_post();
$last_ID_Post = get_the_ID();;
endwhile; endif;
?>
GentlemanOwl
Réponse acceptée

Ah ouai ... la je vois pas trop parce chez moi ça marche j'ai fait le test avec query_posts aussi...

<?php
$id = get_term_by('slug', 'interviews', 'category');
$id2 = get_term_by('slug', 'articles', 'category');
query_posts('category_in='.$id->term_id.','.$id2->term_id.'.&posts_per_page=1&orderby=date');
if(have_posts()) : while(have_posts()) : the_post();
$last_ID_Post = get_the_ID();
endwhile; endif;
?>

Remplace le truc du haut par celui ci ... Et la je suis sur que ça marche lol ...

Ensuite, si un jour tu veux supprimer le premier posts d'une catégorie il faut utiliser query_posts('offset=1').

Salut ! Déjà ligne 11, 12, 15, 19, 23, 35, 36, 44 et 45 oublie de point virgule( c'est par exemple <?php bloginfo() ;?>, ensuite c'est pas trop clair ce que tu veux.
Tu voudrais afficher le dernier billet posté où ? et selon sa catégorie ?

Merci pour les oublis ^^;

Alors, en détail. Je suis en train de réaliser la page d'accueil sur laquelle j'ai mis en avant le dernier article publié en lui donnant une certaine mis en forme. En dessous, je veux afficher 2 listes côte à côte :

  • une qui liste les derniers articles de la catégorie 'articles'
  • une qui liste les derniers articles de la catégorie 'interviews'

Pour l'instant, j'ai tout. Mais dans les 2 listes les articles ne sont pas triés par catégorie.

Bonjour à tous,

Petite correction ...
Ce n'est pas obligé les ";" tant que l'on appelle une fonction ... enfin en gros tu peux tant que tu te sens pas forcé d'ajouter un ";". C'est plutôt recommander pour éviter les erreurs ... d’inattention et autre ...
Et ça, ça devrait t'aider ...

<?php
$id = get_category_by_slug('slug de ta catégorie');
$array=array(
    'category'=>$id->term_id
);
$articles = get_posts($array);
foreach($articles as $a){
    echo $a->post_title;
}
// var_dump($articles) : pour plus d'informations sur la structure.
?>

Voici la documentation :
get_posts

query_posts peut-être utiliser aussi. Mais pour éviter les problèmes éventuels get_posts est peut-être plus sympa à utiliser... doc

j'espère que ça te sera utile...

Désolé du double post mais je n'arrivais pas à éditer ceci :

query_posts peut-être utiliser aussi. Mais pour éviter les problèmes éventuels get_posts est peut-être plus sympa à utiliser... doc

Merci Imagine-And-Draw, en utilisant query_posts j'arrive à mes fins ou presque. Je n'ai pas trouvé comment imposer aux 2 listes, l'exclusion du dernier article posté toutes catégories confondues...

<?php /*Boucle d'appel du dernier biller publié et de tous les suivants*/
$post_counter = 0;
if(have_posts()) : while(have_posts()) : the_post();
$post_counter++;
if($post_counter == 1) :
?>
<div id="highlight">
    <div id="lire">
    <a href=""><img alt="plus" src="<?php bloginfo('template_directory'); ?>/images/plus.png"/> <span>Lire</span></a>
    </div>
    <div id="categories">
        <?php the_category(' /'); ?>
    </div>

    <div id="gros_titre">
        <?php the_title(); ?>
    </div>
    <div id="hidden_text">
        <?php /*the_content();*/ ?>
    </div>
</div>
<?php endif; endwhile; endif; ?>

<div id="list">
    <div id="list_articles">
        <?php query_posts( array ( 'category_name' => 'articles', 'posts_per_page' => -1 ) );
        while (have_posts()) : the_post(); ?>
            <h1><?php the_title() ?></h1>
            <?php the_category('/ '); ?>
        <?php endwhile; ?>
    </div>
    <div id="list_interviews">
        <?php query_posts( array ( 'category_name' => 'interviews', 'posts_per_page' => -1 ) );
        while (have_posts()) : the_post(); ?>
            <h1><?php the_title() ?></h1>
            <?php the_category('/ '); ?>
        <?php endwhile; ?>
    </div>

</div>

Heu, je crois que il y a un truc comme excluded mais si tu veux pas te casser la tete. Méthode de "bourrin", tu fait ceci :

$i=0;
while ...
$i ++;
if($i==1){
    // n'affiche rien ... 
}
else{
    // affiche le reste ... the_title et tout
}
// 1 ou 0 ... hum mal au crane donc la logique est en baisse ... faut dire que vu l'heure ... mais j'ai une préférence pour 1

J'ai essayé ta méthode bourrin et ça marche mais trop bien :p
Ça me vire le dernier post de chaque catégorie et non juste le dernier post publié. Et en cherchant une autre solution, j'ai lu que l'abus du query_posts provoque un ralentissement général. Je me suis donc tourné vers le WP_query et j'en ai sorti ce code :

<?php /* Requête qui appelle le dernier post */
$highlight = new WP_query('showposts=1');
if($highlight->have_posts()) : while($highlight->have_posts()) : $highlight->the_post(); ?>
blabla
<?php endwhile; endif; ?>

<div id="list">
    <div id="list_articles">
        <?php /* Requête qui appelle la liste des 4 derniers articles de la catégorie 'articles' */
        $articles = new WP_query('category_name=articles&showposts=4');
        if($articles->have_posts()) : while($articles->have_posts()) : $articles->the_post(); ?>
        blabla
        <?php endwhile; endif;
        wp_reset_query(); ?>
    </div>
    <div id="list_interviews">
        <?php /* Requête qui appelle la liste des 4 derniers articles de la catégorie 'interviews' */
        $interviews = new WP_query('category_name=interviews&showposts=4');
        if($interviews->have_posts()) : while($interviews->have_posts()) : $interviews->the_post(); ?>
        blabla
        <?php endwhile; endif;
        wp_reset_query(); ?>
    </div>

</div>

Serait-il possible de récupérer l'ID du dernier post dans la première requête, pour ensuite l'exclure des 2 requêtes suivantes ?

Ah ... Tu utilise le même principe seulement tu utilise show_posts 1 sans category_name ... tu sauvegarde l'id de ton post dans une variable puis ensuite tu vérifie dans chacune de tes listes si l'id correspond ou non. Si elle correspond tu n'affiche rien sinon tu laisse coulé.

if($Post_ID_to_del = get_the_ID()){}else{
...
}

Non, ça ne marche pas. ^^;
Je mets une image du résultat que je cherche à obtenir, c'est plus parlant :

(Merci ^^)
Mais pas mieux, aucune des deux solutions ne fonctionnent... Ça ne vire toujours pas le dernier post publié. Je précise que je suis WordPress 2.9.2, ça a peut-être son importance.

Super !! Ça marche, cette fois-ci rien à redire :p
Merci beaucoup Imagine-And-Draw ;)