WordPressユーザーのbaserCMS覚え書き


favicon.icoをテーマディレクトリ内に置きたいときのコード例

[2014.1.5追記]
baserCMS3で追加された関数 getThemeUrl() のおかげで、favicon.icoをテーマディレクトリ内に置きたいときのコードが簡素化されました。本記事の最後に、baserCMS3で使えるコード例を示したので、よろしければご参照ください。


baserCMSには、コーポレートサイトの定番アイテムを一発で実装できる、かゆいところに手の届く関数がいくつもあります。いわゆる〈ファビコン〉へのリンクを出力できる $bcBaser->icon() もその一つ。ドキュメントルート(app/webroot)の直下に favicon.ico を置き、テンプレートファイルの <head> セクションに $bcBaser->icon() を書けばbaserCMS側でファビコンを取得・表示してくれます。

ところが、「画像はやっぱり img ディレクトリにまとめたいぜ」とテーマディレクトリ内の img ディレクトリに favicon.ico を置くと、この関数そのままでは当然うまく出力させることはできません。

そこで icon() 関数のソースを見てみます。baser/views/helpers/bc_baser.php の760行目あたり。

function icon() {

    echo  $this->BcHtml->meta('icon') . "\n";

}

どうやら実体は $BcHtml->meta() のようです。今度は cake/libs/view/helpers/html.php を見てみます。197行目あたり。

function meta($type, $url = null, $attributes = array(), $inline = true) {
    if (!is_array($type)) {
        $types = array(
            'rss'    => array('type' => 'application/rss+xml', 'rel' => 'alternate', 'title' => $type, 'link' => $url),
            'atom'    => array('type' => 'application/atom+xml', 'title' => $type, 'link' => $url),
            'icon'    => array('type' => 'image/x-icon', 'rel' => 'icon', 'link' => $url),
            'keywords' => array('name' => 'keywords', 'content' => $url),
            'description' => array('name' => 'description', 'content' => $url),
        );

        if ($type === 'icon' && $url === null) {
            $types['icon']['link'] = $this->webroot('favicon.ico');
        }

favicon.ico のパスを任意で指定したい場合は、どうやら $BcHtml->meta() の第1引数に icon,第2引数にURLを書けばよさそう。

ということで、こんな感じでまとめてみました。別ページの記事「現在使用中のテーマディレクトリのパスを取得する」の応用です。

<?php
$theme_dir = $bcBaser->getRoot() . 'themed/' . $siteConfig['theme'];
echo $BcHtml->meta( 'icon', $theme_dir . '/img/favicon.ico' ) . "\n";
?>

どうもチカラワザっぽい感がなきにしもあらずなので、よりエレガントな解法をご存じの方は @tecking までお知らせくださるとうれしいです。


[2014.1.5追記]
baserCMS3で使用中のテーマディレクトリを取得する関数 getThemeUrl() が追加され、より簡素にコードを記述できるようになりました。

<?php echo $this->BcHtml->meta( 'icon', $this->BcBaser->getThemeUrl() . 'img/favicon.ico' ) ?>

本記事初出時に getRoot() や $siteConfig['theme'] を使う必要があったのが getThemeUrl() 関数ひとつですむようになった、というわけです。