CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
2019/09/28
CakePHP3でページごとに必要となる処理や変数などを編集する処理
前回の記事「CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定」では、あらかじめ用意されている HTMLヘルパーを利用して OGPを設定しました。
HTMLヘルパーは便利なのでこれを利用しない理由はありませんので、実際に実装する場合は HTMLヘルパーを利用する方法を使用してください。
ですが、今回の記事は、同じことを「fetch()」「assign()」を利用して実装することもできます、という実験的な内容の記事になります。
この方法は下記の記事で書いている「fetch()」「assign()」を利用する方法です。
CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法
この仕組は、下記の記事に書いている、JavaScriptや CSSを使用するページごとに指定する方法などにも活用することができます。
CakePHP3でページごとに読み込むJavaScript、CSSを変える処理の解説
いずれの処理も、レイアウトファイルに変数を指定しておき、各ページのテンプレートファイル側でそのレイアウトファイルの変数に埋め込む変数の値を指定する、という仕組みです。
CakePHP3で OGPを設定する具体的な設定方法
それでは、以下はサンプルソースを利用した具体的な設定方法を解説していきます。
レイアウトファイル default.ctpを編集
まず最初は、レイアウトファイル「default.ctp」を編集します。
パス付きのファイルは以下になります。
/src/Template/Layout/default.ctp
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<head> <?= $this->Html->charset() ?> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title> <?= $cakeDescription ?>: <?= $this->fetch('title') ?> </title> <?= $this->Html->meta('icon') ?> <?= $this->Html->css('base.css') ?> <?= $this->Html->css('style.css') ?> <?= $this->fetch('meta') ?> <?= $this->fetch('css') ?> <?= $this->fetch('script') ?> <?= $this->fetch('ogp') ?> </head> |
17行目の「$this->fetch('ogp')」を追記します。
追記した箇所に OGPのタグが編集されます。
各ページのテンプレートファイル view.ctpを編集
各テンプレート側では、OGPのタグとそのタグに編集する変数を指定します。
パス付きのファイル名は以下になります。
/src/Template/Topics/view.ctp
「fetch(‘ogp’)」で指定した箇所に編集する値は、「assign(“ogp”, “値”)」という形式で指定します。
ここではサンプルとして、URLだけを変数で指定しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php $url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $ogpHtml = '<meta property="og:site_name" content="サイト名" />'; $ogpHtml .= '<meta property="og:title" content="タイトル" />'; $ogpHtml .= '<meta property="og:type" content="トップページは website、個別ページは article" />'; $ogpHtml .= '<meta property="og:url" content="' . $url . '" />'; $ogpHtml .= '<meta property="og:image" content="サムネイル画像の URL" />'; $ogpHtml .= '<meta property="og:description" content="記事の description(記事概要)"/>'; $ogpHtml .= '<meta property="fb:app_id" content="FacebookのアプリID" />'; $ogpHtml .= '<meta property="og:locale" content="ja_JP" />'; $this->assign("ogp", $ogpHtml); ?> |
ただ、上記の方法ではやや見にくいため、下記のように「assign」を使わず「start」~「end」で指定する方法もあります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $this->start("ogp"); echo '<meta property="og:site_name" content="サイト名" />'; echo '<meta property="og:title" content="タイトル" />'; echo '<meta property="og:type" content="トップページは website、個別ページは article" />'; echo '<meta property="og:url" content="' . $url . '" />'; echo '<meta property="og:image" content="サムネイル画像の URL" />'; echo '<meta property="og:description" content="記事の description(記事概要)"/>'; echo '<meta property="fb:app_id" content="FacebookのアプリID" />'; echo '<meta property="og:locale" content="ja_JP" />'; $this->end(); ?> |
これで、ページごとの OGPを設定することができます。
ちなみに、サンプルソース中に出てくる「Topics」は、「お知らせ情報」が入っているテーブルで、テーブルレイアウトは「CakePHP3で保存前にバリデーション結果を取得する2つの方法」の記事にあるような内容を想定してください。
OGPの部分をエレメントとして別ファイルにする方法
先に解説した内容でも OGPとして機能はしますが、いくつものテンプレートに同じ内容を記述する必要があり、メンテナンス性が高くありませんので、OGPの部分はエレメント(パーツ)として別ファイルとして管理したほうが便利でしょう。
OGPのタグをエレメントファイル ogpElement.ctpとして編集
まず最初に、OGPとして記述する内容をエレメントとして取り出します。
生成するファイルのパス付きファイル名は以下になります。
/src/Template/Element/ogpElement.ctp
そこに下記の内容を記述します。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $this->start("ogp"); echo '<meta property="og:site_name" content="サイト名" />'; echo '<meta property="og:title" content="' . $ogpTitle . '" />'; echo '<meta property="og:type" content="トップページは website、個別ページは article" />'; echo '<meta property="og:url" content="' . $ogpUrl . '" />'; echo '<meta property="og:image" content="サムネイル画像の URL" />'; echo '<meta property="og:description" content="' . $ogpDescription . '"/>'; echo '<meta property="fb:app_id" content="FacebookのアプリID" />'; echo '<meta property="og:locale" content="ja_JP" />'; $this->end(); ?> |
ここでは「og:title」「og:url」「og:description」を変数としていますが、実際に設定する場合は「og:type」「og:image」も変数として指定する必要があります。
テンプレートファイル view.ctpの変更
そして、各ページのテンプレート側は下記のように修正します。
パス付きのファイル名は以下になります。
/src/Template/Topics/view.ctp
|
1 2 3 4 5 6 7 |
<?php $url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $title = "タイトル1"; $description = "記事の description(記事概要)1"; echo $this->element("ogpElement",["ogpUrl"=>$url,"ogpTitle"=>$title,"ogpDescription"=>$description]); ?> |
先程作成したエレメントファイルを「$this->element()」で読み込みます。
1つ目のパラメーターが、エレメントのファイル名になります。
2つ目のパラメーターが、エレメントに渡す変数を指定箇所になります。配列で指定できますので、必要に応じていくつでも指定することができます。
サイト全体に共通する処理をページごとに切り替える処理
今回は、サイト全体に共通して指定をする必要はあるものの、ページごとにそれぞれ違うテキストを切り替えて編集していく必要がある metaタグの一種である OGPを指定する方法を解説しました。
同じような考え方をする仕組みとして、下記の記事で書いている titleタグ、h1タグの値を指定する方法や、使用する JavaScriptや CSSをページごとに設定する方法、パンくずを指定する方法、metaタグの「keywords」「description」を指定する方法などにも活用することができます。
CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法
CakePHP3でページごとに読み込むJavaScript、CSSを変える処理の解説
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
これらは、レイアウトファイルに変数を指定しておき、そこに編集する値を各ページ用のテンプレートファイルで指定する、という仕組みです。
CakePHP3の関連記事
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
その他の「CakePHP3」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定
CakePHP3の Authコンポーネントや CakeDC/Usersプラグインなどを利用したユーザ管理・認証システムにおいて、ログインしていなくても見ることができるページの設定方法を解説。
-
-
CakePHP3のCakeDC/Usersのログイン後のリダイレクトとユーザ権限管理の設定解説
CakeDC謹製Usersプラグインの紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。
-
-
CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法
CakePHP3でtitleタグ、h1タグのテキストをデフォルトから変更する方法を解説。テンプレートファイルに「$this->assign()」でテキストを指定して「/Layout/defult.ctp」で受け取る。
-
-
CakePHP4、5でSELECT telephone as tel FROM usersの様にasでカラムに別名を付ける方法
CakePHP4、CakePHP5でクリエビルダーを利用してテーブルからレコードを取得する際、asを使用してカラムの別名で値を取得したい場合の対応方法を解説。また、別名にはハイフンやアスタリスクなど使用できない文字がある点も解説。
-
-
CakePHP3で静的ページの作成は webrootか pagesを使う。トップページを参考に解説
CakePHP3で静的なページを設置する場合の方法(webrootとpagesとを活用する方法)を解説。pagesの解説はデフォルトのトップページがどう表示されているかを参考に解説。ルーティングの機能も。
-
-
CakePHP5系でDeprecatedを回避しfindListでキーと値のカラムを指定して取得する方法
CakePHP4のfindListでキーと値のカラムを指定してテーブルにアクセスする方法がCakePHP5では「Deprecated(非推奨)」となった。推奨の記述方法を解説。
-
-
CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法
コントローラーからビューに送ったテーブルのオブジェクトを連想配列に変換し、ビューの中で自由に使えるようにするメソッド「toArray()」の解説。連想配列に変換できれば利用度アップ!
-
-
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。
-
-
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4のシステムから他のシステムのデータベースにアクセスをし、SQL文を実行する方法を解説。try-catchでエラーを取得する方法も解説。
-
-
CakePHP3で生の SQLの実行はConnectionManagerを使う
CakePHP3で生の SQL文を実行する方法を解説。クリエビルダーを使う場合は TableRegistryを利用するが、SQLを実行する場合は ConnectionManagerを使う。プリペアードステートメントの使用方法も解説。