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

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

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

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

PHP

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

Q&A

解決済

1回答

701閲覧

wordpress php 投稿一覧からsingle.phpで投稿を表示するときグローバル変数が初期化されてしまう

nekora

総合スコア501

WordPress

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

PHP

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

0グッド

0クリップ

投稿2020/02/22 04:40

編集2020/02/22 06:46

先に結論を書きます

投稿一覧からsingle.phpを表示した際、グローバル変数、シングルトンクラスが初期化されてしまうのをちゃんと維持するようにしたい。

関連記事 先にやってきたこと

関連記事にてsingle.phpで希望する記事一覧が取得できていると書きましたが
これは希望する記事のタグを**ブラウザを閉じると消える寿命0のクッキーに保存することで
実現してました。
**

しかし、プライバシー保護法やクッキーに関する昨今の情勢から却下されてしまいました。

そもそも何故クッキーにしたかというと、single.phpを読み込んだときget_header経由で
function.phpがはしり(多分そうだと思ってます)グローバル変数が初期化されてしまう事が
原因で苦肉の策としてクッキーを使っていました。

しかしこれが使えない以上__グローバル変数やシングルトンクラスでタグを維持してsingle.phpで
参照したいのですが、これがsingle.phpで初期化されてしまい、投稿のタグが取得できなくて
困っています。
__

思い当たるのは、__今使っているテーマが完全オリジナルなテーマ__ということです。

__組み込みのテーマのカスタマイズならグローバル変数を維持する機構が備わっている?__のではないかと
考えてます。それが今使っているオリジナルテーマには、実装されていないため、function.phpが読み込まれるたびに、せっかくのグローバル変数が初期化されているのではないかと・・・

シングルトンクラスも試してみましたがやはりfunction.phpが読み込まれるタイミングで初期化
されてしまい希望する投稿のタグが取得できません。

ご教授願いたいこと

どうすれば他のテンプレートでfunctions.phpを読み直してもグローバル変数を初期化せずに維持できるように出来るか

です。

wordpress、php3ヶ月目の初心者に、皆様のお知恵をお貸しいただけたら幸いです。

二重投稿にはならないとの事だったのでソースを公開させていただきます。

ブログ一覧で最初に読み込まれるテンプレート
カテゴリーテンプレート (category.php)

php

1<?php 2/** 3 * @author 4 */ 5//setcookie('tag_title' , ""); 6//$tag_title = ""; 7//setcookie('tag_title' , $tag_title ,0 , "/" ); 8 9global $siteurl, $tempurl,$topparents_slug,$topparents_id,$post; 10get_header(); 11$inst_tag_title = tag_title_handler::getInstance(); 12$inst_tag_title->set_tag_title("");?> 13<div class="wrap clearfix contents"> 14 <div class="contents-head"> 15 <?php get_breadcrumbs(); ?> 16 <h1><?php single_cat_title();?></h1> 17 </div> 18 <aside class="contents-side notPC"> 19 <?php include 'office/blog-list.php'; ?> 20 </aside> 21 <article class="contents-main"> 22 <div class="posts clearfix"> 23 <?php if (have_posts()): 24 while (have_posts()): 25 the_post(); ?> 26 <div class="content-archive-box"> 27 <?php get_template_part('content-archive'); ?> 28 </div> 29 <?php 30 endwhile; 31 endif; 32 ?> 33 </div> 34 <div class="pager clearfix"> 35 <?php 36 global $wp_rewrite; 37 $paginate_base = get_pagenum_link(1); 38 if (strpos($paginate_base, '?') || !$wp_rewrite->using_permalinks()) { 39 $paginate_format = ''; 40 $paginate_base = add_query_arg('paged', '%#%'); 41 } else { 42 $paginate_format = (substr($paginate_base, -1, 1) == '/' ? '' : '/'). 43 user_trailingslashit('page/%#%/', 'paged'); 44 $paginate_base .= '%_%'; 45 } 46 echo paginate_links(array( 47 'base' => $paginate_base, 48 'format' => $paginate_format, 49 'total' => $wp_query->max_num_pages, 50 'mid_size' => 4, 51 'current' => ($paged ? $paged : 1), 52 'prev_text' => '«', 53 'next_text' => '»', 54 'type' => 'list', 55 )); ?> 56 </div> 57 </article> 58 <aside class="contents-side isPC"> 59 <?php include 'office/blog-list.php'; ?> 60 </aside> 61<!-- pager --> 62</div> 63<?php get_footer(); ?>

