先に結論を書きます
投稿一覧から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 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
回答1件
あなたの回答
tips
プレビュー