Exclure d’une boucle le contenu d’une autre boucle (Créer un compte)

  • Statut : non résolu
15 sujets de 1 à 15 (sur un total de 37)
  • Auteur
    Messages
  • #544228
    erwan21a
    Participant
    Initié WordPress
    12 contributions

    Bonjour à tous,

    – Version de WordPress : 4.0
    – Thème utilisé : thème personnel
    – Extensions en place : aucune
    – Nom de l’hebergeur : OVH

    Pour me présenter rapidement, je suis web designer (et intégrateur html/css/less) et je réalise actuellement un site d’actualité pour un collectif. Souhaitant apprendre à créer des thèmes WordPress, je me suis lancé d’après un thème vierge afin de passer chacune des étapes (et des difficultés).
    Je ne suis clairement pas développeur mais j’ai une bonne pratique des langages informatiques pour travailler au quotidien au contact direct de langage back office (technologies.NET).

    Voici ce que je souhaite réaliser :
    – En haut de la page d’accueil doit être afficher d’une manière différente le dernier article de la catégorie « special ».
    – Au dessous doivent être affiché les autres articles, sauf bien sur celui qui aura été affiché en haut.

    Dans mon fichier home.php j’ai donc affiché une première boucle n’affichant que le dernier article de la catégorie « special ».
    Plus bas, j’appelle ensuite la boucle générique de mon thème.
    Voici le fichier home.php

    <?php get_header(); ?>

    <?php if ( have_posts() ) : ?>
    <?php
    $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
    if ($paged < 2) { ?>
    <?php
    $cover_args = array(
    'post_type' => ‘post’,
    ‘posts_per_page’ => 1,
    ‘category_name’ => ‘special’
    );
    $custom_query = new WP_Query( $cover_args );
    ?>

    <?php while ( $custom_query->have_posts() ) : $custom_query->the_post(); ?>
    <?php get_template_part( 'partials/cover-post', get_post_format() ); ?>
    <?php endwhile; ?>
    <?php wp_reset_postdata(); ?>
    <?php } ?>
    <?php endif;?>


    <div class="wrapper">
    <div class="str-ctn">
    <div class="str2c left">
    <div class="str-main">
    <?php get_template_part( 'loop'); ?>
    </div>
    <div class="str-side">
    <?php get_sidebar(); ?>
    </div>
    </div>

    Au sein du fichier loop.php, je définie des conditions d’affichage de la boucle.
    Voici le fichier loop.php

    <?php if ( is_home() ) : ?>
    <?php
    $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
    $custom_args = array(
    'post_type' => ‘post’,
    ‘posts_per_page’ => 4,
    ‘paged’ => $paged,
    // exclusion à ajouter
    );
    $custom_query = new WP_Query( $custom_args );
    ?>
    <?php else: ?>
    <?php
    $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
    $custom_args = array(
    'post_type' => ‘post’,
    ‘posts_per_page’ => 5,
    ‘paged’ => $paged
    );
    $custom_query = new WP_Query( $custom_args );
    ?>
    <?php endif; ?>


    <?php if ( $custom_query->have_posts() ) : ?>
    <?php while ( $custom_query->have_posts() ) : $custom_query->the_post(); ?>
    <?php get_template_part( 'partials/post', get_post_format() ); ?>
    <?php endwhile; ?>

    <?php
    if (function_exists(custom_pagination)) {
    custom_pagination($custom_query->max_num_pages, » »,$paged);
    }
    ?>
    <?php wp_reset_postdata(); ?>
    <?php else: ?>
    <?php get_template_part( 'partials/no-post'); ?>
    <?php endif; ?>

    Il me semble, d’après ce que j’ai lu, qu’il faut utiliser la fonction post__not_in afin d’exclure des posts de la boucle.
    Ma question est : comment faire communiquer ces deux boucles afin de donner la valeur nécessaire à post__not_in ?
    J’ai regardé un peu sur le passage de variable mais mes essais n’ont pas été concluant.

    Peut-être que je ne m’y prend pas du tout de la bonne manière également.

    En vous remerciant de vos conseils.

    #982879
    Anonyme
    Invité
    Maître WordPress
    34072 contributions

    Ce message a été supprimé suite à la demande de l’auteur.

    #982880
    erwan21a
    Participant
    Initié WordPress
    12 contributions

    Bonjour noaneo, merci de ta réponse.

    ‘post__not_in’ attend en effet un tableau d’ID à exclure.
    Ma grande question est : comment lui communiquer ?

    Le paramètre ‘offset’ n’est lui pas assez complet pour réaliser ce que je souhaite. Il ne permet que de créer un décalage en début (ou en fin, je suppose) de liste.

    🙂

    #982881
    Anonyme
    Invité
    Maître WordPress
    34072 contributions

    Ce message a été supprimé suite à la demande de l’auteur.

    #982882
    erwan21a
    Participant
    Initié WordPress
    12 contributions

    L’exclusion en elle même n’est pas un problème.
    Le réel sujet de ce topic est la transmission de l’information (les ID de la première boucle) de la première boucle en direction de la seconde. Ces deux boucles de trouvant en sus dans des fichiers différents.

    #982883
    Anonyme
    Invité
    Maître WordPress
    34072 contributions

    Ce message a été supprimé suite à la demande de l’auteur.

    #982884
    didier07
    Participant
    Maître WordPress
    1964 contributions
    erwan21a wrote:
    Le réel sujet de ce topic est la transmission de l’information (les ID de la première boucle) de la première boucle en direction de la seconde. Ces deux boucles de trouvant en sus dans des fichiers différents.

    En php, il y a les include, les sessions et les variables globales. Les fichiers de template utilisent des include via les get_template_part.

    En WordPress de base il y a les sticky-post qui font ça sans une ligne de code. Les détails sont dans le :codex:

    Didier

    #982885
    erwan21a
    Participant
    Initié WordPress
    12 contributions

    Bonjour Didier07,

    J’irais regarder (et tester) ça lorsque je ne serais plus au travail mais les sticky-post semblent à première vue combler mon besoin. 🙂

    Merci

    #982886
    Anonyme
    Invité
    Maître WordPress
    34072 contributions

    Ce message a été supprimé suite à la demande de l’auteur.

    #982887
    didier07
    Participant
    Maître WordPress
    1964 contributions

    Même pas besoin de faire une boucle. Nativement wordpress affiche les sticky posts en tête et complète à 10 articles avec le « standard »

    #982888
    erwan21a
    Participant
    Initié WordPress
    12 contributions

    J’ai pas encore testé de manier ça.
    Mais si j’ai bien compris, si on définit deux posts en sticky, ils se placeront en position 1 et 2 de la boucle.
    Mais y a t-il des limites à ce système (nombre, date, etc) ? Faut-il le gérer forcement manuellement ?

    Parce que sinon, à force de mettre des posts en avant, on finit par pourrir sa boucle qui n’affichera sur les premières pages que des sticky posts. Même vieux.

    Je pense que c’est un outil qui peut facilement être mal utilisé, nan ?

    #982889
    didier07
    Participant
    Maître WordPress
    1964 contributions
    erwan21a wrote:
    Je pense que c’est un outil qui peut facilement être mal utilisé, nan ?

    Il n’y a pas plus de risque que de mettre en tête une catégorie définie à l’avance 🙂

    #982890
    Anonyme
    Invité
    Maître WordPress
    34072 contributions

    Ce message a été supprimé suite à la demande de l’auteur.

    #982891
    erwan21a
    Participant
    Initié WordPress
    12 contributions
    didier07 wrote:
    erwan21a wrote:
    Je pense que c’est un outil qui peut facilement être mal utilisé, nan ?

    Il n’y a pas plus de risque que de mettre en tête une catégorie définie à l’avance 🙂

    De ce que j’en comprend pour le moment (j’ai toujours pas pu tester), si on n’enlève pas les sticky manuellement, on fini par se retrouve avec les X première page de la boucle remplies de vieux sticky.
    L’article tout frais mais pas mis sticky sera donc en page 4. ^^

    La volonté sur le site que je conçois est de n’avoir qu’une Une. Comme sur un journal.
    D’où l’utilisation de deux boucles :
    – la première affichant le dernier message d’une catégorie (cette catégorie = sticky)
    – une seconde boucle affichant tous les messages sauf selon placé en Une

    Ainsi, même si la Une ne bouge pas, le second post sera toujours un post « frais ». 🙂

    noaneo wrote:
    didier07 wrote:
    Même pas besoin de faire une boucle. Nativement wordpress affiche les sticky posts en tête et complète à 10 articles avec le « standard »

    oui tout à fait, je ne voulais dire plus, c’est tout, il suffit de lire l’article j’ai mis en lien, on peut faire un carrousel

    $sticky = get_option(‘sticky_posts’);
    $args = array( ‘post__in’ => $sticky );
    query_posts( $args );

    L’efficacité d’un carousel est quasi nul.
    Des tests analytics ont été faites dessus et le résultat est catastrophique. 😉

    #982892
    CAMEO172
    Participant
    Maître WordPress
    1395 contributions

    Votre category-name « spécial » a aussi un id (chiffre)

    en ajoutant simplement : cat=-id dans votre query, ça va sortir tous les posts de cet id :

    plus de détails à ce lien : http://codex.wordpress.org/Function_Reference/query_posts

    et plus précisément :

    You can also add some more categories to the exclude-list (tested with WP 3.3.1):

    <?php
    if ( is_home() ) {
    query_posts( ‘cat=-1,-2,-3’ );
    }
    ?>

15 sujets de 1 à 15 (sur un total de 37)
  • Le forum ‘Utilisation spécifique de WordPress’ est fermé à de nouveaux sujets et réponses.