WordPressユーザーのbaserCMS覚え書き


get_site_url() のようなものをbaserCMSで実現する方法

baserCMSとWordPressの相違点の一つに、テーマ内で使われるリソース、たとえば

  • 画像ファイル
  • CSSファイル
  • JavaScriptファイル

などの位置が、前者ではドキュメントルートからのパス、後者では絶対URLで出力されることが挙げられます。
(前者でも明示的に指定すれば絶対URLでの出力は可能)

リソースへのパスは通常、$this->BcBaser->img() や $this->BcBaser->css() 、 $this->BcBaser->js() で出力すればよいのですが、まれに、どうしても絶対URLを出力しないといけないケースに遭遇することがあります。

私の場合、このサイトを『Facebook Debugger』に通したとき、ドキュメントルートからのパスで記述したOGP画像がひっかかり

debugger.png

プロパティ「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 にする置換処理をかけています。