get_site_url() のようなものをbaserCMSで実現する方法
baserCMSとWordPressの相違点の一つに、テーマ内で使われるリソース、たとえば
- 画像ファイル
- CSSファイル
- JavaScriptファイル
などの位置が、前者ではドキュメントルートからのパス、後者では絶対URLで出力されることが挙げられます。
(前者でも明示的に指定すれば絶対URLでの出力は可能)
リソースへのパスは通常、$this->BcBaser->img() や $this->BcBaser->css() 、 $this->BcBaser->js() で出力すればよいのですが、まれに、どうしても絶対URLを出力しないといけないケースに遭遇することがあります。
私の場合、このサイトを『Facebook Debugger』に通したとき、ドキュメントルートからのパスで記述したOGP画像がひっかかり
プロパティ「og:image:url」に指定された値「/theme/{使用中のテーマ}/img/ogp.png」はタイプ「url」としてパースできないため、URL「http://baser-for-wper.tecking.org/」のオブジェクト(タイプ「website」)は無効です。
というエラーが出てしまいました。baserCMS3で新規追加された themeUrl() 関数でOGP画像のありかを出力したのですが、どうやらここは絶対URLで記述しないといけなかったようです。
そこで、管理画面-[システム管理]にある「WebサイトURL」を取得しようと関数を調べたものの、意外なことにこれがない……しかも、データベース(MySQL)の中にも記述されてない……
どこだろうとくまなく探してみたら /app/Config/install.php にヒントがありました。
Configure::write('BcEnv.siteUrl', 'http://baser-for-wper.tecking.org/');
baserCMSで構築したサイトの「WebサイトURL」はここに記述されているんですね。
HTMLソースにこの値を出力したいときは write の反対ということで read を使い
<?php echo Configure::read('BcEnv.siteUrl') ?>
とすればオッケイです。
で、「OGP画像へのパスを絶対URLにて出力」という本題は?
こんなコードで実装しました。
<meta property="og:image" content="<?php echo str_replace( '//theme', '/theme', Configure::read('BcEnv.siteUrl') . $this->BcBaser->getThemeUrl() ) ?>img/ogp.png" />
Configure::read('BcEnv.siteUrl') の出力結果は http://baser-for-wper.tecking.org/、$this->BcBaser->getThemeUrl() の出力結果は /theme/{使用中のテーマ}/ となり、単純につなぐとスラッシュがダブってしまいます。そこで str_replace() で //theme から /theme にする置換処理をかけています。