functions.phpの解説
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]); ・・ 設定
}
}