テーマの functions.php にアドホックなコードを追加するのはもうやめたい・・・さてどうしょう?
先日、このサイトで使っているテーマのTwenty Fourteen を更新した時に Google AdSense(AdSense)の表示方法も一緒に変更した。
色々な細かい点は続編の方に書くことにして、今回は実際に Twenty Fourteen と Twenty Sixteen の 2 種類のテーマで動作を確認したコードを、説明に先立ってアップする。
ちょっと見には more タグを AdSense 表示コードに置き換えているみたいだが、そうじゃなくて more タグの直下にショートコードを置いてそれらしく見せているだけだ。
広告ユニットの表示箇所:
- 広告ユニットの表示数は、 PC では 4 個とし、タブレットでは 3 個、モバイルホーンでは 2個とする。
- 振り分けは下の表のとおり。▲ は AdSense 以外の広告ユニット。
UA \ DISPLAY | ウィジェット | 文中 | ページ末尾(左) | ページ末尾(右) |
---|---|---|---|---|
PC | ▲ | ○* | ○ | ○ |
タブレット | ▲ | ○* | ○* | ― |
モバイル | ― | ○* | ○* | ― |
※UA はユーザーエージェント。「*(アスタリスク)」付きはレスポンシブサイズの広告ユニット。ページ末尾に 1 個の時はおおよそ中央に配置される。
今回の php クラスのサンプルコードは、このサイトで実際に使っているコードから広告表示コードの部分を削除したものをアップしてある。
サブタイトルで言っていることは完全には実現できていないが、functions.php にはクラス使用時の約束事を数行追加するだけなので、テーマの更新もそれほどストレスにはならない。
これ以降はサーバーに実用クラスをアップした時の手順を説明する。
サンプルコードは自由に使って頂いて構わないが、その場合はあくまでも各位の自己責任ということでお願いしたい。
準備:
- モバイル判定用のモジュール Mobile Detect をダウンロードする。
ダウンロード先: mobiledetect
※Mobile-Detect-2.8.17.zip(2015/12/23 現在)をダウンロードする。
ダウンロードした zip ファイルを解凍する。
解凍後の Mobile-Detect-2.8.17 フォルダの中には幾つかのサブフォルダとファイルがあるが、今回は Mobile_Detect.php ファイルだけを使った。
- Disp_Adsense.php ファイルを作成する。
コードウインドウ [Class Disp_Adsense] のコードをテキストエディタに貼りつけ、「$strAdCode =」から始まる文字列の中の「ここにホニャララのコードを貼りつける」と書いてあるところを、実際の AdSense 表示コードなどに置き換える。
完成した php コードに「Disp_Adsense.php」と名前を付けて保存する。
保存するときのエンコードは UTF-8 だ!
- テーマの functions.php をダウンロードする。
テーマの functions.php をダウンロードする。
functions.php はサーバーの \wp-content\themes\twentyfourteen ディレクトリにある。functions.php には後で数行のコードを追加する。
今回は functions.php や page.php などのテーマオリジナルファイルを編集する前に、データベースのエクスポートを始めとするすべてのバックアップを実行した。
コードの利用手順:
後は下の手順に従って進める。
Mobile_Detect.php、Disp_Adsense.php などの利用手順:
- 1) サーバーの \wp_content\themes\twentyfourteen の中に新規フォルダを作成する。名前は任意で良いが、私は【lib】という名前を付けた。
- 2)Mobile_Detect.php と Disp_Adsense.php を【lib】フォルダにアップロードする。
- 3)functions.php に [ functions.php 追加コード ] ウインドウのコードを追加して、テーマのルートディレクトリにアップロードする(UTF-8 )。
- 4)ショートコードを書いて結果を確認する。
※もしフォルダに【lib】以外の名前を付けたら、Disp_Adsense.php の「require_once (get_template_directory() . ‘/lib/Mobile_Detect.php‘);」とfunctions.php に追加した「require_once(get_template_directory() . ‘/lib/Disp_Adsense.php‘);」の「lib」の部分をその名前に変更する。
※私は Twenty Fourteen の content.php と content-page.php の中でショートコードを使っている。AdSense のポリシーに違反しない限り、ショートコードは好きな所に置ける。
Disp_Adsense.php のコード:
<?php /* *************************************************************************** */ // Google AdSense を表示するためのクラス(Edited by Bonkure)。 // モバイル判定には Mobile Detect Library を使用する。 /* *************************************************************************** */ class Disp_AdSense{ private $mobile_Detect; public function __construct() { // Mobile_Detect クラスの登録とインスタンスの取得。 if (!class_exists('Mobile_Detect')){ // 文字列を連結して絶対パスを取得する。 //「.(ピリオド))に気を付けること。 require_once(get_template_directory() . '/lib/Mobile_Detect.php'); } // インスタンスの作成。 $this -> mobile_Detect = new Mobile_Detect; // ショートコードの登録。 add_shortcode('adsense_in_widget', array(&$this,'write_adcode_in_widget')); add_shortcode('adsense_in_post', array(&$this,'write_adcode_in_post')); // これはテスト用のショートコード。 add_shortcode('adsense_in_any_content', array(&$this,'write_adcode_in_any_content')); // ウィジェットでショートコードが実行されるようにする。 // これは Codex のコード例を丸ごと頂いた。 add_filter( 'widget_text', 'shortcode_unautop'); add_filter( 'widget_text', 'do_shortcode'); // more タグ処理用関数をフィルターフックに登録する。 add_filter('the_content_more_link', array(&$this,'replace_readmore_link')); } /* *********************************************************** */ // モバイル判定ユーザー定義関数 /* *********************************************************** */ // モバイル・ホーン public function is_mobile(){ if($this -> mobile_Detect -> isMobile()): return true; endif; return false; } // タブレット public function is_tablet(){ if($this -> mobile_Detect -> isTablet()): return true; endif; return false; } // PC(デスクトップ) public function is_desktop(){ if(!($this -> mobile_Detect -> isMobile() || $this -> mobile_Detect -> isTablet())): return true; endif; return false; } /* ************************************************************* */ // AdSense コード出力用関数 /* ************************************************************* */ // ショートコード化対象の関数。ウィジェット用。 public function write_adcode_in_widget() { $tagStart = '<div style="max-width: 310px; margin: auto; text-align: center;">'; $tagEnd = '</div>'; $strAdCode = ''; // デスクトップかタブレットならば広告を表示する。 if($this -> is_desktop() || $this -> is_tablet()): // 固定サイズ。 $strAdCode= $tagStart .'PC かタブレットでは、ここに固定サイズの広告表示コー ド――Adsenseとは限らない――を貼りつける。</br> もし Adsense ならば、タブレットも非表示にするように 仕様変更する。' .$tagEnd; endif; return $strAdCode; } // ショートコード化対象の関数。投稿用。*/ public function write_adcode_in_post() { $tagStart ='<div style="margin: auto; max-width: 337px;"> <center>スポンサーリンク</center>'; $tagEnd = '</div>'; $strAdCode = ''; // アーカイブでは広告を表示しない。 if(is_single() || is_page()): // AdSense 表示用のコード。 // レスポンシブだが表示幅に制限をかけている。 $strAdCode = $tagStart.'</br>すべてのデバイスでここにレスポンシブ な AdSense のコードを貼りつける。 ただし今は幅を 301px に制限してテストしている。' .$tagEnd.'</br>'; endif; return $strAdCode; } // 文末に PCでは 2 個、モバイルデバイスでは 1 個の AdSence を表示する。 public function write_adcode_in_any_content() { $tagStart = '<div style="display: inline-block; margin: 8px; max-width: 310px; text-align: left;"> <center>スポンサーリンク</center>'; $tagEnd = '</div>'; $strAdCode = ''; if(is_single() || is_page()): if($this -> is_desktop()): // AdSense 表示用のコード。PC ではレクタングルを 2 個表示する。 $strAdCode = '<div style = "text-align: center;">' .$tagStart.'PC ではここに固定サイズの AdSense の コード(1)を貼りつける。</br></br>'.$tagEnd .$tagStart.'PC ではここに固定サイズの AdSense の コード(2)を貼りつける。</br>'.$tagEnd.'</div>'; else: // このコードは Twenty Fourteen の content.php、content-page.php // にショートコードを置く場合に使う。 // Twenty Sixteen の記事内にショートコードを置く場合にも、こちらの // コードを使うことができる。 $strAdCode = '<div style="margin: 0 auto 0 auto; max-width: 310px;"> <center style="background-color:#FFFFFF;">スポンサーリンク </center> モバイルではここにレスポンシブな AdSense のコードを貼りつける。 </div>'; // このコードは twentysixteen の page.php にショートコードを置く // 場合に使う。PC では固定サイズを 2個、モバイルではレスポンシブを // 1個表示する。 /* $strAdCode = '<div class = "entry-content"> <div style="margin: 0 auto 0 auto; max-width: 310px;"> <center>スポンサーリンク</center> モバイルではここにレスポンシブな AdSense のコードを 貼りつける。</div></div></br>'; */ endif; endif; return $strAdCode; } // more タグ処理用の関数。more タグ部分を丸ごとパーマリンクで置換している。 // ついでに表示文字列も差し替えてしまう。 // フィルターフックの登録は、他の関数と一緒にコンストラクタで実行している。 function replace_readmore_link() { return '<a href="' . get_permalink() . '">このページを読む</a>'; } } ?>
※コードウインドウを最大化すると 161 行目と 173 行目の 「max-widt: 310px;」の表示が不完全になるので注意して頂きたい。不思議なことがあるものだ。
Twenty Fourteen の functions.php に追加したコード:
テーマの functions.php の末尾に以下のコードを貼り付ける。
これはテーマを更新するたびに実行する必要があるが、書いているのは数行のクラス初期化コードだけなので、私としてはすごく気持ちが楽になった。
// \wp_content\themes\twentyfourteen\functions.php の末尾に以下のコード // を追加する。 /* *************************************************************** */ // Google AdSense 表示用クラス Disp_Adsense を使用する。 /* *************************************************************** */ // Disp_Adsense クラスの登録とインスタンスの取得。 if (!class_exists('Disp_Adsense')){ // 文字列を連結して絶対パスを取得する。「.(ピリオド))に気を付ける。 require_once(get_template_directory() . '/lib/Disp_Adsense.php'); } $dispAdsense; if(is_null($dispAdsense)){ $dispAdsense = new Disp_Adsense(); }
Twenty Fourteen の content.php の中でショートコードを実行させる例:
・・・省略・・・</div><!-- .entry-content --> <!-- Added by Bonkure.--> <?php echo '</br>' ?> <?php echo do_shortcode(''); ?> <?php endif; ?> <?php the_tags( '<footer class="entry-meta"><span class="tag-links">', '', '</span></footer>' ); ?> </article><!-- #post-## -->スポンサーリンク スポンサーリンク
注 1:
今回のテストでは、Twenty Fourteen の content.php にショートコードを実行させるためのコードを 2 行追加したが、追加コードの配置を色々いじっているうちに、サイトが正常に表示されなくなるという現象が発生した。
追加コードを削除すると正常に復帰するが、再度追加するとまた異状表示になる・・・。
追加コードそのものやクラスのコード自体に間違いがなくてもそうなるのだ。
最終的にはバックアップしてあったファイルにコードを書いて問題を解決した。
こういうエラーは、コード作成時にコピペを多用していると(極めて小さな確率には違いないが)いつかは必ず発生する。私は秀丸エディタのみならず、Microsoft Visual Studio の C# のコードエディタでも同じ事を数回経験している(戻る)。