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

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

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

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

Q&A

解決済

1回答

880閲覧

WordPressのトップページにおいて出力される値がおかしい/あるいは値が出力できない

jan123

総合スコア4

WordPress

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

0グッド

0クリップ

投稿2022/04/27 04:21

編集2022/04/28 00:10

カスタム投稿タイプを使って
「お知らせ」を作ってます。

公開日を表示したいのですが、
archive-news.php
では、以下の記述で正しく表示されるものの、
トップページではなぜか、公開日ではなく同じ日付がどの投稿にも表示されてしまいます。
その日付は、WordPressをインストールした頃の日付です。

<?php the_time; ?>

そこで、カスタムフィールドを使ってみることを考えて試したところ、
以下記述で、
archive-news.php
ではやはり正しく表示されるものの、
トップページではnullになります。

<?php $value = get_post_meta( get_the_ID(), '名称', true ); if( $value ){ echo $value; } ?>

色々確認したところ、

<?php get_the_title; ?> <?php get_the_content; ?>

は出力されるものの、
抜粋も出力されませんでした。

考えられる原因、
または
とりあえずこの問題はおいておくとして、
タイトルや、コンテンツに書く、という方法以外で
指定した日付を出力するための良い方法を思いつく方いたら、
お願い致します。

--
追記です。
トップページに限らないようで、
他の固定ページでもダメでした。
archiveやsingleなどの投稿ページじゃないと出せないのでしょうか?
調べてもそういった情報が見つからずでして。

--
再追記です。
記述内容の詳細は下記の感じです。

<?php $args = array( 'posts_per_page' => 10, 'post_type' => 'news', 'orderby' => 'date', 'order' => 'DESC' ); $my_posts = get_posts($args); ?> <ul> <?php foreach ($my_posts as $post) : setup_postdata($post); ?> <li> <a href="<?php echo get_permalink($post->ID); ?>"> <div> <time> <?php $value = get_post_meta( get_the_ID(), 'news_date', true ); if( $value ){ echo $value; } ?> </time> <h2><?php echo get_the_title($post->ID); ?></h2> </div> </a> </li> <?php endforeach; ?> <?php wp_reset_postdata();?> </ul>

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

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

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

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

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

CHERRY

2022/04/27 05:32

条件の絞り込みやループ処理の問題と思われますが、一部のコードでは分かりませんので、どのようなコードで出力しているのかわかるコードを記載していただけないでしょうか
jan123

2022/04/27 07:49

ありがとうございます。 ただいま追記しました。 ご確認いただければ幸いです。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

the_postを使っていないサブループで
the_titleなどのテンプレートタグを使いたい場合は
setup_postdataglobal $postの値を更新してください。
また、ループが終わった後はwp_reset_postdata
global $postをメインクエリのものに戻すようにしてください。


追記

$post グローバル変数へのリファレンスを指定しなければなりません。そうしないと the_title() などの関数が正しく動作しません。

これですかね

投稿2022/04/27 05:30

編集2022/04/28 01:13
KazuhiroHatano

総合スコア7804

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

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

jan123

2022/04/28 00:07

ご回答ありがとうございます。 記述しておらずすみません、 追記した通り、すでに記述済みだと思っておりますが、 いかがでしょうか? 何か他にお気づきの点あればご教示いただければ幸いです。
jan123

2022/04/28 11:16

これが抜けていました・・ global $post; ↑これを足して動いたのですが、 ご示唆いただいた参照すべきページには、 $post = $post_object; が$post グローバル変数へのリファレンスを指定する記述として書かれているように見えます。 一方で、例を見るとそのような記述は見当たらず・・ まだよくないコーディングがあれば知っておきたいのですが、 今回の私のコーディングでは、 $my_posts = get_posts($args); がリファレンスを指定している内容となっているのでしょうか?
KazuhiroHatano

2022/04/28 12:56

見方を変えれば要するに ループを正常に動作させるにはglobal $postとその他のグローバル変数を更新しなきゃいけないけど setup_postdataはその他のグローバル変数の更新だけでglobal $postの更新はしないよ global $postの更新は別途自分でしてね ってことです global $postと書くと、そのスコープでは$postはグローバル変数の$postになるので 意図せずグローバル変数の$postを上書きしてしまうかもしれないことに気をつけなくてはいけません よくないコーディング云々で言えばそもそもグローバル変数を使いまくるのがよくないコーディングなのですが WordPressがそういうものなのでそこはもうそういうものと受け入れる他ないです > $my_posts = get_posts($args); がリファレンスを指定している内容となっているのでしょうか? 違います 当該ページの文脈ではリファレンスとはすなわち グローバル変数の$postへの参照のことを言っています。
jan123

