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.
Je choisirais une voie assez simple:
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.
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' );
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;
?>