投稿をタグで絞り込むためのサイダー
blog-list.php (office/blog-list.php)
制限に引っかかるので関連記事のソースをご覧ください。

記事一覧で個別記事の概要を表示するテンプレート
content-archive.php

php

1<?php global $tag_title; ?> 2<article class="blogs"> 3 <div class="date"> 4 <time pubdate="pubdate" datetime="<?php the_time('Y-m-d'); ?>" class="entry-date"> 5 <?php the_time(get_option('date_format')); ?> <small class="nobrAs">タグ:<wbr><?php the_tags('', ', '); ?></small> 6 </time> 7 </div> 8 <a href="<?php the_permalink(); ?>" class="cleatLink"> 9 <?php 10 if(preg_match('/<img.*?src=(["\'])(.+?)\1.*?>/i', $post->post_content, $image_url)){ 11 echo '<img src="'. $image_url[2] .'">'; 12 } else { 13 echo '<img src="'.get_template_directory_uri().'/images/secondlp/header-image/header.png">'; 14 } 15 ?> 16 <h2><?php the_title(); ?></h2> 17 <div class="isPC excerpt"><?php the_excerpt(); ?></div> 18 </a> 19</article>

タグで絞り込まれた記事一覧を表示するテンプレート
投稿タグテンプレート (tag.php)

php

1<?php 2/** 3 * @author 4 */ 5//setcookie('tag_title' , ""); 6//$tag_title = single_cat_title("", false); 7//setcookie('tag_title' , $tag_title ,0 , "/" ); 8global $siteurl, $tempurl,$topparents_slug,$topparents_id,$post,$tag_title; 9get_header(); 10$inst_tag_title = tag_title_handler::getInstance(); 11$tmp_tag_title = single_cat_title("", false); 12$inst_tag_title->set_tag_title($tmp_tag_title); 13$inst_tag_title = tag_title_handler::getInstance(); 14$tag_title_array = $inst_tag_title->get_tag_title(); 15echo "<pre>"; 16echo "tag.php get\n"; 17var_dump($tag_title_array); 18echo "</pre>"; 19?> 20<div class="wrap clearfix contents"> 21 <div class="contents-head"> 22 <?php get_breadcrumbs(); ?> 23 <h1><?php single_cat_title();?></h1> 24 </div> 25 <article class="contents-main"> 26 <div class="posts clearfix"> 27 <?php if (have_posts()): 28 while (have_posts()): 29 the_post(); ?> 30 <div class="content-archive-box"> 31 <?php get_template_part('content-archive'); ?> 32 </div> 33 <?php 34 endwhile; 35 endif; 36 ?> 37 </div> 38 <br> 39 <div class="pager"> 40 <?php global $wp_rewrite; 41 $paginate_base = get_pagenum_link(1); 42 if (strpos($paginate_base, '?') || !$wp_rewrite->using_permalinks()) { 43 $paginate_format = ''; 44 $paginate_base = add_query_arg('paged', '%#%'); 45 } else { 46 $paginate_format = (substr($paginate_base, -1, 1) == '/' ? '' : '/'). 47 user_trailingslashit('page/%#%/', 'paged'); 48 $paginate_base .= '%_%'; 49 } 50 echo paginate_links(array( 51 'base' => $paginate_base, 52 'format' => $paginate_format, 53 'total' => $wp_query->max_num_pages, 54 'mid_size' => 4, 55 'current' => ($paged ? $paged : 1), 56 'prev_text' => '«', 57 'next_text' => '»', 58 )); ?> 59 </div> 60 </article> 61 <aside class="contents-side"> 62 <?php include 'office/blog-list.php'; ?> 63 </aside> 64<!-- pager --> 65 <div class="detail_btn"> 66 <p class="contents-main-gotoppage clearboth"><a href="/category/blog/">すべてのブログ一覧へ戻る</a></p> 67 </div> 68 &nbsp; 69</div> 70<?php get_footer(); ?>