2022/04/28 23:41 編集

ご丁寧にありがとうございます。 ------ global $post; // 表示したい投稿の詳細情報を $post に割り当てる(他の変数名ではいけない!!!!) $post = $post_object; setup_postdata( $post ); // ... ------ WordPress Codexに↑のように書かれている中の、 ------ // 表示したい投稿の詳細情報を $post に割り当てる(他の変数名ではいけない!!!!) $post = $post_object; ------ これは、 こう書きなさい、という意味だと捉えています。 ただ、これを書かなくても動いたのですが、 $post_object とは何でしょうか? 調べても出てこなくて、色々お聞きしてすみませんが、よろしければご教示ください。
KazuhiroHatano

2022/04/29 01:21

当該ページのサンプルコードの$post_objectは中継をしているに過ぎません 要件はグローバル変数の$postを更新することです。 質問のコードはglobal $postの記述を足すことで foreach ($my_posts as $post ) のところが グローバル変数の$postの更新になります。
jan123

2022/04/29 03:52

すみません、まだいまいちわかってないのですが、 // 表示したい投稿の詳細情報を $post に割り当てる(他の変数名ではいけない!!!!) ↑この記載の対象は、 $post = $post_object; ではなく、 global $post; なのでしょうか? また、 $post = $post_object は、$postを$post_objectに置き換えているのとは違うのでしょうか? 中断しているということは、 次に$postが出てくるまでの間、 $postを意図せず上書きしないようにするための記述、 として覚えておけばよろしいでしょうか?
KazuhiroHatano

2022/04/29 04:35

global $post を記述すると、 そのスコープ内にある$postは全てグローバル変数の$postになります。 > // 表示したい投稿の詳細情報を $post に割り当てる(他の変数名ではいけない!!!!) > この記載の対象は、 $post = $post_object; ではなく、 global $post; グローバル変数の$postという名前の変数を更新するためには両方の記述が必要です 両方が対象と言えます 別に$post_objectとかの別のローカル変数を中継することは必須ではないです。 質問のコードに対して行ったように、単にglobal $postの記述を足して foreach ($my_posts as $post)でグローバル変数の$postを更新するようにしても結果は同じです 気をつけるべきことは、先にも書いたように、 global $post;を記述すれば、同スコープ内では 全ての$post変数はグローバル変数の$postになるので 意図せず更新をしてしまわないようにすることです
jan123

2022/04/29 08:05

すみません、やはり $post_object というのが、なんなのかが分かりません。。 ■ ローカル変数ということは、例えば、 $hoge のように、自由に付けられた変数名という理解で合ってますでしょうか? ■ $post = $post_object; これを記述した意味は、 グローバル変数の$postに値が間違って入ってしまわないように中断すること、 ということで合ってますでしょうか? ■ 色々調べても、 global $post は書かれていても、 その後にいったん、 $post = $hoge のようによくわからない変数を入れているものを見ません。 これが何のために必要なのか、は私にわかるようには説明難しそうでしょうか?
KazuhiroHatano

2022/04/29 09:03

setup_postdataのページのサンプルコードで $post_objectというローカル変数を使ってるのは そこでしなくてならないことが 投稿オブジェクトをグローバル変数の$postに代入することだ ということを端的に示すために それ以外の投稿オブジェクトの取得などの処理の コードを省略するためだろうと思います。 別にそれが望ましい記述方法というわけではないです。
jan123

2022/04/29 10:21

$post_objectというローカル変数というのは、 $hogeでもよくて、変数名を自由に付けられる変数でしょうか?
KazuhiroHatano

2022/04/29 10:41

そうですね $post_objectという変数名である必要はないです。 setup_postdataのページのサンプルコードでは それが投稿オブジェクトであることがわかるように $post_objectという名前にしているんだろうと思います。
jan123

2022/04/29 12:17

了解しました! まだ根本からは理解できてませんが、 ひとまずいただいた情報を踏まえて勉強してみます。 何度もありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問