functions.phpの解説

ホーム > WordPressの記事

WordPressをだいたい理解できてきた。PHPを使いこなしているわけではないけど、直接テンプレート内のPHPを書き換えたり、処理を自分になりに追記したりして、なんとかできるようになってきた。という方でも、functions.phpだけは触りたくないと思うのは正しい感情です。

functions.phpはWordPressの心臓・・というよりも、動脈に近い存在で、公開中のサイトだけでなく、管理画面にも影響があるファイルです。ここで1つでも間違えた記述をすると、管理画面でエラーが出たまま直す事ができなくなります。

ブラウザでエラーが出たまま管理画面が表示されなければ、完全にお手上げです。FTPなどでファイルをアップロードしなおすしかありません。

FTPってのが何なのかわかんないって人は、絶対にfunctions.phpを触ってはいけません。functions.phpさえエラーが出なければ、他のテンプレート用PHPでどんなにエラーが出ていても、管理画面からなんとか修正して復帰できます。

必要最低限の記述内容

functions.phpを開いてみると、何やら難解な事が沢山書いてあって、しかもとても長いです。

もしかすると、WordPressというのはfunctions.phpで動いているんじゃないか?functions.phpはWordPressの肝とか言われているじゃないか。とも思った事もあるかと思いますが、少し違います。

先ほど、functions.phpはWordPressの心臓・・と言いかけて、動脈と言いなおしました。

その意味がわかる事から説明します。

質問:
HTMLペラ一枚しかないサイトにWordPressを導入し、index.phpの中も全部オリジナルで書きました。でもfunctions.phpというのがよくわからなくて、とりあえず、twentyfifteenあたりから適当にコピーして持ってきて、入れてみたら動いたので、それ使ってます。でも、できればもっと軽くしたいなあと思っていて、最低限必要な内容を教えてください。

回答:
はい、以下のものが最低限必要な内容です。


空白でけっこうです。

実は何もいりません。

functions.phpはあったら便利な関数を追加するためのもので、必須なものではありません。管理画面と、公開中のサイトテンプレートなどの必要PHPファイルの全てが通過している。というだけの便利機能で、通過させる必要のある処理がなければ、空っぽで結構です。

一般的な形をしたブログを作る場合、ブログだったらSEO対策のためにこういう機能は欲しいですよね。という、色んなルールや技術があります。現代のブログはそういった機能がゴテゴテついていて、「はい便利です!」と押し付けられているようなもので、ペラ一枚のHTMLからホームページを作るタイプの人には、不必要なものだらけだったりします。

ここでは、まずは、functions.phpと、頭の中の固定概念を空っぽにしたら、追加機能の活用方法として、分かりやすい事例を紹介します。

カスタム投稿タイプの追加

WordPressをブログツールではなく、便利なデータベース管理CMSとして考えている人にとって、最も身近な追加機能は、カスタム投稿タイプの追加ではないでしょうか?

こんなものにプラグインを使いたくないと、思う傾向が強いでしょうし、ローカルで開発してサーバにアップする時に、プラグインを導入しなおして、ブラウザでプチプチ押すのが嫌で嫌で仕方がない場合は、functions.phpに全部セッティングしてもらって、ブラウザプチプチ作業を出来るだけ減らしましょう。

add_action('init','create_post_type');

function create_post_type() {

 レシピというカスタム投稿タイプを追加します
 register_post_type(
  'recipe',
   array(
    'labels' => array(
    'name' => 'レシピ集',
    'singular_name' => 'レシピ',
    'menu_name' => 'レシピ集',
    'add_new_item' => '新しいレシピ',
    'add_new' => '新規レシピ追加',
    'new_item' => '新規レシピ追加',
    'edit_item' => 'レシピ編集',
    'view_item' => 'レシピ編集',
    'search_items' => '検索',
    'not_found' => '見つかりませんでした。',
    'not_found_in_trash' => 'ゴミ箱にはありませんでした。'
   ),
   'public' => true,
   'descriptions' => 'レシピ追加',
   'hierarchical' => false,
   'menu_position' => 5,
   'has_archive' => true,
   'exclude_from_search' => true,
   'supports' => array('title', 'editor')
  )
 );

 カテゴリーにも対応します
 register_taxonomy(
  'recipe-category',
  'recipe',
   array(
    'hierarchical' => true,
    'update_count_callback' => '_update_post_term_count',
    'label' => 'カテゴリー',
    'singular_label' => 'カテゴリー',
    'public' => true,
    'show_ui' => true
   )
 );

};

ショートコードの追加

WordPressはテンプレートの中では自由にPHP任せにできるけど、固定ページの中とか、投稿ページの中では、PHPコードが使えず。ブログには便利だと言われているアレコレの有難迷惑が、なんだか凄く色んな余計な修正を加えてくれてシンドイ。という特徴があります。

ああ、PHPコードで書けたら一発で解決なのになあ。と思ったら、投稿内容に使えるオリジナルのショートコードを作ってPHPの処理を呼び出しましょう。

例えば以下の内容は固定ページや投稿内で[homepage]と打てば、サイトのホームのURLが表示されます。

add_shortcode('homepage', 'shortcode_homeurl');
function shortcode_homeurl() {
 return get_bloginfo('url');
}

もうひとつの事例として、以下の内容は、[templatedir]と打てば、使っているテンプレートのディレクトリまでのURLが表示されます。テンプレートフォルダ内の画像などにリンクする場合などに活用できます。

add_shortcode('templatedir', 'shortcode_tmpdir');
function shortcode_tmpdir() {
 return get_template_directory_uri();
}

管理画面のメニュー制御

functions.phpは、あったら便利な共通機能の追加に活用できますが、管理画面もこのファイルを通過して実行されているので、管理画面そのものをカスタマイズする事もできます。

管理画面の機能を調整するために、wp-adminの中を直接編集したいところですが、WordPressがアップデートされた時に上書きされて消えてしまいますので、functions.phpの中に追加処理を用意します。

例えば、以下の内容は、購読者権限(Subscriber)のユーザーは、メニューの殆ど全てを非表示にして、管理者権限(Administrator)以外のユーザーは、概念、プラグイン、ツール、設定を非表示にします。

add_action('admin_menu', 'remove_admin_menus');

function remove_admin_menus() {
 global $menu;

 if (current_user_can('Subscriber')) {
  unset($menu[2]);  ・・ ダッシュボード
  unset($menu[5]);  ・・ 投稿
  unset($menu[10]); ・・ メディア
  unset($menu[20]); ・・ 固定ページ
  unset($menu[25]); ・・ コメント
  unset($menu[60]); ・・ 外観
  unset($menu[65]); ・・ プラグイン
  unset($menu[70]); ・・ ユーザー
  unset($menu[75]); ・・ ツール
  unset($menu[80]); ・・ 設定
 } else if(!current_user_can('Administrator')) {
  unset($menu[60]); ・・ 外観
  unset($menu[65]); ・・ プラグイン
  unset($menu[75]); ・・ ツール
  unset($menu[80]); ・・ 設定
 }

}

次はセキュリティ対策について説明します。