functions.phpの編集の仕方と構造!WordPress・テーマ・プラグインの機能をカスタマイズ!

2019年6月5日WordPressの設定&カスタマイズの基礎知識

機能のカスタマイズをしようとすると出てくるWordPress関数をfunctions.phpに書き込むという手順。

簡単な基本の方法から、よく出るエラーまで最低限の知識を確認しておきましょう。

functions.php編集

関数はfunctions.phpに書く!functions.php用のコードの見分け方

functions.phpに書くコードは、「どこかのページのこの箇所」というよりは、「こういうときはこうする」というようにサイト全体の内で条件に当てはまったら適用されるものが多いです。

コードには基本の形式があるので、WordPressのfunctions.php用のコードは見ればすぐにわかります。

add_filter( 'filter_hook_name', 'filter_hook_add_name', 10, 2 );
funcion filter_hook_add_name( ){
//
//PHPのコード
//
}

この形の記述が含まれているコードはWordPressの関数です。functions.phpに追加します。

add_の形の関数は大抵はコード内の一番上か一番下についていますが、if文の中に入っていて見つけづらいこともあるのでよく見てみましょう。

ショートコードの追加(add_shordcode)や、
WordPressやテーマやプラグインでつけられている機能の調整(add_filter)、
ページのリダイレクトやページ間でのデータの受け渡しや移動(add_action)など。

数字は関数を実行する優先順位を示すものですが、省略されていることも多いです。

functons.phpを編集する基本の手順

functinos.phpにコードを追加するときは、子テーマのfunctions.php一番下(最後)に追加していきます。

例:Lightningの子テーマのfunctions.phpの場合

<?php

/*-------------------------------------------*/
/*  カスタム投稿タイプ「イベント情報」を追加
/*-------------------------------------------*/
// add_action( 'init', 'add_post_type_event', 0 );
// function add_post_type_event() {
//     register_post_type( 'event', /* カスタム投稿タイプのスラッグ */
//         array(
//             'labels' => array(
//                 'name' => 'イベント情報',
//                 'singular_name' => 'イベント情報'
//             ),
//         'public' => true,
//         'menu_position' =>5,
//         'has_archive' => true,
//         'supports' => array('title','editor','excerpt','thumbnail','author')
//         )
//     );
// }

/*-------------------------------------------*/
/*  カスタム分類「イベント情報カテゴリー」を追加
/*-------------------------------------------*/
// add_action( 'init', 'add_custom_taxonomy_event', 0 );
// function add_custom_taxonomy_event() {
//     register_taxonomy(
//         'event-cat', /* カテゴリーの識別子 */
//         'event', /* 対象の投稿タイプ */
//         array(
//             'hierarchical' => true,
//             'update_count_callback' => '_update_post_term_count',
//             'label' => 'イベントカテゴリー',
//             'singular_label' => 'イベント情報カテゴリー',
//             'public' => true,
//             'show_ui' => true,
//         )
//     );
// }

/********* 備考1 **********
Lightningはカスタム投稿タイプを追加すると、
作成したカスタム投稿タイプのサイドバー用のウィジェットエリアが自動的に追加されます。
プラグイン VK All in One Expansion Unit のウィジェット機能が有効化してあると、
VK_カテゴリー/カスタム分類ウィジェット が使えるので、このウィジェットで、
今回作成した投稿タイプ用のカスタム分類を設定したり、
VK_アーカイブウィジェット で、今回作成したカスタム投稿タイプを指定する事もできます。

/********* 備考2 **********
カスタム投稿タイプのループ部分やサイドバーをカスタマイズしたい場合は、
下記の命名ルールでファイルを作成してアップしてください。
module_loop_★ポストタイプ名★.php
*/

/*-------------------------------------------*/
/*  フッターのウィジェットエリアの数を増やす
/*-------------------------------------------*/
// add_filter('lightning_footer_widget_area_count','lightning_footer_widget_area_count_custom');
// function lightning_footer_widget_area_count_custom($footer_widget_area_count){
//     $footer_widget_area_count = 4; // ← 1~4の半角数字で設定してください。
//     return $footer_widget_area_count;
// }

/*-------------------------------------------*/
/*  <head>タグ内に自分の追加したいタグを追加する
/*-------------------------------------------*/
function add_wp_head_custom(){ ?>
<!-- head内に書きたいコード -->
<?php }
// add_action( 'wp_head', 'add_wp_head_custom',1);

function add_wp_footer_custom(){ ?>
<!-- footerに書きたいコード -->
<?php }
// add_action( 'wp_footer', 'add_wp_footer_custom', 1 );
//
//★ここから追加していく!

どこまでが何に関するコードなのかわかるよう、コメントでしっかり説明を書いておいた方が良いです。

//
// 説明ボックスショートコードを追加
// ★↑こんな風に何をしている部分なのか書いておく
//
function box_func3( $atts, $content = null ) {
return '<div class="ex-box"-->' . $content . '';
}
add_shortcode('ex-box', 'box_func3');
functions.phpは一番下に追加していくだけなので、コードを追加すること自体はこのように簡単です!

ファイルにアクセスするためのFTPソフトや、ファイルの場所に関する基礎知識はこちらを参照

functions.phpのコードの構造

//
// セッションが宣言されていないときに宣言する
// という関数を定義
//
function init_sessions() {
// init_sessionsという関数名を定義する★
    if (!session_id()) {
// if文で条件が指定される場合もある。
// (この場合「session_idが無かったら=セッションが宣言されていないとき」という条件)
        session_start();
// 実行するアクション
// (この場合、セッションを宣言する)
    }
}
add_action('init', 'init_sessions');
// アクション関数を登録
// init_sessionsという関数名を登録している★

