私は1ページのサイトを作っています。このページで、WP_Queryを3〜4回実行して、それらの3〜4ページを取得します。
ページはこのように少し見えます:
<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>
もちろん、ここでも繰り返しますが、これは少し無駄です。私がやりたいことは、このWP_Queryのインスタンスを関数化することです。これが私がしたことですが、まったく何も返さないようです。それは愚かなことでなければなりません、しかし、私はそれが何でありえるかについて見ることができません(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();
}
それからもちろん、私のテンプレートファイルでは、私はただ実行することができるようになりたいです。
<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>
アドバイス歓迎!ありがとう。
私はかなり簡単な方法で行きます:
これは、クエリ引数を1つのクエリに減らすだけでなく、メインのクエリも変更するように(テストされていない)プラグインです。パフォーマンスを向上させる必要はありません。
関数内で親の投稿(現在の)IDを取得する方法がわかりません。手動で設定する必要があると思います。とにかく:get_queried_object_id()
(これはおそらくうまくいかないでしょう)を使ってそれを試すか、$query
オブジェクトからそれを取得できるかどうか確かめてください。また、post_clauses
に2番目のフィルタを付けて、このフィルタの引数を変更することもできます(get_queried_object_id()
がすでに存在しているかどうか - または存在しない場合)。
この関数がすることの素晴らしいところは、orderby
の値をmenu_order
としてアタッチすることです。そのため、デフォルトでページ投稿タイプがサポートするものを利用することができます。 Imoあなたは常にコアができるだけ提供しているものをできるだけ利用するべきです。
<?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' );
ページスラッグをそれらのIDで置き換える場合、単一のクエリで 'post__in'クエリパラメータと 'page'をpost_typeとして使用できます。
<?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;
?>