web-dev-qa-db-ja.com

私の投稿が表示されないのはなぜですか?

私は自分のポートフォリオサイトのテーマを作成しています。試行錯誤して少し試した後、私は立ち往生しています。

それはコンテンツのごくわずかなサイトになるだろう、それで私は1ページのウェブサイトを作成することにしました。 front-page.phpファイルの各ページを表示するためにget_pages($args);を使用しています。

これはとてもうまくいきます。今ここで私は立ち往生しているところです...私は私の1つのページフローに含まれ、他のページと同じように私のWP_Queryで呼ばれる私のブログ投稿を表示するためにページを使いたいのです。

これまで私が見つけることができる最も文書化された方法を試してみました。これは、Settings> Readingで投稿を表示するために使用されるページを変更することです。

確認するために

静的なホームページ(front-page.php)を持っていて、それをhomeというページで宣言したページテンプレートを作りました。私が読書設定でそれを設定することを可能にして、私は同じ理由でblogと呼ばれるページを作成しました(これはテンプレートがデフォルトに設定されています)。

enter image description here

私の投稿は、ここで設定したブログページに読み込まれていません。

カスタムクエリが干渉する可能性があることを読みましたが、これを確認しましたが、私の状況ではそうではありません。

WP_Queryを使ってget_pagesを使うように更新

front-page.php

    <?php

        $args = array (
            'post_type' => 'page',
            'order' => 'ASC',
            'orderby' => 'menu_order',
            'posts_per_page' => 5,
        );

        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {
            while ( $query->have_posts() ) {
                $query->the_post(); ?>

                <a data-magellan-destination="<?php echo $post->post_name; ?>" name='<?php echo $post->post_name; ?>'></a>
                <div id="<?php echo $post->post_name; ?>" class="page-wrap full">
                    <h2><?php the_title() ?></h2>
                        <?php the_content() ?>
                </div>

            <?php }
        } else {
    }

        wp_reset_postdata();
    ?>

このような状況に遭遇したことがある人はいますか。または、ブログ投稿の読み込みを妨げるようなループが欠けています。私はphpとWordPressを学んでいて、私の経験の限界に打ち勝っています。ブログページのコンテンツ自体への呼び出しが投稿情報の通過を妨げていると思いますか。よく分かりません。どんなガイダンスもいただければ幸いです。

前もって感謝します

2
JohnMcCarthy

Get_pagesはあなたが思っていることをしないので、これはあなたが思うようにはうまくいきません。

まず、WordPressのすべてのページ、すべてのコンテンツが、実際には「投稿」であることを理解してください。 「ページ」は単なる特別な投稿です。

さて、通常の環境では、 "get_"は何も呼ばないでしょう。これはあなたが混乱している理由です。なぜなら、あなたは直接物事を手に入れているので、WordPressがあなたのために自動的にするすべてを迂回しているからです。 get_pagesを呼び出すと、それらのページが直接取得されます。それは "静的なホームページ"設定を考慮に入れません、それはそれが言われることを単に行いそしてそれらのページの内容を取得します。

WordPressが自動的にURLを解析して、そのURLに表示されるべきものを決定します。これは書き換えシステムによって起こります。書き換え規則は、「かわいい」URLをWP_Queryシステムの一連のパラメータに変換します。 WP_Queryシステムは表示される投稿を取り出し、それらをグローバル$ wp_queryに保存します。その後、テンプレートシステムは、そのグローバルWP_Queryのさまざまなデータに基づいてテーマからどのテンプレートを取得するかを決定し、そのテンプレートをロードします。このテンプレートは、グローバルな$ wp_queryに含まれる投稿を表示するThe Loopを実装しています。

要約すると、

  • 書き換えによってURLが処理される
  • 書き換えはクエリパラメータを作成します
  • 取得する投稿を決定するために使用されるクエリパラメータ
  • テンプレートシステムは適切なテンプレートをロードするためにクエリを調べます
  • 適切なテンプレートはクエリからの投稿を表示します

ここでの各ステップはすべて単独で起こります。あなたは本当にそれを制御していません、それはWordPressが起動時にすることだけです。

