WordPressのfunctions.phpの書き方とよく使う関数 まとめ

functions.php について

テーマのPHP関数をまとめて管理するためのファイルです。
このファイルでエラーがでると、ページが全部真っ白に…なんてこともあるので、編集するときは、バックアップをとって慎重に。

WordPressのデフォルトの動きを変更したいとき、直接コアのファイルを書き換えてしまうと、WordPressのアップデートの際上書きされて消えてしまいます。

WordPressでは、初期設定の動きを変更できる仕組みである「フック」が用意されています。
functions.phpファイルから、フックのあるポイントを指定して実行することができます。

フックの種類

フックにはアクションフックとフィルターフックの2種類あります。

アクションフック ... add_action()
特定のポイントやイベント発生時に起動されるもの。
タイミングは任意でPHP関数を実行させることができます。

フィルターフック ... add_filter()
データベースの保存時や、読み出し時に値を改造するためのもの

フックの種類はCodexに掲載されています。
アクションフック一覧
フィルターフック一覧

フックの使い方

1.実行させたいPHP関数を作成
2.特定のフックに作成した関数を登録
という流れ。

試しに、スタイルシートを読み込ませる関数を作って、フックに登録してみます。

<?php

function mytheme_scripts() {
    wp_enqueue_style( 'mytheme-style', get_stylesheet_uri() );
}

スタイルシートを読み込ませる関数 mytheme_scripts() を作って…

add_action( 'wp_enqueue_scripts', 'easiestwp_scripts' );

wp_enqueue_scriptsというアクションフックをadd_action()で呼び出し、さきほど作った関数mytheme_scripts() を登録。

あとは、index.phpなどに <?php wp_head(); ?> を記述しておくことで、自動的にテーマにあるstyle.cssが読み込まれるようになります。

<!DOCTYPE HTML>
<html <?php language_attributes(); ?>>
<head>
    <meta charset="<?php bloginfo( 'charset' ); ?>">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <?php wp_head(); ?>
</head>

フックで使用する関数の書き方

アクションフックもフィルターフックも基本の書き方は同じ。
優先度や変数の値は、省略することができます。

add_action(アクションフック名, 処理する関数, [オプション] 優先度, [オプション]関数に渡す変数の値)

add_filter(フィルターフック名, 処理する関数, [オプション]優先度, [オプション]関数に渡す変数の数)

よくあるカスタマイズ設定

タイトルタグ追加

function mytheme_setup() {
    add_theme_support( 'title-tag' );
}
add_action( 'after_setup_theme', 'mytheme_setup' );

アイキャッチ画像を有効化する

function mytheme_setup() {
    add_theme_support( 'post-thumbnails' );
    add_image_size( 'mytheme-hero', 1200, 630, true ); // 画像サイズの登録
}
add_action( 'after_setup_theme', 'mytheme_setup' );

テーマ専用に新しく画像サイズを登録したいとき

<?php add_image_size( 画像サイズの名前, 横幅, 高さ, 画像の切り抜きをするかどうか ); ?>
add_image_size( 'mytheme-hero', 1200, 630, true );

WordPressに画像をアップロードすると、指定した大きさにで生成されるようになります。

登録した画像サイズで出力したいときは、the_post_thumbnail( ‘設定した名前’ ); で呼び出すことができます。

<?php if ( has_post_thumbnail() ) : ?>
    <a href="<?php the_permalink(); ?>"><?php the_post_thumbnail( 'hero' ); ?></a>
<?php endif; ?>

ナビゲーションメニューを有効にする

function mytheme_setup() {
    register_nav_menus( array(
        'global' => 'Global Navi',
    ) );
}
add_action( 'after_setup_theme', 'mytheme_setup' );

メニューをカスタマイズして表示

<?php if ( has_nav_menu( 'global' ) ) : ?>
    <!-- グローバルがある場合は出力 -->
    <?php wp_nav_menu( array(
        'theme_location'  => 'global',      //register_nav_menus()で登録したものを指定
        'menu_id'         => 'global-menu', //ul要素のIDを指定
        'container'       => 'nav',         //ul要素をラップするかどうか。する場合は、divかnavを選択
        'container_class' => 'global-nav',  //navにclassを追加する
    ) ); ?>
<?php endif; ?>

ウィジェットの機能を有効にする

function mytheme_widgets_init() {
    register_sidebar( array(
        'name' => 'Sidebar',
        'id' => 'sidebar',
    ) );

    register_sidebar( array(
        'name' => 'Footer',
        'id' => 'footer',
    ) );
}
add_action( 'widgets_init', 'mytheme_widgets_init' );

ウィジェットを表示

<?php if ( is_active_sidebar( 'sidebar' ) ) : ?>
    <ul>
        <?php dynamic_sidebar( 'sidebar' ); ?>
    </ul>
<?php endif; ?>

<?php if ( is_active_sidebar( 'footer' ) ) : ?>
    <ul>
        <?php dynamic_sidebar( 'footer' ); ?>
    </ul>
<?php endif; ?>

検索・コメントフォーム・コメントリストをHTML5形式に

function mytheme_setup() {
    add_theme_support( 'html5', array(
        'search-form',
        'comment-form',
        'comment-list',
    ) );
}
add_action( 'after_setup_theme', 'mytheme_setup' );

全てまとめる

<?php
function mytheme_scripts() {
    wp_enqueue_style( 'mytheme-style', get_stylesheet_uri() );
}
add_action( 'wp_enqueue_scripts', 'mytheme_scripts' );

function mytheme_setup() {
    add_theme_support( 'title-tag' );

    add_theme_support( 'post-thumbnails' );
    add_image_size( 'mytheme-hero', 1200, 630, true );

    register_nav_menus( array(
        'global' => 'Global Navi',
    ) );

    add_theme_support( 'html5', array(
        'comment-form',
        'comment-list',
    ) );
}
add_action( 'after_setup_theme', 'mytheme_setup' );

ちなみに、最後のphpの閉じタグは、なくてもエラーがでないので、省略されることが多いです。