【アプリ作成編】WordPress内に独自URLでコンテンツ表示
WordPressの固定ページや投稿のURL(パーマネントURL)の下に、
サブ階層を持たせたURLを独自に作成し、
それぞれのURLのアクセスに応じた結果を表示するアプリケーションを、
WordPress内にショートコードで実現する方法をご紹介します。
概要
WordPress内で表示するコンテンツとパラメータ変数の準備
WordPressは内部的に常にURLのリライトを行いながら、
サイトのトップに配置している「index.php」が処理をしている事はご存知の事と思います。
WordPressの中のコンテンツで独自のURLを認識させるためには、
リライトルールを定義する必要があります。
またリライトの結果URLから値を受け取るには、
URLパラメータを定義する必要があります。
WordPressへ「URLパラメータ」の追加と「リライトルール」の定義
まずテーマの「functions.php」にパラメータの追加とリライトルールの定義を行います。
私は「functions.php」介して別ファイルを読み込んで処理しています。
1 |
include 'functions_rewrite.php'; |
読み込んでいるファイルには以下の定義をしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
function add_query_vars_filter( $vars ){ $vars[] = "wd_ymd"; return $vars; } add_filter( 'query_vars', 'add_query_vars_filter' ); function test_custom_endpoint( $wp_rewrite ) { $idx = 0; $pid_setting["wd_demo"] = array('36083', '39198'); if($_SERVER['HTTP_HOST'] == 'rensrv.com' ){ $idx = 1; } $wd_demo = $pid_setting["wd_demo"][$idx]; $feed_rules = array( 'weekday/(([0-9]{1,4})/(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01]))/?$' => 'index.php?page_id='. $wd_demo .'&wd_ymd='.$wp_rewrite->preg_index(1), ); $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules; return $wp_rewrite->rules; } add_filter( 'generate_rewrite_rules', 'test_custom_endpoint' ); function test_flush_rewrite_rules() { global $wp_rewrite; $wp_rewrite->flush_rules(); } add_filter('init', 'test_flush_rewrite_rules'); |
詳細は以下になります。
コンテンツを表示するショートコードを作成
固定ページ内のコンテンツエリアにプログラムが処理した動的な結果を表示する事が目的ですので、
処理はショートコードで行います。
またショートコードは、上で定義したURLクエリ文字列を介して値を受け取ります。
テーマの「functions.php」にショートコードの定義を行います。
私は「functions.php」介して別ファイルを読み込んで処理しています。
1 |
include 'functions_sitemapdemo.php'; |
読み込んでいるファイルは以下のようにしています。
これで[weekday_demo]というショートコードが利用できるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
function weekday_demo_handler() { global $wp_query; $wd_ymd=null; $wjp = array('日','月','火','水','木','金','土'); if( isset( $wp_query->query_vars['wd_ymd'])) { $wd_ymd = urldecode (htmlspecialchars($wp_query->query_vars['wd_ymd'])); }else{ //今日の日付で表示する $tday = new DateTime('now'); $wd_ymd = $tday->format('Y/m/d'); } if($wd_ymd <> null){ $da = split('/',$wd_ymd); // nnnn/mm/dd しかリライトされない $y = $da[0]; $m = $da[1]; $d = $da[2]; $tdate = new Datetime( "$y-$m-$d" ); $cnv = $tdate->format('Y年m月d日'); //日付生成失敗 if($tdate === false){ return "ご指定の日付({$wd_ymd})では処理ができませんでした。申し訳ありませんがご確認お願い致します。"; } //曜日を求める $wdnum = (int)date_format($tdate, 'w'); $wk = $wjp[(int)$wdnum]; //出力の整形 $s_m = (string)(int)$m; $s_d = (string)(int)$d; $res = <<<eof <p>ご指定の日付(<span style="color:blue;font-weight:bold;">{$wd_ymd}</span>)は<span style="color:blue;font-weight:bold;">「{$wk}曜日」</span>でした。(グレゴリオ暦ベース)</p> <p>以下をクリックする事でGoogle先生で答え合わせができます。<br/> ※999年以前は先生も表示しない模様・・・そもそも古くは六曜とかですし答えがあるかさえ。。。</p> <p><a href="https://www.google.co.jp/search?q={$y}%2F{$m}%2F{$d}+%E6%9B%9C%E6%97%A5&oq={$y}%2F{$m}%2F{$d}%E3%80%80%E6%9B%9C%E6%97%A5" target="_blank">>「{$cnv}」 が本当に<span style="font-weight:bold;">「{$wk}曜日」</span>かをGoogleで確認</a><br/> <a href="https://ja.wikipedia.org/wiki/Wikipedia:%E4%BB%8A%E6%97%A5%E3%81%AF%E4%BD%95%E3%81%AE%E6%97%A5_{$s_m}%E6%9C%88#{$s_m}%E6%9C%88{$s_d}%E6%97%A5" target="_blank">>「Wikipedia:今日は何の日_{$s_m}月#{$s_m}月{$s_d}日」を見てみる。</a></p> eof; return $res; } } add_shortcode("weekday_demo", "weekday_demo_handler"); |
処理はWordPressのグルーバル変数($wp_query)から、
パラメータの「wd_ymd」という値を受け取りサニタイズ処理をして利用します。
与えられた日付を元に曜日を求めて、表示文字列を返します。
詳細は以下になります。
ショートコードの動作を確認する。
実際にショートコードを固定ページに記載して表示の確認を行います。
「https://rensrv.com/weekday/2018/05/30/」にアクセスすると、
曜日が計算されて表示されます。
検証用にGoogleの検索結果で表示される曜日が確認できるリンクも出力しています。
またその日にあった出来事が見られるWikiPediaページへもリンクしています。
ご愛嬌です。
タイトル・抜粋・キーワードのユニーク化
通常、WordPressでのコンテンツですので、
プラグインなどで作成されるサイトマップの一覧に現れるURLは、
「https://rensrv.com/weekday/」のみです。
特にそれでよければ意識する必要はありませんが、
もしGoogleなどの検索結果で直接URLが表示されるようにインデックスしたい場合には、
タイトルや抜粋部なども個々のページに合せた方がいいかもしれません。
基本的にWordPressの初期状態(メタ系プラグイン非使用)の場合、
キーワードや抜粋などの登録はしません。
本文からGoogleお任せといったところです。
SEOプラグインなどではキーワードや抜粋を独自に登録するフィールドが表示され、
そこにキーワードを入れたり、表示したい抜粋を入れたりするでしょう。
実際のタイトルユニーク化(使用例)
その部分も動的に生成するような仕組みを導入すれば、
それぞれがユニークなURLとして、
それぞれのタイトルでGoogle検索結果に表示されやすくなるはずです。
この手順は使用プラグインなどで仕様が異なる為、
追ってご紹介とさせて頂きますが、検索結果の例としては以下のようになります。
「27.134.160.0/20 – CIDR展開結果・・・」などのように、
CIDR(IPアドレスの範囲)ごとにURLタイトルが登録されているのが確認できるはずです。
(Google先生に消されなければ)
そして、検索結果のリンク先をクリックするだけで、
そのCIDR範囲に含まれているIPアドレスを目視できる仕組みを作っています。
大半の結果が抜粋部分で「IPアドレスの範囲(27.134.160.0 – 27.134.175.255)」と、
表示してしまっていますので、そこだけを見れば分かる人は結果が得られてしまっていますけども^^;
※現在は変更済みで、インデックスの更新待ち。
【注意】
上記で例示した検索結果のインデックス登録は検索利便性向上を目的としてやっているつもりです。
ですが、登録要求をしているインデックス数が非常に膨大なため、
サイトに対してGoogleからペナルティーなどの制裁を受ける恐れもあると考えています。
上記サイトは元々アクセス数が少ない瀕死のサイトです。
ペナルティーを受けるリスクを覚悟して実施している施策であることを申し添えます。
似た事をされる場合は、それなりの覚悟で自己責任でお願いします。
※Fetch as Googleは行わず、サイトマップ登録のみでインデックス要求しています。
余談(何でこんなことやってるの?)
上記で表示されている検索結果は地味に苦労しました。
例えばよく使う「192.168.1.0/24」というCIDR表記のIP範囲は、
「192.168.1.0 – 192.168.1.255」です。
では、CIDRで「192.168.1.1/24」と指定した場合どうなるか?
IP範囲は同じ「192.168.1.0 – 192.168.1.255」なのです。
これは「192.168.1.254/24」でも同じで、
CIDRの記述ルールが「ネットワークIPアドレス/ネットマスク値」が原則なだけで、
「IPアドレス/ネットマスク値」として記述しても、
処理上はネットワークIPアドレスとして解釈される事に起因しています。
※/24でマスクされてしまう為。
要は「192.168.1.0/24」は正規のURLとして有効だけれども、
「192.168.1.1/24」や「192.168.1.254/24」など、
「192.168.1.1/24 …(連続)… 192.168.1.255/24」全てが同じ結果になるという事です。
The「重複コンテンツ」!!!
その為、サイトマップではすべてこの重複を除外する必要があると共に、
もし「192.168.1.1/24 ….. 192.168.1.255/24」でアクセスされた場合には、
「rel=”canonical”」指定で「192.168.1.0/24」に対して、
正規化しなければならないという・・・恐ろしい面倒さがあるわけです。
全IPアドレスは約43億弱(2の32乗=4294967296)あります。
その中からネットワークIPアドレスになりうる値だけを取り出し、
それぞれのネットマスク値(/1~/31、*/0と/32は除外)ですべて正規化する必要があるのです。
やり始めたはいいけど、途中で何度、白い目・遠い目になった事かと。。。
誰も手を出していなかったのはそういう事か・・・ってね。
当サイト内のコンテンツおよび画像を含むすべてにおいて、管理人アルゴリズンが著作権を保持しております。
当サイトでご紹介しております写真等につきましては著作権の放棄はしませんが、
ライセンスフリーでご利用いただいて構いません。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
サイト内コンテンツを引用される際には、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
公開日: