web-dev-qa-db-fra.com

get_pages - Affiche les pages enfants, puis les pages enfants

J'ai une structure de page comme celle-ci.

    Portfolio
    - Residential
    - - Resident 1
    - - Resident 2
    - - Resident 3
    - Commercial
    - - Commercial 1
    - - Commercial 2
    - - Commercial 3

Les pages des petits-enfants Resident 1 - Commercial 3 ont des miniatures post

J'ai un modèle pour la page Portfolio où je voudrais afficher les pages "Résidentiel" et "Commerical" avec leurs pages enfants, comme ceci.

    <div class="grid">
      <h2>Residential</h2>
      <ul>
        <li>  Resident 1 post_thumbnail </li>
        <li>  Resident 2 post_thumbnail </li>
        <li>  Resident 3 post_thumbnail </li>
      </ul>
    </div>
    <div class="grid">
      <h2>Commercial</h2>
      <ul>
        <li>  Commercial 1 post_thumbnail </li>
        <li>  Commercial 2 post_thumbnail </li>
        <li>  Commercial 3 post_thumbnail </li>
      </ul>
    </div>

J'utilise get_pages et j'ai la division créée pour "résidentiel" et "commercial"

    <?php

        $portfolio_sections = array(
            'post_type'     => 'page',
            'child_of'      => $post->ID,
            'sort_column' => 'menu_order',
            'sort_order'    => 'ASC',
            'parent'            => $post->ID
        );

        $sections = get_pages($portfolio_sections);

        foreach($sections as $section){

        ?>

        <div class="grid">
            <h2><?php echo $section->post_title; ?></h2>

              //Create Child pages

        </div><!--.grid-->

        <?php   
        }
    ?>

Mon problème est de créer les pages enfants dans la liste 'ul'

J'ai essayé d'utiliser une seconde boucle foreach mais cela n'a pas fonctionné et je ne sais pas si c'est la bonne manière

    <?php

        $portfolio_sections = array(
            'post_type'     => 'page',
            'child_of'      => $post->ID,
            'sort_column' => 'menu_order',
            'sort_order'    => 'ASC',
            'parent'            => $post->ID
        );

        $sections = get_pages($portfolio_sections);

        foreach($sections as $section){

        ?>

        <div class="grid">
            <h2><?php echo $section->post_title; ?></h2>
            <ul class="imageGrid">
                <?php
                    $portfolio_pages = array(
                        'post_type'     => 'page',
                        'child_of'      => $section->ID,
                        'sort_column' => 'menu_order',
                        'sort_order'    => 'ASC',
                        'parent'            => $section->ID
                    );

                    $pages = get_pages($portfolio_pages);

                    foreach($pages as $page){
                        ?>
                            <li><a href="<?php echo get_the_permalink($page->ID);?>"><?php echo get_the_post_thumbnail($page->ID, "thumbnail"); ?><span><?php echo get_the_title($page->ID);?></span></a></li>
                        <?php
                    }
                ?>
            </ul>
        </div><!--.grid-->

        <?php   
        }
    ?>

--- METTRE À JOUR ----

La structure que je voulais. Un div autour de chaque liste ul

    <div class="grid">
      <h2>Residential</h2>
      <ul>
        <li>  Resident 1 post_thumbnail </li>
        <li>  Resident 2 post_thumbnail </li>
        <li>  Resident 3 post_thumbnail </li>
      </ul>
    </div>
    <div class="grid">
      <h2>Commercial</h2>
      <ul>
        <li>  Commercial 1 post_thumbnail </li>
        <li>  Commercial 2 post_thumbnail </li>
        <li>  Commercial 3 post_thumbnail </li>
      </ul>
    </div>

La structure du code est celle qui entoure div.

    <div class="grid">
      <h2>Residential</h2>
      <ul>
        <li>  Resident 1 post_thumbnail </li>
        <li>  Resident 2 post_thumbnail </li>
        <li>  Resident 3 post_thumbnail </li>
      </ul>
      <h2>Commercial</h2>
      <ul>
        <li>  Commercial 1 post_thumbnail </li>
        <li>  Commercial 2 post_thumbnail </li>
        <li>  Commercial 3 post_thumbnail </li>
      </ul>
    </div>
1
Simon Cooper

Vous n'avez pas besoin de 2 requêtes, utilisez simplement un peu de logique et 2 boucles foreach:

$portfolioID = $post->ID;

$portfolio_sections = array(
  'post_type' => 'page',
  'child_of' => $portfolioID,
  'sort_column' => 'menu_order',
  'sort_order' => 'ASC',
);

$sections = get_pages($portfolio_sections);

$hierachical = array();

if ( ! empty($sections) ) {
  foreach ( $sections as $section ) {
    if ( $section->post_parent == $portfolioID ) {
      if ( ! isset( $hierachical[$section->ID]) ) $hierachical[$section->ID] = array();  
      $hierachical[$section->ID]['child'] = $section;
      $hierachical[$section->ID]['grandchildes'] = array();
    } else {
      if ( ! isset( $hierachical[$section->post_parent]) ) $hierachical[$section->post_parent] = array();
      $hierachical[$section->post_parent]['grandchildes'][] = $section;
    }
  }
  foreach ( $hierachical as $id => $hierachical_data ) {
    if ( ! isset($hierachical_data['child']) || ! is_object($hierachical_data['child']) ) continue;
    echo '<div class="grid">';
    echo '<h2>' . get_the_title($hierachical_data['child']->ID) . '</h2>';
    echo '<ul>';
    if ( isset($hierachical_data['grandchildes']) && ! empty($hierachical_data['grandchildes']) ) {
      foreach ( $hierachical_data['grandchildes'] as $grandchild ) {
        if ( has_post_thumbnail($grandchild->ID)) {
          echo '<li><a href="' . get_permalink( $grandchild->ID ) . '" title="' . esc_attr( $grandchild->post_title ) . '">';
          echo get_the_post_thumbnail($grandchild->ID);
          echo '</a></li>';
        }
      }
    }
    echo '</ul>';
    echo '</div>';
  }
}

Code non testé mais devrait fonctionner.

1
gmazzap