afficher l’archive des Custom Post Type

  • Statut : non résolu
14 sujets de 16 à 29 (sur un total de 29)
  • Auteur
    Messages
  • #1043011
    Lumiere de Lune
    Participant
    Maître WordPress
    19385 contributions

    ‘field’ => ‘term_id’ (read the doc ^^)

    et comme c’est la valeur par défaut, pas besoin de le mettre

    attention, aussi, comme le dit didier07, $result est un objet, ont ne peut pas le mettre comme ça, $result->term_id

    Enfin, il manque la query 🙂 c’est bien de mettre les $args mais sans lancer la recherche ^^

    fais un get_posts ( $args ) et pas un new WP_query , $visits = get_posts($args)

    à partir de là, rebelote, parcourir un objet…

    #1043012
    Flobogo
    Modérateur
    Maître WordPress
    15850 contributions

    Merci à vous deux, je vais essayer de me débrouiller avec ça, mais j’ai un peu de mal à comprendre comment on passe de
    $visits = get_posts($args) à la boucle en elle-même.
    En plus, le soir, je ne suis pas assez concentrée, je crois que ce sera pour ce week-end.
    Je vous tiens au courant.

    #1043013
    Flobogo
    Modérateur
    Maître WordPress
    15850 contributions

    Bon, ben, être codeuse, ça ne s’improvise pas … :(
    Je ne m’en sors pas avec ce foutu code.
    Une heure que je suis dessus, à déplacer mes accolades, à effacer un terme, à le remettre, à mettre un point-virgule, à l’enlever …

    Voilà où j’en suis, mais ça plante avec un Parse Error :

    <div class="clearfix les-visites">
                <div>
                
                <?php
                $results = get_terms('type');
                    if ($results) {
                    foreach ($results as $result) {
                    echo '<h2>‘ . $result->name . ‘</h2>‘;  
    
    				$args= array(
                    ‘post_type’        => ‘visites’,
                    ‘tax_query’        => array(
                                                array(
                                                    ‘taxonomy’ => ‘type’,
                                                    ‘field’    => ‘term_id’,
                                                    ‘terms’    => $result->term_id,
                                                    )
                , ‘posts_per_page’    => -1
                , ‘orderby’            => ‘ASC’
                ));
    			
    			$visits = get_posts($args);
    				if ($visits->have_posts()) : while ($visits->have_posts()) : $visits->the_post();
    				?>
            <div class="page-cat clearfix"><a href="”></a></div>
    		
    
                </div>
            </div>

    J’obtiens un Parse error: syntax error, unexpected ‘}’ quelque soit l’endroit où je mets les 2 accolades fermantes.
    Et bien sûr, si je ne les mets pas, ça ne va pas non plus … Logique, elles sont ouvertes, il faut bien les fermer quelque part … mais-z’où ??

    #1043014
    didier07
    Participant
    Maître WordPress
    1965 contributions

    Le probleme n’est pas les accolades, mais le endwhile mal placé 🙂

    <div class="clearfix les-visites">
    		<div>
    		
    		<?php
    		$results = get_terms('type');
    		if ($results) :
    			foreach ($results as $result) :
    				echo '<h2>‘ . $result->name . ‘</h2>‘;  
    
    				$args= array(
    				‘post_type’        => ‘visites’,
    				‘tax_query’        => array(
    											array(
    												‘taxonomy’ => ‘type’,
    												‘field’    => ‘term_id’,
    												‘terms’    => $result->term_id,
    												)
    				, ‘posts_per_page’    => -1
    				, ‘orderby’            => ‘ASC’
    				));
    		
    				$visits = get_posts($args);
    				if ($visits->have_posts()) : while ($visits->have_posts()) : $visits->the_post(); ?>
    					<div class="page-cat clearfix"><a href="”></a></div>
    				
    
                </div>
            </div>

    Pour rendre ton code plus lisible, tu peux utiliser :
    if () :

    else:

    endif;

    et
    foreach(……..) :

    endforeach;

    C’est pratique quand tu as de gros blocs,
    associés à une indentation correcte bien sûr 😉

    #1043016
    Flobogo
    Modérateur
    Maître WordPress
    15850 contributions

    Merci de ta réponse Didier.

    Toutefois, ton code doit comporter une petite erreur quelque part, car j’obtiens encore un Parse error :

    Parse error: syntax error, unexpected ‘endforeach’ (T_ENDFOREACH) in C:wampwwwwptestbourgwp-contentthemesair-balloon-lite-enfantarchive-visites.php on line 39

    Si je supprime ou descend d’un cran le endforeach; , il me dit que la fin de fichier n’est pas attendue à la ligne 52 …

    #1043017
    didier07
    Participant
    Maître WordPress
    1965 contributions

    il manque un endif avant le endforeach
    comme le if est sur la meme ligne que le while j’ai pas fait attention.

    J’aime pas mettre 2 structures de controle sur la même ligne à cause de ça 😉

    #1043015
    Flobogo
    Modérateur
    Maître WordPress
    15850 contributions

    On progresse, il n’y a plus de fatal Error, le header du site s’affiche mais … c’est pas encore ça !
    J’obtiens cette fois ce message d’erreur dans la page :

    Fatal error: Call to a member function have_posts() on a non-object in C:wampwwwwptestbourgwp-contentthemesair-balloon-lite-enfantarchive-visites.php on line 35

    La ligne 35, c’est celle-ci :

    if ($visits->have_posts()) : while ($visits->have_posts()) : $visits->the_post(); ?>

    Pourtant, juste avant, j’ai bien défini la variable comme l’avait dit Lumière de Lune :

    $visits = get_posts($args);

    #1043018
    didier07
    Participant
    Maître WordPress
    1965 contributions

    get_posts ne te donne pas un objet wp_Query donc le have_post ne marche pas
    Il te faut $visits = = new WP_Query( $args); ou passer par une boucle si tu utilise get_posts.
    Par contre get_posts ne te donne pas les mêmes infos dans le retour.

    #1043019
    Flobogo
    Modérateur
    Maître WordPress
    15850 contributions

    Euh, voui, mais là … j’arrive pas à suivre … 😳

    Lumière de Lune avait dit :

    fais un get_posts ( $args ) et pas un new WP_query , $visits = get_posts($args)

    Alors pourquoi tu me dis le contraire ?

    Il te faut $visits = = new WP_Query( $args);

    Et ça, je comprends pas : on a déjà une boucle …

    ou passer par une boucle si tu utilise get_posts.

    #1043020
    Flobogo
    Modérateur
    Maître WordPress
    15850 contributions

    Bon, ça fonctionne avec new WP_Query, merci beaucoup 👏 👏
    Je ne comprends pas pourquoi Lumière de Lune disait qu’il ne fallait pas l’utiliser ?

    #1043021
    Lumiere de Lune
    Participant
    Maître WordPress
    19385 contributions

    Parce que get_posts ne change pas la requête, c’est à dire qu’il ne modifie pas le type d’objet sur lequel tu te trouves. D’une manière générale, get_posts fonctionne de la même façon que new wp query mais touche à moins de choses en mémoire et dans le fonctionnement du blog.

    Voilà …

    http://wordpress.stackexchange.com/questions/1753/when-should-you-use-wp-query-vs-query-posts-vs-get-posts

    (ça fonctionne bien sûr, c’est plus une question de perf et de “retour” derrière effectivement, d’un côté un “objet” avec la requête (wp query) de l’autre un tableau (ensemble) d’objets individuels (les posts)

    Utiliser new Wp_query modifie le type de requête sur laquelle tu te trouve, et donc la valeur des fonctions comme is_tag, is_single, etc…

    C’est un bon réflexe de ne l’utiliser que quand on en a réellement besoin, et de préférer get_posts d’une manière générale. amha :D

    #1043022
    didier07
    Participant
    Maître WordPress
    1965 contributions

    J’avais bien vu que @Lumière de Lune déconseillait WP_Query, mais dans ton cas tu as besoin de fonctions qui ne sont pas remontées par get_posts.
    Si tu n’a besoin que du titre, du contenu et pas de tester si tu as une image à la une, remonter une catégorie ou autre, get_posts sra plus performant et tu n’as pas besoin de faire un wp_reset_query à la fin.

    En résumé : Tout dépend du besoin 🙂

    Merci à @Lumière de Lune pour les explications 😉

    #1043023
    Flobogo
    Modérateur
    Maître WordPress
    15850 contributions

    Merci à vous deux, j’ai mieux compris les explications de Didier07, les explications de Lumière de Lune étant un peu trop technique pour moi … mais elles seront sûrement utiles à d’autres. 🙂

    Juste pour finir, j’ai rajouté un tri par nom sur les CPT, qui ne fonctionnait pas au début parce qu’une parenthèse était mal placée dans le code initial de Didier07 (tu mettais les 2 parenthèses à la fin pour fermer les 2 “array”, mais du coup, ça englobait une portion de code qui n’avit pas lieu d’être dedans et ça l’annulait)
    Voici donc le code final :

    <div class="clearfix les-visites">
            <div>
            
            <?php
            $results = get_terms('type');
            if ($results) :
                foreach ($results as $result) :
                    echo '<h2>‘ . $result->name . ‘</h2>‘;  
    
                    $args= array(
                    ‘post_type’        => ‘visites’,
                    ‘tax_query’        => array(
                                                array(
                                                    ‘taxonomy’ => ‘type’,
                                                    ‘field’    => ‘term_id’,
                                                    ‘terms’    => $result->term_id,
                                                    ),
    									),
                    ‘posts_per_page’    => -1,
    				‘orderby’			=> ‘title’,
    				‘order’            	=> ‘ASC’,
                    );
            
                    $visits = new WP_Query($args);
                    if ($visits->have_posts()) : while ($visits->have_posts()) : $visits->the_post(); ?>
                        <div class="page-cat clearfix"><a href="”></a></div>
    				
    
                </div>
            </div>

    Encore merci à tous les deux. 🙂 🙂 Topic résolu. ✅

    #1043024
    Lumiere de Lune
    Participant
    Maître WordPress
    19385 contributions
    didier07 wrote:
    Jmais dans ton cas tu as besoin de fonctions qui ne sont pas remontées par get_posts.

    Lesquelles ? Tu peux me répondre en mp pour ne pas encombrer le fil ^^

14 sujets de 16 à 29 (sur un total de 29)
  • Vous devez être connecté pour répondre à ce sujet.