質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

261閲覧

WordPressにて個別ページ上で投稿内容をループして表示させたい

TMTN

総合スコア53

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2024/03/30 07:49

編集2024/03/30 18:17

実現したいこと

index.phpでなく、別の個別ページで投稿内容をループさせたいと考えています。

しかし、single.php上で投稿内容をループして表示させたいのですが、関数がうまく動作しません。
例えば、関数the_post()はindex.phpでは動作しループもできますがsingle.php上でうまく動きません。

発生している問題・分からないこと

そもそもsingle.php上で使用できる関数ではないということでしょうか?
また、その場合、各投稿をsingle.php上で表示する方法はどのようにすればよいでしょうか?

分かる方お力添えをお願い致します。

該当のソースコード

php

1 <?php while(have_posts()):?> 2 <section class="page-section"> 3 <div class="container"> 4 <div class="product-item"> 5 <div class="product-item-title d-flex"> 6 <div class="bg-faded p-5 d-flex me-auto rounded"> 7 <h2 class="section-heading mb-0"> 8 <span class="section-heading-upper"><?php the_post();?></span> 9 <span class="section-heading-lower"><?php the_title();?></span> 10 </h2> 11 </div> 12 </div> 13 <img class="product-item-img mx-auto d-flex rounded img-fluid mb-3 mb-lg-0" src="<?php echo $img[0]; ?>" alt="..." /> 14 <div class="product-item-description d-flex ms-auto"> 15 <div class="bg-faded p-5 rounded"> 16 <p class="mb-0"><?php the_content();?> 17 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 18 </p> 19 20 </div> 21 </div> 22 </div> 23 </div> 24 </section> 25 <?php endwhile:?>

変更①

php

1 <?php while(have_posts()):?> 2 <section class="page-section"> 3 <div class="container"> 4 <div class="product-item"> 5 <div class="product-item-title d-flex"> 6 <div class="bg-faded p-5 d-flex me-auto rounded"> 7 <h2 class="section-heading mb-0"> 8 <span class="section-heading-upper"><?php the_post();?></span> 9 <span class="section-heading-lower"><?php the_title();?></span> 10 11 </h2> 12 </div> 13 </div> 14 <img class="product-item-img mx-auto d-flex rounded img-fluid mb-3 mb-lg-0" src="<?php echo $img[0]; ?>" alt="..." /> 15 <div class="product-item-description d-flex ms-auto"> 16 <div class="bg-faded p-5 rounded"> 17 <p class="mb-0"><?php the_content();?> 18 19 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 20 </p> 21 22 </div> 23 </div> 24 </div> 25 </div> 26 </section> 27 28 <?php endwhile;?>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

single.phpで投稿内容をループして表示させる方法と調べてみましたが、実現できる結果に辿り着けませんでした。

補足

特になし

上記の変更①の結果

the_post() をget_posts()に変更、または、have_post()をget_posts()へ変更した場合、両方無限ループに入ってしましました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

構文エラーについては別回答の通りです。

single.php は個別の投稿ページや固定ページの場合に選択されるテンプレートですが、ここでのメインループは既に記事が1つであることが各停しています。
つまり the_post() を1回コールすると have_post() 条件に当てはまらなくなります。

メインループと別に記事データを取得するには、 get_posts() を利用します。

追記

コードの例としては下記のような感じになります。
抽出条件は適宜調整してください。

php

1<?php get_header() ?> 2 3<!-- URLに応じた、single.phpが検出しているpost情報の表示 --> 4<article> 5 <h1><?php the_title() ?></h1> 6 <div><?php the_content() ?></div> 7</article> 8 9<!-- 他のPOSTを別途5件ランダム表示 --> 10<h3>other posts</h3> 11<?php 12$args = [ 13 'post_type' => 'post', 14 'posts_per_page' => 5, 15 'orderby' => 'rand', 16 'post__not_in' => [get_the_ID()], 17]; 18foreach(get_posts($args) as $post): ?> 19 <article> 20 <p>title: <?php echo $post->post_title ?></p> 21 </article> 22<?php endforeach; ?> 23 24<?php get_footer() ?>

投稿2024/03/30 09:27

編集2024/03/31 07:56
Eggpan

総合スコア2729

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroki-o

2024/03/30 09:38

なるほど、個別の投稿が表示できないという質問と勘違いしていました。
TMTN

2024/03/30 18:20

Eggpan様 ご回答頂きありがとうございます。 お返事遅くなり大変申し訳ございません。 ご回答頂いた事を参考に「変更①」へ記述を変更させて頂きましたが、the_post() をget_posts()に変更または、have_post()をget_posts()へ変更した場合、両方無限ループに入ってしましました。
Eggpan

2024/03/31 03:57

使い方が全く違うのでループ文にget_posts()を書くと無限ループになります。 使用例を回答に追記しました。
TMTN

2024/03/31 07:05

投稿を固定ページへ変更し、上記に記述方法を変呼応したところ、期待していた表記になりました。 ありがとうございました。
guest

0

AIにより生成された文章です

single.phpは個別の投稿ページを表示するためのテンプレートファイルであり、通常はループ構造を使用する必要はありません。single.phpでは、現在表示されている投稿の情報がデフォルトで利用可能になっています。

したがって、single.php内では以下のようにループを使用せずに投稿情報を表示することができます:

php

1<section class="page-section"> 2 <div class="container"> 3 <div class="product-item"> 4 <div class="product-item-title d-flex"> 5 <div class="bg-faded p-5 d-flex me-auto rounded"> 6 <h2 class="section-heading mb-0"> 7 <span class="section-heading-upper"><?php the_category(', '); ?></span> 8 <span class="section-heading-lower"><?php the_title(); ?></span> 9 </h2> 10 </div> 11 </div> 12 <?php if (has_post_thumbnail()) : ?> 13 <img class="product-item-img mx-auto d-flex rounded img-fluid mb-3 mb-lg-0" src="<?php the_post_thumbnail_url(); ?>" alt="..." /> 14 <?php endif; ?> 15 <div class="product-item-description d-flex ms-auto"> 16 <div class="bg-faded p-5 rounded"> 17 <p class="mb-0"><?php the_content(); ?></p> 18 </div> 19 </div> 20 </div> 21 </div> 22</section>

上記のコードでは、以下の点に注意してください:
1.ループ構造(whileループ)を削除しました。
2.the_category(', ')を使用して、投稿のカテゴリを表示しています。
3.has_post_thumbnail()関数を使用して、投稿にアイキャッチ画像が設定されているかどうかを確認しています。
4.the_post_thumbnail_url()関数を使用して、アイキャッチ画像のURLを取得しています。

これで、single.php上で個別の投稿情報が正しく表示されるはずです。また、the_post()関数はsingle.phpでは不要であり、使用する必要はありません。

投稿2024/03/30 13:04

quiz

総合スコア269

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroki-o

2024/03/30 14:03

確かに、個別の投稿を表示するだけなら、その通りです。
guest

0

FreeBSD 13.2、PHP 8.3.1、WordPress 6.4.3で確認しました。

25行目

<?php endwhile;?>

投稿2024/03/30 08:04

hiroki-o

総合スコア483

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TMTN

2024/03/30 08:09

hirlki-o様 ご回答ありがとうございます。 25行目を「 <?php endwhile;?>」へ修正するだけでsingle.phpでループ処理できるという認識でよろしいでしょうか? (外出中で確認ができず質問申し訳ございません。)
hiroki-o

2024/03/30 08:13

はい、そうです。デバッグ出力を有効にして実行すると、その行でエラーになるのがわかります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問