「静的ホームページ」設定はそこでのステ​​ップ3を変更します、そこでクエリは「ホームページ」を取得しています、それはブログから投稿を取得するか、または何らかの静的ページを取得するかのどちらかを決定します。同様に、特定のページを取得するように指示したときに、そのページがブログになるように設定されていると、クエリーは代わりに投稿を表示します。他のすべては普通に起こります。

自分でget_pagesを実行することで、ここですべてをバイパスして、これらのページを取得して表示するように言っています。あなたがそれをすべて迂回したのでシステムに他に何も影響を与えません。

すべてを単一のページに表示したい場合は、表示したい内容を正確に取得してから表示する必要があります。要するに、「静的ホームページ」はページに異なる内容を持たせるのではなく、それらの特定のページに表示するためにクエリによって選択される内容を変更するだけです。投稿を取得したい場合は、何らかの形でget_postsを呼び出すか、カスタムWP_Queryを使用するか、メインクエリを変更するか、それ以外のものを実行する必要があります。 get_pages()関数は、実際にブログ投稿を取得することはできません。それは可能ですが、代わりにget_posts()が実行するので意味がありません。

6
Otto

私が始める前に、私はあなたが読むことをお勧めします: 静的フロントページの作成

静的フロントページを選択すると、フロントページを表示するために、次のテンプレートの1つが使用されます。

  • front-page.php

  • page.php

  • 他のカスタムページテンプレート

これは私があなたの質問から理解できるものからあなたが既に働いている部分です

今、ブログページ。 Wordpressは、ブログページとして設定されたページをあなたのホームページとして扱います。 Wordpressは自動的にhome.phpという名前のテンプレートを探します。そのテンプレートが見つからない場合は、Wordpressはindex.phpを使用します。あなたのblog.phpは単に無視されます。 index.phpとhome.phpは投稿タイプpostに対してのみ設定されているため、ブログページにアクセスしても何も表示されません。

pre_get_posts を使用してブログページに投稿タイプとしてpageを含めるには、実行前にメインクエリを変更する必要があります。ホームページやアーカイブページに変更を加えるためのカスタムクエリを作成するのは面倒なので、特にページ付けに関してはしないでください。単にfunctions.phpに以下を追加するだけです。注意してください、is_home()チェックはあなたのブログページであるホームページのメインクエリを変更するためだけに使われます

function include_page_in_home( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'post_type', array( 'post', 'page' ) ); // Remove post if you only need page
    }
}
add_action( 'pre_get_posts', 'include_page_in_home' );

あなたがチェックアウトすることができるより多くのパラメータに関しては WP_Query は両方とも同じパラメータを使用するので。 home.phpまたはindex.phpでデフォルトのループを使用していることを確認してください。

参考までに、開発時にはfunctions.phpに以下を使用してください。 プロダクションサイトでは itを使用しないでください。特定のページでどのテンプレートが使用されているのかわからない場合は、ページのヘッドセクションで現在使用されているテンプレートが印刷されます。

add_action('wp_head', 'show_template');
function show_template() {
    global $template;
    print_r($template);
}

@Ottoによる答えを広げるためだけに、あなたはあなたのページを表示するためにあなたのfront-page.phpで以下を使うことができます。これはコーデックスをコピーしたもので、必要に応じて微調整できます。

<?php

// The Query
$the_query = new WP_Query( 'posts_per_page=-1&post_type=page' );

// The Loop
if ( $the_query->have_posts() ) {
    echo '<ul>';
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
    echo '</ul>';
} else {
    // no posts found
}
/* Restore original Post Data */
wp_reset_postdata();

追加のリソース

_編集_

あなたのブログの最新の3つの posts をあなたのfront-page.phpに見せる必要があるなら、カスタムクエリでこれをすることができます。

<?php

// The Query
$the_query = new WP_Query( 'posts_per_page=3&order=DESC' );

// The Loop
if ( $the_query->have_posts() ) {
    echo '<ul>';
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
    echo '</ul>';
} else {
    // no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
2
Pieter Goosen