タグで絞りまれた記事一覧から個別記事を選んだ記事を表示するテンプレート
個別投稿 (single.php)

php

1<?php global $post,$tag_title_array;?> 2<?php get_header(); ?> 3<?php $inst_tag_title = tag_title_handler::getInstance(); 4 $tag_title_array = $inst_tag_title->get_tag_title(); 5 echo "single in FULLNAME=" . $tag_title_array['full_name'] . "TAG=" . $tag_title_array['tag'] . "RETURN=" . $tag_title_array['return'];?> 6<div class="wrap clearfix contents"> 7 8 <?php get_breadcrumbs(); ?> 9 10 <?php 11 if (empty($tag_title_array)) { 12 //echo "enter tag empty"; 13 if(have_posts()){ 14 while (have_posts()){ 15 the_post(); 16 get_template_part('inc/content'); 17 } 18 } 19 } else { 20 //echo "enter tag enabled"; 21 //echo "<pre>"; 22 //var_dump(get_tag_title()); 23 //echo "</pre>"; 24 //echo get_tag_title()['tag']; 25 $args = array( 26 'post_type' => 'post', 27 'orderby' => 'date', // 日付でソート 28 'order' => 'DESC', // DESCで最新から表示、ASCで最古から表示 29 'tag' => $tag_title_array['tag'] // 表示したいタグのスラッグを指定 30 ); 31 global $post; 32 $post = new WP_Query( $args ); 33 //echo "<pre>"; 34 //var_dump($post); 35 //echo "</pre>"; 36 if(have_posts()){ 37 while (have_posts()){ 38 the_post(); 39 get_template_part('inc/content'); 40 } 41 } 42 } 43 wp_reset_postdata(); 44 ?> 45</div> 46<?php get_footer(); ?>

コンテンツを表示するテンプレート
content.php (inc/content.php)
制限に引っかかるので関連記事のソースをご覧ください。

同じタグが付いた記事間を移動するためのページゃー
pager.php (inc/pager.php)
制限に引っかかるので関連記事の自己解決レスをご覧ください。

functions.phpに用意したシングルトンクラス

php

1// final キーワードで派生クラスの生成を禁ずる 2final class tag_title_handler 3{ 4 // 唯一のインスタンスを保持する 5 private static $_instance; 6 7 private static $_tag_title = ""; 8 9 // コンストラクタ 10 // tag_title_handler クラスインスタンスの生成は外部から禁止 11 private function __construct() { } 12 13 // __clone マジックメソッド 14 // tag_title_handler クラスのクローンは外部から禁止 15 private function __clone() { } 16 17 /* 18 * 常に同じインスタンスを返す。 19 * 外部からインスタンスを取得する唯一の方法を提供する 20 */ 21 final public static function getInstance(){ 22 if(is_null(self::$_instance)){ 23 echo "_instance is null"; 24 self::$_instance = new self(); 25 } 26 return self::$_instance; 27 } 28 29 // tag_titleを設定する 30 public function set_tag_title($param) 31 { 32 $this->_tag_title = $param; 33 } 34 35 // tag_titleを取得する 36 public function get_tag_title() 37 { 38 //echo 'enter tag_title_handler get' . "\n"; 39 //echo 'tag_title=' . $this->_tag_title . "\n"; 40 if ( empty( $this->_tag_title ) ) { 41 return array(); 42 } 43 $office_tag_array = [ 44 '就職'=>['tag'=>'syusyoku','full_name'=>'就職','return'=>'/tag/syusyoku/'], 45 'イベント'=>['tag'=>'event','full_name'=>'イベント','return'=>'/tag/event/'], 46 'プログラム'=>['tag'=>'program','full_name'=>'プログラム','return'=>'/tag/program/'], 47 '板橋'=>['tag'=>'itabashi','full_name'=>'板橋','return'=>'/tag/itabashi/'], 48 '高田馬場'=>['tag'=>'takadanobaba','full_name'=>'高田馬場','return'=>'/tag/takadanobaba/'], 49 '小岩'=>['tag'=>'koiwa','full_name'=>'小岩','return'=>'/tag/koiwa/'], 50 '葛西駅前'=>['tag'=>'kasaiekimae','full_name'=>'葛西駅前','return'=>'/tag/kasaiekimae/'], 51 '梅島'=>['tag'=>'umejima','full_name'=>'梅島','return'=>'/tag/umejima/'] 52 ]; 53 $temp_array = $office_tag_array[$this->_tag_title]; 54 $return_array = ['full_name'=>$temp_array['full_name'] , 'tag'=>$temp_array['tag'] , 'return'=>$temp_array['return']]; 55 return $return_array; 56 } 57} 58

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/02/22 04:56

以前の質問と別問題が発生したのであれば、それは二重投稿にならないと思いますから、課題としている現象が再現できる最小限のコードを質問文に記載してもらえますか?
nekora

2020/02/22 09:45

onodaさん、わざわざありがとうございます。前の質問のコメントに理由をつけておきました
guest

回答1

0

ベストアンサー

とりあえず違う部分を指摘します。(前記事は確認していません)

投稿一覧からsingle.phpを表示した際

この時点でページが移動しています。

single.phpを読み込んだときget_header経由で

function.phpがはしり(多分そうだと思ってます)

違います。

【WordPressの仕組みを理解する】
http://www.nsthink.com/wordpress/

【WordPressの読み込み順 | ハックノート】
https://hacknote.jp/archives/29587/

【WordPressの起動2 – WordPress起動時に読み込まれるPHPファイルの順番 | バッテラハイシステム - インドネシアのIT情報をジャカルタより発信!】
https://bahtera.jp/wordpress-process/

投稿2020/02/22 04:53

kei344

総合スコア69400

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

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

kei344

2020/02/22 07:33

低評価をされるのはかまいませんが、どの部分に問題があるかはコメントくださいね。当回答および次回以降の回答の改善につながる可能性もあるので、よろしくおねがいします。
nekora

2020/02/22 10:20 編集

失礼しました、kei344様、ページが変わってる、違います、リンク見て勉強しろということだったのでしょうが、wordpress上級者には当たり前のことでリンク見れば分かるじゃん的な事も、経験3ヶ月の初心者には リンク先の内容も半分も理解できず・・・ ご教授願いたいこと どうすれば他のテンプレートでfunctions.phpを読み直してもグローバル変数を初期化せずに維持できるように出来るか という問題に対し ここがこうだからこうしなさい、と言うアドバイスでなかったため評価を下げてしまいました。 せっかくご回答いただいたのに。大変失礼な真似してしまいました。心からお詫びいたします。 評価は戻しておきました。申し訳ありませんでした。
kei344

2020/02/22 15:39

「質問の回答になっていない」と思われるのであれば、最初のコメントでも書いていますが低評価されるのはかまいませんよ。根本的な部分の理解が無い可能性があると思ったので、その部分を指摘しただけの回答なので。 PHP(及び多くのサーバサイド言語)はブラウザに表示した時点で処理が終わっています。処理が終わったページの変数は引き継がれません。GET/POSTでパラメータを渡すとか、セッションに格納するとかそういう処理が必要になります。(別ページになっていることを気づけばそれに対処するかな、と思ったので指摘だけしました) そういった処理のコードを書くにはWordPress内でそれらがどう処理されるかを知らなければ意図せぬ挙動をする可能性(デフォルトの動作の邪魔になったり、別のURLを表示したり)があり、「初心者」には詰まることが多いと思いますが、がんばってください。
nekora

2020/02/23 01:22

kei344様、失礼な真似をしたにもかかわらず、ご丁寧な解説をありがとうございます。m(_ _)m 知りたかったことはまさにそれで、何とかやってみます。ただデフォルトの動作を壊さないように ご提示いただいたリンクの内容もがんばって理解して挑みたいと思います。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問