bloginfo('URL')でサイト名が表示されてしまう仕組み

WordPress個別サポート

WordPressのテンプレートタグbloginfoは、サイト名やキャッチフレーズの表示など、あちこちのテンプレートでサイト情報を表示するときに使われています。

bloginfoの用途
bloginfoの使用例(サイト名・キャッチフレーズの表示)

テーマをカスタマイズしたり自作するときも役立つ命令ですが、使い間違えると意図しない結果になります。たとえば、サイトのURLを取得するため、bloginfo('URL')と呼び出すとURLが表示されずに、なぜかサイト名が表示されます。

ここでは、「bloginfo('URL')」を実行するとサイト名が表示されてしまう仕組みを説明します。同じような問題が起きたときの参考にしてください。

bloginfoの仕組み

WordPressのソースコードからbloginfoの仕組みを見てみましょう。bloginfoのベースになる命令は、get_bloginfo関数です。WordPressインストール先の「wp-includes/general-template.php」の628行目あたり(WordPress 4.4.1の場合)に書かれています。

以下は、get_bloginfo関数の条件分岐に関するコードを抜粋したものです。「条件分岐」という仕組みによって、bloginfo('設定')で指定された設定に応じて各種サイト情報の表示が可能になります。

switch( $show ) {
    case 'home' : // DEPRECATED
    case 'siteurl' : // DEPRECATED
        …略…
    case 'url' :
        $output = home_url();
        break;
    case 'wpurl' :
        $output = site_url();
        break;
    case 'description':
        $output = get_option('blogdescription');
        break;
    case 'rdf_url':
        $output = get_feed_link('rdf');
        break;
    case 'rss_url':
        $output = get_feed_link('rss');
        break;
    case 'rss2_url':
        $output = get_feed_link('rss2');
        break;
    case 'atom_url':
        $output = get_feed_link('atom');
        break;
    case 'comments_atom_url':
        $output = get_feed_link('comments_atom');
        break;
    case 'comments_rss2_url':
        $output = get_feed_link('comments_rss2');
        break;
    case 'pingback_url':
        $output = site_url( 'xmlrpc.php' );
        break;
    case 'stylesheet_url':
        $output = get_stylesheet_uri();
        break;
    case 'stylesheet_directory':
        $output = get_stylesheet_directory_uri();
        break;
    case 'template_directory':
    case 'template_url':
        $output = get_template_directory_uri();
        break;
    case 'admin_email':
        $output = get_option('admin_email');
        break;
    case 'charset':
        $output = get_option('blog_charset');
        if ('' == $output) $output = 'UTF-8';
        break;
    case 'html_type' :
        $output = get_option('html_type');
        break;
    case 'version':
        global $wp_version;
        $output = $wp_version;
        break;
    case 'language':
        $output = get_locale();
        $output = str_replace('_', '-', $output);
        break;
    case 'text_direction':
        …略…
        if ( function_exists( 'is_rtl' ) ) {
            $output = is_rtl() ? 'rtl' : 'ltr';
        } else {
            $output = 'ltr';
        }
        break;
    case 'name':
    default:
        $output = get_option('blogname');
        break;
}

※「wp-includes/general-template.php」より抜粋

「switch」は条件分岐を記述するPHPの構文です。たとえば、

    case 'url' :
        $output = home_url();

によって「bloginfo('url')」を実行するとサイトのURLが表示される仕組みです。

同じように

    case 'name':
    default:
        $output = get_option('blogname');

によって、「bloginfo('name')」を実行するとサイト名が表示されます。

bloginfoの「その他」とは?

上記の条件分岐のポイントは最後の「default:」です。条件分岐の「それ以外は」を処理する部分です。

この部分では、「case 'name':」と同じように、サイト名が表示される仕組みになっています。つまり、「bloginfo('設定')」の設定がどれにも当てはまらない場合(その他の場合)はbloginfo('name')と同じようにサイト名が表示されます。

bloginfoの動作イメージ
  • bloginfo('url') → サイトURLを表示
  • bloginfo('description') → キャッチフレーズを表示
  • bloginfo('name') → サイト名を表示
  • bloginfo(その他の設定) → サイト名を表示

「その他の場合」とは、指定した文字が「url」でもなければ「description」でもない。「template_url」でもなければ「admin_email」でもない。どれにも当てはまらないということです。

たとえば、「description」とすべきなのに「discription」と入力ミスした場合などに「その他」に振り分けられてサイト名が表示されてしまいます。

問題の原因は「大文字と小文字の区別」

では、bloginfo('URL')はどうでしょうか。入力ミスには見えませんが、「url」だとは判断されず、「その他」に分類されてしまいます。それは、大文字と小文字が区別されるためです。

プログラミングでは一般的に大文字と小文字が区別され、「URL」と「url」は違う文字だと判断されることが多いです。

話が長くなりましたが、このような仕組みでbloginfo('URL')とすると、bloginfo('url')とは違い、どれにも当てはまらない「その他」だと判断されてサイト名が表示されるということです。思い当たる方はご注意ください。

WordPressのPHP