★init_sessionsという関数名の定義&登録がセットになる。

定義と登録の順序は逆でも良い。

functions.phpのコードの登録部分の構造

add_action( $hook, $function_to_add, $priority, $accepted_args );

add_filter( $tag, $function_to_add, $priority, $accepted_args );

$hook
WordPressやテーマ、プラグインが実行しているアクションが指定されます。「このアクションが実行されるときに、この関数($function_to_add)が適用される」ということです。
$tag
WordPressが様々な種類のテキストをデータベースまたはブラウザ画面へ送信する前に、それを変更するために、どの部分を変更するかを指定するためのフィルターフック名を指定。「このフィルダーが指定した部分を表示する前に、この関数($function_to_add)が適用される」ということ。
$function_to_add
関数の名前。functionにつける名前で、同じものがあってはいけません。
$priority
登録された関数の中で、この関数を実行する順序。数値が小さいほど早く実行し、同じ数値の場合は追加された順に実行します。初期値は10で、省略可。
$accepted_args
フックした関数が受け入れられる引数の数。フックしたい関数の引数の数で初期値は1。省略可。

よくあるfunctions.phpのエラー

functions.phpは編集の手順こそ簡単ですが、記述したコードに打ち間違いがあったり、WordPressのルールに違反していたり、PHPの書き方が間違っていたりするとサイトが全く表示できなくなってしまいます。

エラーが起きたら、エラー箇所をテキストエディタで修正してアップロードしなおせば直るので焦ることはありません。

もしエラーの原因がわからないときは、テキストエディタでfunctions.phpを元の状態に戻してアップロードすればサイトは元に戻りますが、せっかく見つけた解決策が使えないのではもったいないですよね。

よくあるエラーを覚えておきましょう。

WordPressのfunctions.phpでは、PHPであるとの宣言は必要ない!

<?php
add_action( 'wordpress_function' , 'wordpress_function_custmize');
function wordpress_function_custmize($file){
}
?>

上記のように<?php?>で囲まれている場合は、この部分を削除してから追加します。

コードを紹介している記事の都合で囲まれているだけで、fuctions.phpではPHPであることを宣言する必要はありません。

同じ関数名のコードがあってはいけない

function add_styles()★関数名 {
 if( is_home() || is_front_page() ){
wp_enqueue_style( 'front-page-style', get_stylesheet_directory_uri() . '/css/front-page-style.css', '', '20191814');
  }
add_action('wp_print_styles', 'add_styles★関数名');

function add_styles()★関数名 {
  if(is_page(array(1605,1607))){
wp_enqueue_style( 'login-page', get_stylesheet_directory_uri() . '/css/login-page.css', '', '20190815' );
  }
add_action('wp_print_styles', 'add_styles★関数名');

function add_styles()★関数名 {
if( get_post_type() === 'cases'){
wp_enqueue_style( 'cases-design', get_stylesheet_directory_uri() . '/css/cases-design.css', '', '20190815' );
}
add_action('wp_print_styles', 'add_styles★関数名');

function add_styles()★関数名 {
wp_enqueue_style( 'swiper.min', 'https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.3.1/css/swiper.min.css', '', '20190815' );
}
add_action('wp_print_styles', 'add_styles★関数名');

同じ動作を複数したいからといって、コピー&ペーストして増やしてしまうと、同じ関数名のコードが登録されてエラーになります。

同じ動作を複数するなら、functionの中身を増やす

function add_styles() {
// 関数の定義
 if( is_home() || is_front_page() ){
wp_enqueue_style( 'front-page-style', get_stylesheet_directory_uri() . '/css/front-page-style.css', '', '20191814');
  }
  if(is_page(array(1605,1607))){
wp_enqueue_style( 'login-page', get_stylesheet_directory_uri() . '/css/login-page.css', '', '20190815' );
  }
if( get_post_type() === 'cases'){
wp_enqueue_style( 'cases-design', get_stylesheet_directory_uri() . '/css/cases-design.css', '', '20190815' );
}
wp_enqueue_style( 'swiper.min', 'https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.3.1/css/swiper.min.css', '', '20190815' );
}
add_action('wp_print_styles', 'add_styles');
// 関数の登録

同じアクションフック/フィルターフックに対して同じアクション/フィルターを複数の部分に適用させる場合は、

関数の定義と登録は1回で。中身を複数にします。

登録するときと定義するときの関数名が一致していない

// セッションが宣言されていないときに宣言する
function init_sessions()★ {
    if (!session_id()) {
        session_start();
    }
}
add_action('init', 'init_sessions★');

★関数名はこの2か所に名前が入ります。ここが一致しないと機能しません。

コピペしたコードのクオーテーションに注意

記事からコードをコピペして、自分が使っているテキストエディタやWordPressにペーストした際に、クオーテーションが全角になってしまうことがあります。

function box_func3( $atts, $content = null ) {
return ‘<div class="“ex-box”">’ . $content . ‘</div>
’;
}
add_shortcode(‘ex-box’, ‘box_func3’);

テキストエディタなどで自動変換が行われるときがあるようです。

これのせいでエラーが出ることはfunctions.phpに限らずよくあるので、コピペしたときはまず確認して半角に直しておきましょう。

functions.phpは難しくない!!コピペだけでいろんなことができる

以上の点だけ押さえておけば、functions.phpにコピペしたコードを追加して様々な機能を変えたり、デザインを直したり、デフォルトの文言を変えたりということということが出来ます。

さらにPHPの基本の知識があれば可能性は無限大!

プロ並みのサイトを実現するためにも、恐れず立ち向かってみましょう。