web-dev-qa-db-ja.com

コンテンツにページを使用する単一ページのテーマ

私は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
saltcod

あなたの人生を簡単にする方法

私はかなり簡単な方法で行きます:

  • "メイン/親"ページを追加する
  • そこにあなたのテンプレートを適用する
  • このメインページに "child"ページを追加する
  • それらを含めるようにクエリを変更します。

簡単なテストのためのプラグインとしてのコード例

これは、クエリ引数を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' );
2
kaiser

ページスラッグをそれらの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;

?>
0
Parham