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

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

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

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

PHP

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

Q&A

解決済

1回答

481閲覧

index.phpから固定ページへコピーしたカテゴリー一覧表示コードが別の値を返す

Sohaya

総合スコア254

WordPress

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

PHP

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

0グッド

0クリップ

投稿2023/04/07 13:36

編集2023/04/07 13:39

実現したいこと

  • index.phpに直書きされた『phpを含むコード』をCode Snippetsプラグインなどを介して固定ページにそのまま移植し、フロントページとして使えるようにしたい。

前提

外部から引き継いだWordPressを使用しています。
トップページがテーマファイルのindex.phpに直書きされており容易な編集ができないため、該当のコード部分をプラグイン「WPCode Lite」でショートコード化し、フロントページとして使う予定の固定ページ「home」にショートコードを貼り付けたのですが、index.php直書き時には想定通りに動作するコードが、固定ページではうまく動作しません。

発生している問題

特定のカテゴリーの投稿一覧を出力するコード内の以下の値を表示する関数

  • アイキャッチ画像のURL
  • 投稿タイトル
  • 投稿日時
  • 投稿本文

のうち、「投稿本文」を除くすべての関数が、特定カテゴリー一覧からではなく固定ページ「home」自体の値を返します。

  • アイキャッチ画像のURLは、画像が見つからなかった場合のダミー画像が表示されます。
  • index.phpに直書きされたコードは、どの関数も問題なく特定カテゴリー一覧からの値を返します。

該当のソースコード

php

1<?php 2// 条件:カテゴリースラッグ「voice」の記事を日付降順で6件取得 3$args = [ 4 'category_name' => 'voice', 5 'numberposts' => 6, 6 'orderby' => 'date', 7 'order' => 'DSC' 8]; 9?> 10 11<ul id="voice"> 12 13<?php 14// 条件を渡して記事を取得 15$custom_posts = get_posts($args); 16 17foreach ( $custom_posts as $post ): setup_postdata($post); ?> 18 <li><img src="<?php echo catch_that_image(); ?>" /><dl><dt class="sub-tit2 orange"><?php the_title(); ?></dt><dd class="date mb1em"><?php the_time('Y/m/d') ?></dd><dd><?php echo strip_shortcodes( wp_strip_all_tags( get_the_content() ) ); ?></dd></dl></li> 19<?php endforeach; ?> 20 21</ul>

試したこと

get_the_content() のみ特定カテゴリーの投稿一覧からの値を返しているので、

<?php the_title(); ?><?php echo get_the_title(); ?> に、
<?php the_time('Y/m/d') ?><?php echo get_the_time('Y/m/d') ?>

書き換えてみましたが、結果は変わらず、ショートコードを貼った固定ページ「home」の値が返されました。

また、上記phpコードの16行目に global $post; を追記したところ、指定したカテゴリー一覧から値を取得・表示できるよう(本来の動作)に戻ったのですが、

グローバル変数は使わないに越したことはない

という情報も目にしましたので、コードを増やさず記述の見直しか何かで本来の動作にできるようでしたらそのようにしたいと考えています。

補足情報(FW/ツールのバージョンなど)

WordPressのバージョン: 6.0.3
WPCode Liteのバージョン: 2.0.4.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

また、上記phpコードの16行目に global $post; を追記したところ、指定したカテゴリー一覧から値を取得・表示できるよう(本来の動作)に戻ったのですが、

グローバル変数は使わないに越したことはない

という情報も目にしましたので、コードを増やさず記述の見直しか何かで本来の動作にできるようでしたらそのようにしたいと考えています。

WordPress のループ関数( the_title()get_the_title() 等 ) は、グローバル変数 $post から投稿を判別して表示しますのでこれらの関数を使う場合は、 global $post;を記載が必要です。
グローバル変数 $post を使用しない場合、ページ表示時に設定された元々のグローバル変数 $post にセットされている投稿(固定ページの情報)で表示します。


グローバル変数を使わないようにするには、get_the_title( $post->ID );等の関数のパラメータに投稿ID を指定できる関数で 投稿ID をパラメータで指定してデータを取得・表示する必要があります。
また、関数が変わると一部のフックが適用されないこともあるのでテーマによっては表示が変わることもあります。

投稿2023/04/08 01:55

CHERRY

総合スコア25171

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

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

Sohaya

2023/04/08 09:27 編集

ありがとうございます。 教えていただいた投稿IDを指定する方法で 投稿タイトルは『<?php the_title(); ?>』を 『<?php echo get_the_title( $post->ID ); ?>』に、 投稿日付は『<?php the_time('Y/m/d') ?>』を 『<?php echo get_the_time('Y/m/d', $post->ID ) ?>』に修正することで カテゴリー一覧からそれぞれの値を取得できるようになりました。 アイキャッチ画像のURLについては 『アイキャッチ>なければ1枚目の投稿画像>なければダミー画像』となるよう https://since-inc.jp/blog/4791 上記の取得用コードを『functions.php』に追記して 『<?php echo catch_that_image(); ?>』で画像URLを呼び出しているのですが、 『index.php』に記述したときは『global $post;』なしでも呼び出せるのに (なぜ『index.php』だと呼び出せるのか不明) スニペットに登録してショートコードをフロントページ(固定ページ)に記述すると 呼び出せません(ダミー画像になります)。 ただ この『catch_that_image()』のコード自体にも 『global $post;』が使われていますので、 グローバル関数以外の解決策が見つかるまでは 教えていただいたように『global $post;』を記述して運用いたします。
CHERRY

2023/04/08 12:51

> 『index.php』に記述したときは『global $post;』なしでも呼び出せるのに (なぜ『index.php』だと呼び出せるのか不明) index.php のコードが不明ですが、ループの先頭で、 the_post() という関数を呼び出していたりしませんか? the_post() ( https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/the_post ) に > 参考 > - グローバル変数 $wp_query を使用します。 > - WP_Query::the_post() を呼び出して、グローバル変数 $post をセットします。 とあるように the_post() を実行すると関数で グローバル変数 $post に値がセットされます。
Sohaya

2023/04/08 23:30

コメントありがとうございます。 > index.php のコードが不明ですが、ループの先頭で、 the_post() という関数を呼び出していたりしませんか? 『index.php』の該当部分のコードは、質問に掲載したコードと同じものになります。 『index.php』からコードをコピペして、そのままスニペットに登録しました。 『index.php』を全文検索してみましたが、『the_post()』は見つかりませんでした。 16行目に追記した『global $post;』の代わりに『the_post();』を、 または 17行目の下に『<?php the_post(); ?>』の追記などを試してみたところ、 『<img src>』となり、src属性の値が出力されませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問