web-dev-qa-db-fra.com

Thème d'une seule page utilisant des pages pour le contenu

Je fais un site d'une page. Sur la page, je souhaite exécuter WP_Query trois ou quatre fois pour extraire ces 3-4 pages.

La page ressemble un peu à ceci:

<div class="row">
 <?php

    $args = array( 'pagename' => 'page-1'); 

    $the_query = new WP_Query( $args );

    // The Loop
    if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post();
      get_template_part('content');
    endwhile;
    endif;

    // Reset Post Data
    wp_reset_postdata();
?>
</div>


<div class="row">
 <?php

    $args = array( 'pagename' => 'page-2'); 

    $the_query = new WP_Query( $args );

    // The Loop
    if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post();
      get_template_part('content');
    endwhile;
    endif;

    // Reset Post Data
    wp_reset_postdata();
?>
</div>

<div class="row">
 <?php

    $args = array( 'pagename' => 'page-3'); 

    $the_query = new WP_Query( $args );

    // The Loop
    if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post();
      get_template_part('content');
    endwhile;
    endif;

    // Reset Post Data
    wp_reset_postdata();
?>
</div>

Bien sûr, je me répète ici, et c'est un peu une perte. Ce que je veux faire, c'est fonctionnaliser cette instance de WP_Query. Voici ce que j'ai fait, mais cela ne semble rien rapporter du tout. Ce doit être quelque chose de stupide, mais je ne vois pas ce que cela pourrait être (dans functions.php):

/**
 * Functionize wp_query
 *
 * @since 0.1
 */
function waterstreet_fetch_page( $pagename ){
    $args = array( 'pagename' => $pagename ); 

    $the_query = new WP_Query( $args );

    // The Loop
    if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post();
      get_template_part('content');
    endwhile;
    endif;

    // Reset Post Data
    wp_reset_postdata();
}

Ensuite, bien sûr, dans mes fichiers de modèle, je veux pouvoir exécuter simplement:

<div class="row">
    <?php waterstreet_fetch_page('page-1'); ?>
</div>

<div class="row">
    <?php waterstreet_fetch_page('page-2'); ?>
</div>

<div class="row">
    <?php waterstreet_fetch_page('page-3'); ?>
</div>

Conseils bienvenus! Merci.

1
saltcod

Comment vous simplifier la vie

Je choisirais une voie assez simple:

  • Ajouter une page "main/parent"
  • Appliquez votre modèle ici
  • Ajouter des pages "enfants" à cette page principale
  • Modifier la requête pour les inclure

Exemple de code en tant que plugin pour un test rapide

Voici un plugin (non testé) qui modifie les arguments de la requête pour non seulement le réduire à une requête unique, mais également la requête principale, de sorte qu'aucune augmentation des performances ne soit nécessaire.

Explication

Je ne suis pas sûr de savoir comment récupérer l'identifiant (actuel) de la publication parent dans la fonction. Je suppose que vous devez le régler manuellement. Quoi qu'il en soit: essayez-le avec get_queried_object_id() (ce qui ne fonctionnera probablement pas) ou voyez si vous pouvez le récupérer à partir de l'objet $query. Vous pouvez également attacher un deuxième filtre à post_clauses et simplement modifier les arguments de ce filtre (où get_queried_object_id() devrait déjà être présent - ou non).

La bonne chose à faire avec cette fonction est d’attacher la valeur orderby en tant que menu_order, afin que vous puissiez utiliser ce que le type de publication de page prend en charge par défaut. Vous devriez toujours utiliser autant que possible ce que vous offre le noyau.

<?php
/** Plugin Name: (#70317) »kaiser« Fetch all child posts */
/**
 * Calls the child pages
 * 
 * @param  object $query
 * @return object $query
 */
function wpse70317_pre_get_posts( $query )
{
    if (
        ! $query->is_home()
        OR ! $query->is_front_page()
        OR ! $query->is_main_query()
        )
    {
        return $query;
    }

    $query->set( 'post_type', 'page' );
    $query->set( 'post_status', 'inherit' );

    // Allow the menu order (meta value) to be used
    // ... and start with 0 and count up
    $query->set( 'order', 'ASC' );
    $query->set( 'orderby', 'menu_order' );

    // Change this to your parent posts ID
    $query->set( 'post_parent', 1 );

    return $query;
}
add_action( 'pre_get_posts', 'wpse70317_pre_get_posts' );
2
kaiser

Si vous remplacez les slugs de page par leurs identifiants, vous pouvez utiliser le paramètre de requête 'post__in' et 'page' comme type de post_type dans une requête unique:

<?php

$args = array( 'post_type' => 'page', 'post__in' => array(2, 3, 5)); 

$the_query = new WP_Query( $args );

// The Loop
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
  get_template_part('content');
endwhile;
endif;

?>
0
Parham