テーマで使用する関数

2020.04.01 2020.04.02

TOPICS

翻訳元記事はこちらです。

functions.phpファイルは、あなたのWordPressテーマに独自の機能を追加する場所です。このファイルは、WordPress のコア機能にフックして、テーマのモジュール化、拡張性、機能性を高めるために使用することができます。

functions.php とは?

functions.phpファイルは、WordPressのプラグインのように振る舞い、WordPressサイトに機能を追加します。これを使って、WordPress の関数を呼び出したり、独自の関数を定義したりすることができます。

プラグインを使ってもfunctions.phpを使っても同じ結果が得られます。ウェブサイトの見た目に関係なく利用できる新機能を作成する場合は、プラグインに入れるのがベストです。

WordPressのプラグインを使うか、functions.phpを使うかにはメリットとデメリットがあります。

WordPressのプラグインを使う場合

functions.phpファイルを使う場合

各テーマにはそれぞれ独自の関数ファイルがありますが、実際に実行されるのはアクティブなテーマのfunctions.php内のコードのみです。テーマにすでに関数ファイルがある場合は、そこにコードを追加することができます。
そうでない場合は、以下に説明するように、functions.phpという名前のプレーンテキストファイルを作成してテーマのディレクトリに追加することができます。

子テーマは独自の functions.php ファイルを持つことができます。子テーマのfunctions.phpファイルに関数を追加することは、親テーマを変更するリスクのない方法です。親テーマが更新されたときに、新しく追加した関数が消えてしまうことを心配する必要はありません。

子テーマの functions.php は WordPress によって親テーマの functions.php の直前に読み込まれますが、それを上書きするものではありません。子テーマの functions.php は、親テーマの機能を拡張したり置き換えたりするために使用することができます。同様に、functions.php はプラグインファイルが読み込まれた後に読み込まれます。

functions.phpを使って以下のことができます。

WordPressのプラグインがfunctions.phpと同じ関数やフィルタを呼び出すと、予期せぬ結果が出て、サイトが無効になることさえあります。

テーマのセットアップ

テーマが有効化されたときに最初に実行される「設定」関数の中には、いくつかのテーマの機能が含まれているはずです。以下に示すように、それぞれの機能を functions.php ファイルに追加することで、WordPress の推奨機能を有効化することができます。

関数の名前空間をテーマ名と一緒にすることが重要です。以下の例はすべて myfirsttheme_ を名前空間として使用していますが、これはテーマ名に基づいてカスタマイズする必要があります。

この初期関数を作成するには、myfirsttheme_setup()という名前の新しい関数を以下のように起動します。

