FAQのためのプラグインでは、目的としていることを叶えられないものですか?
カテゴリーqaの投稿が3件以上あって、表示される3件とも本文は正しいのにタイトルが3件とも同じ(固定ページのタイトル)になってしまう、ということですか?
phpを書くためのショートコードは、何かのプラグイン、または子テーマのfunctions.phpで用意したものと思いますが、それらの情報も教えてください。
熊本地震東区避難所68日目さん
プラグインでもあるのかもしれませんが、Q&Aをアコーディオンメニューで表示非表示を切り替えたり、CSSで色々と装飾したり色々好きなようにカスタマイズしたいのでプラグイン以外で考えておりました。
gblsmさん
>>カテゴリーqaの投稿が3件以上あって、表示される3件とも本文は正しいのにタイトルが3件とも同じ(固定ページのタイトル)になってしまう、ということですか?
⇒その通りです。3件とも本文は正しいのに、タイトルが同じ固定ページのタイトルになっていまいます。
>>phpを書くためのショートコードは、何かのプラグイン、または子テーマのfunctions.phpで用意したものと思いますが、それらの情報も教えてください。
⇒functions.phpに記述しています。
function Include_my_php($params = array()) {
extract(shortcode_atts(array(
‘file’ => ‘default’
), $params));
ob_start();
include(get_theme_root() . ‘/’ . get_template() . “/inc/$file.php”);
return ob_get_clean();
}
add_shortcode(‘myphp’, ‘Include_my_php’);
the_title 関数は、グローバル変数の $post を参照して、タイトルの出力を行います。
上記のショートコード、およびファイルに記述したコードでは、$post は、Include_my_php 関数のローカル変数となるため、タイトルの反映がなされません。
get_headerやget_sidebar, get_template_part がファイルを読み込む際に利用する関数 load_template では、読み込むテンプレートが呼び出し側のテンプレートと大差なく利用できるように、幾つかの変数のグローバル宣言や、変数処理を行なってから require するようになっています。
Code Reference load_template
おすすめとしては、Include_my_php 関数の include 関数を、そっくり load_template 関数に置き換えてしまう方法です。
load_template( get_theme_root() . '/' . get_template() . "/inc/$file.php", false );
jim912さん
ありがとうございます。
まだまだワードプレス、phpの理解が浅い部分があり、
今回教えて頂いた事を調べもう少し理解してから挑戦をしたいと思います。
jim912さん
またご覧になられることがあれば質問をさせて頂きたいのですが
昨日質問をさせて頂いた固定ページ内にショートコードを埋め込んでphpを動かせるようにし、投稿記事のタイトルと本文を表示させようとした場合、ショートコードでincludeさせたphpファイル内に記述するだけではタイトル・本文を表示させることはできないという認識で合っていますでしょうか。
今の状態としては固定ページ内に[phpinclude file=’qa_list’]というphpファイルをインクルードさせてphpが動いていることまでは確認ができています。
ショートコードでincludeさせたphpファイル内に記述するだけではタイトル・本文を表示させることはできないという認識で合っていますでしょうか。
表示させるには、一定のお膳立てが必要であると理解してください。
理由については、変数を参照できる範囲(スコープ)について理解してもらう必要があります。
※ リンク先の説明が、具体例もあり分かりやすいと思います。今回の内容であれば、「global キーワード」まで理解すれば問題ありません。
ショートコードは、実行された場合、add_shortcode で指定された関数の実行を行います。
関数内の変数は、通常関数内でのみ参照可能なローカル変数となり、関数内で include されたファイルの変数も、この関数のスコープを引き継ぎます。
一方、the_titleは、グローバル変数の $post を参照するため、関数内の $post (foreachで$postを使ってますよね)の値を参照させるためには、ショートコードの関数内、もしくは、includeされたファイル内で、global 宣言を行う必要があるのです。
自前で、このglobal宣言を行って include していただいてもいいのですが、それよりは関数内で必要なglobal宣言を行い、ファイルを require する load_template を使った方が、header.php などと同じ感覚で使えて、問題も起きにくいということです。
ご丁寧に説明を頂きありがとうございます。
php初心者の私ですがご紹介頂いたサイトや回答頂いた言葉の意味を調べていくうちに、まだふんわりとした感じではありますが、できない理由やらなければならない準備が少しずつわかってきました。じっくり調べ理解してからやってみようと思います。
本当にありがとうございました。