if ( ! function_exists( 'myfirsttheme_setup' ) ) :
/**
* Sets up theme defaults and registers support for various WordPress features
*
*  It is important to set up these functions before the init hook so that none of these
*  features are lost.
*
*  @since MyFirstTheme 1.0
*/
function myfirsttheme_setup() {

注意: 上記の例では、関数 myfirsttheme_setup は宣言されていますが、呼び出しされていません。必ず関数を呼び出ししてください。

自動フィードリンク

自動フィードリンクは、投稿やコメントのRSSフィードをデフォルトで有効にします。これらのフィードは自動的に<head>に表示されます。これらは add_theme_support() を使って呼び出すことができます。

add_theme_support( 'automatic-feed-links' );

ナビゲーションメニュー

カスタムナビゲーションメニューでは、ユーザーがメニュー管理パネルでメニューを編集したりカスタマイズしたりすることができ、ドラッグ&ドロップでテーマ内の様々なメニューを編集できるインターフェイスを提供します。

functions.php で複数のメニューを設定することができます。これらのメニューは register_nav_menus() を使って追加したり、 wp_nav_menu() を使ってテーマに挿入することができます。
テーマで複数のメニューを使用できる場合は、配列を使用しなければなりません。テーマによってはカスタムナビゲーションメニューを持たないものもありますが、簡単にカスタマイズできるようにするためにも、この機能を許可することをお勧めします。

register_nav_menus( array(
    'primary'   => __( 'Primary Menu', 'myfirsttheme' ),
    'secondary' => __( 'Secondary Menu', 'myfirsttheme' )
) );

定義したそれぞれのメニューは、後から wp_nav_menu() を使用して呼び出すことができ、 theme_location パラメータで指定した名前 (つまり primary) を使用します。

テキストドメインの読み込み(翻訳)

テーマの文字列を翻訳できるようにすることで、テーマを複数の言語に翻訳することができます。そのためには load_theme_textdomain() を使用する必要があります。テーマを翻訳可能にする方法の詳細については、国際化のセクションを参照してください。

load_theme_textdomain( 'myfirsttheme', get_template_directory() . '/languages' );

投稿のアイキャッチ画像

投稿のサムネイルとアイキャッチ画像は、ユーザーが自分の投稿を表現するための画像を選択できるようにします。テーマのデザインに応じて、それらをどのように表示するかを決めることができます。
例えば、アーカイブビューで各投稿のサムネイルを表示することができます。または、ホームページに大きなアイキャッチ画像を使用することもできます。
すべてのテーマがアイキャッチ画像を必要とするわけではありませんが、記事のサムネイルとアイキャッチ画像をサポートすることをお勧めします。

add_theme_support( 'post-thumbnails' );

投稿フォーマット

投稿フォーマットを使うと、ユーザーは自分の投稿をさまざまな方法でフォーマットすることができます。ブロガーが投稿内容に応じて異なるフォーマットやテンプレートを選択できるようにするのに便利です。 add_theme_support()は投稿フォーマットでも使用できます。

add_theme_support( 'post-formats',  array ( 'aside', 'gallery', 'quote', 'image', 'video' ) );

初期設定のサンプル

上記の機能をすべて含めると、以下のような functions.php ファイルが完成します。将来的にわかりやすくするために、コードコメントを追加しました。

この例の一番下に示されているように、myfirsttheme_setup関数が確実に読み込まれるように、必要なadd_action()を追加する必要があります。

if ( ! function_exists( 'myfirsttheme_setup' ) ) :
/**
 * Sets up theme defaults and registers support for various WordPress features.
 *
 * Note that this function is hooked into the after_setup_theme hook, which runs
 * before the init hook. The init hook is too late for some features, such as indicating
 * support post thumbnails.
 */
function myfirsttheme_setup() {
 
    /**
     * Make theme available for translation.
     * Translations can be placed in the /languages/ directory.
     */
    load_theme_textdomain( 'myfirsttheme', get_template_directory() . '/languages' );
 
    /**
     * Add default posts and comments RSS feed links to <head>.
     */
    add_theme_support( 'automatic-feed-links' );
 
    /**
     * Enable support for post thumbnails and featured images.
     */
    add_theme_support( 'post-thumbnails' );
 
    /**
     * Add support for two custom navigation menus.
     */
    register_nav_menus( array(
        'primary'   => __( 'Primary Menu', 'myfirsttheme' ),
        'secondary' => __('Secondary Menu', 'myfirsttheme' )
    ) );
 
    /**
     * Enable support for the following post formats:
     * aside, gallery, quote, image, and video
     */
    add_theme_support( 'post-formats', array ( 'aside', 'gallery', 'quote', 'image', 'video' ) );
}
endif; // myfirsttheme_setup
add_action( 'after_setup_theme', 'myfirsttheme_setup' );

内容の幅

コンテンツの幅は、コンテンツやアセットがサイトのコンテナを壊さないように functions.php ファイルに追加されます。コンテンツの幅は、アップロードされた画像を含むサイトに追加されたコンテンツの最大許容幅を設定します。下の例では、コンテンツエリアの最大幅は800ピクセルです。それ以上のコンテンツはありません。

if ( ! isset ( $content_width) )
    $content_width = 800;

最終的なfunctions.phpの例

上記のすべての関数を含めた場合、functions.phpは次のようになります。

/**
 * MyFirstTheme's functions and definitions
 *
 * @package MyFirstTheme
 * @since MyFirstTheme 1.0
 */
 
/**
 * First, let's set the maximum content width based on the theme's design and stylesheet.
 * This will limit the width of all uploaded images and embeds.
 */
if ( ! isset( $content_width ) )
    $content_width = 800; /* pixels */
 
if ( ! function_exists( 'myfirsttheme_setup' ) ) :
/**
 * Sets up theme defaults and registers support for various WordPress features.
 *
 * Note that this function is hooked into the after_setup_theme hook, which runs
 * before the init hook. The init hook is too late for some features, such as indicating
 * support post thumbnails.
 */
function myfirsttheme_setup() {
 
    /**
     * Make theme available for translation.
     * Translations can be placed in the /languages/ directory.
     */
    load_theme_textdomain( 'myfirsttheme', get_template_directory() . '/languages' );
 
    /**
     * Add default posts and comments RSS feed links to <head>.
     */
    add_theme_support( 'automatic-feed-links' );
 
    /**
     * Enable support for post thumbnails and featured images.
     */
    add_theme_support( 'post-thumbnails' );
 
    /**
     * Add support for two custom navigation menus.
     */
    register_nav_menus( array(
        'primary'   => __( 'Primary Menu', 'myfirsttheme' ),
        'secondary' => __('Secondary Menu', 'myfirsttheme' )
    ) );
 
    /**
     * Enable support for the following post formats:
     * aside, gallery, quote, image, and video
     */
    add_theme_support( 'post-formats', array ( 'aside', 'gallery', 'quote', 'image', 'video' ) );
}
endif; // myfirsttheme_setup
add_action( 'after_setup_theme', 'myfirsttheme_setup' );