WordPress のテーマ制作で欠かせない関数をまとめてみた
WordPress でテーマ制作する際にいつも調べるのが面倒なので、主に使用する関数をまとめました。
add_action
や add_filter
で登録する関数を無名関数にしていますが、それぞれ関数を別に定義して、その関数名を文字列として add_action
や add_filter
に渡すこともできます。独自テーマ内で利用し、remove_action
や remove_filter
することがなければ無名関数でも問題はありません。逆にプラグインや親テーマ内で利用する場合は、remove_action
や remove_filter
で登録解除することができなくなるため、無名関数を使ってはいけません。
wp_head
関数によって多くの要素が head
要素に追加されますが、不要なものも多くあります。これらを出力されないようにするには、 remove_action
で wp_head
フックに登録されているアクションフックを解除します。
wp_head
関数でJSやCSSを注入すると、WordPress 側で自動的に type="text/javascript"
や type="text/css"
という type 属性が追加されます。通常は気にすることはないと思いますが、W3C のマークアップバリデーターでは
Warning: The type attribute is unnecessary for JavaScript resources.
や
Warning: The type attribute for the style element is not needed and should be omitted.
のように警告が表示されます。この警告が邪魔な場合は、script_loader_tag
/ style_loader_tag
フックを利用して type 属性を削除することができます。これらは wp_enqueue_script
関数や wp_enqueue_style
関数で読み込まれたスクリプトやスタイルファイルを注入する際の HTML タグに対してフィルターすることができます。
body_class
関数を使用すると body 要素にクラスが自動的に付与されますが、スラッグ名に関しては付与されません。そこで body_class
フックに対してフィルターフックを追加すると、body 要素に付与するクラスにスラッグ名を追加することができます。
wp_head
関数で出力するのも無効化されています。これらを有効にするには、after_setup_theme
フックにアクションを追加して、その中で add_theme_support
関数を呼ぶことで有効化することができます。
wp_head
関数でタイトルを出力するときに、デフォルトではタイトルのセパレーターが “-” になっています。これを変更するには document_title_separator
フックを利用します。
add_filter( ‘document_title_separator’, function( $sep ) {
return ‘|’;
} );
wp_head
関数でタイトルを出力するときに、トップページに関してはデフォルトで『 [サイト名] – [キャッチフレーズ]』のように出力されます。ここのキャッチフレーズ部分を削除したい場合は、document_title_parts
フックを利用します。
wp_head
関数で出力したい場合は、wp_head
フックでアクションを追加してページの種類によって出力内容を分岐させます。例えばこのような感じになります。
wp_head
関数によって、デフォルトで ver.1.12.4 の jQuery が読み込まれるように script 要素が出力されます。そのため、jQuery のバージョンを変えたい場合は、wp_enqueue_scripts
フックを用いてすでに登録されている jQuery を解除し、別のバージョンの jQuery を登録する必要があります。次の例では、ver.3.3.1 の jQuery を wp_head
関数で出力させています。
pre_get_posts
フックを利用します。
XXXXXX
や YYYYYY
にはカスタム投稿タイプのスラッグ名が入ります。
excerpt_length
フックを利用します。例えばフロントページの場合のみ30文字に制限する場合はこのようになります。
user_can_richedit
フックを利用します。
page
、つまり固定ページの場合に false
を返してビジュアルエディタを無効化しています。
admin_menu
フックを利用します。
manage_XXXXXX_posts_columns
フックと manage_XXXXXX_posts_custom_column
フックを利用します。ここで XXXXXX
にはカスタム投稿タイプのスラッグ名が入ります。例えばコメント欄を非表示にし、アイキャッチ画像をタイトルの前に表示させる場合は次のようになります。
add_filter( 'manage_XXXXXX_posts_columns, ...)
の方では一覧のカラムにサムネイル用のカラムを追加しています。そして add_action( 'manage_XXXXXX_posts_custom_column', ...)
の方で、そのカラムに何を echo
させるかを記述しています。ここではアイキャッチ画像を表示するようにしていますが、add_action( 'manage_XXXXXX_posts_custom_column', ...)
で指定する関数の引数には $post_id
が渡ってくるため、カスタムフィールドをはじめとした様々な情報を表示させることができます。Advanced Custom Field などのプラグインを利用してカスタムフィールドを設定している場合は、そのフィールドを表示させるようにしておくと、投稿を編集するユーザーの利便性を上げることができます。
manage_pages_columns
フックと manage_pages_custom_column
フックに次のような関数を登録することで、一覧に表示させることができます。
publish_post
フックを利用すると、投稿が公開されたときに、アイキャッチ画像がセットされておらず、なおかつ本文に画像が挿入されていれば、最初の画像をアイキャッチ画像に設定することができます。
manage_XXXXXX_posts_columns
や manage_pages_columns
フックでカラムを追加したときに、その幅を変更したいことがあると思います。こうした場合には、admin_enqueue_scripts
フックでスタイルを注入することができます。例えば上の例のようにアイキャッチ画像を追加した場合には、次のようにするとアイキャッチ画像の幅を 150px にすることができます。
column-[カラム名]
というクラスが各カラムに付与されるため、上記のスラッグやページパスを追加する例の場合には .column-slug
や .column-path
というセレクタに対して CSS を書くことで、カラムのスタイルを上書きすることができます。
wpcf7_load_js
フィルターフックと wpcf7_load_css
フィルターフックを利用して改善します。
Contact Form 7 では wp_enqueue_scripts
に wpcf7_do_enqueue_scripts
という関数をフックしています。この関数内では wpcf7_load_js / wpcf7_load_css
関数が呼ばれ、true
が返されると wp_enqueue_script / wp_enqueue_style
関数でスクリプトとスタイルが注入されるようになっています。wpcf7_load_js / wpcf7_load_css
関数では
function wpcf7_load_js() {
return apply_filters( 'wpcf7_load_js', WPCF7_LOAD_JS );
}
のようにフィルターフックが用意されているので、ここに関数をフックさせればいいことになります。例えばテーマの functions.php
で
inquiry
というスラッグをもったページでだけスクリプト・スタイルファイルを読み込むことができるようになります。複数ページある場合は、is_page
関数が配列を受け取ることを利用して、is_page( 'inquiry' )
を is_page( ['top', 'inquiry'] );
に変更します。
wp-includes/post.php
で定義されている wp_insert_post
関数です。ここにはいくつかのアクションフック・フィルターフックが用意されています。これらをコメント文と前後の制御構文とともに抜き出してみます。
wp_transition_post_status
関数では3つのアクションフックが用意されています。
wp_insert_post_data
– 投稿がデータベースに挿入される前に投稿データをフィルターするフックwp_insert_attachment_data
– wp_insert_post_data
のメディア版pre_post_update
– すでに存在している投稿がデータベースで更新される直前に発火するアクションtransition_post_status
– 投稿がある状態から別の状態へ遷移したときに発火するアクション{$old_status}_to_{$new_status}
– 投稿がある状態から別の状態へ遷移したときに発火するアクション{$new_status}_{$post->post_type}
– 投稿がある状態から別の状態へ遷移したときに発火するアクションedit_attachment
– 存在しているメディアが更新されたら発火するアクションattachment_updated
– 存在しているメディアが更新されたら発火するアクションadd_attachment
– メディアが新規に追加された直後に発火するアクションedit_post
– すでに存在している投稿(メディアを含む)が更新されたら発火するアクションpost_updated
– すでに存在している投稿(メディアを含む)が更新されたら発火するアクションsave_post_{$post->post_type}
– 投稿(メディアを含む)が保存されたら発火するアクションsave_post
– 投稿(メディアを含む)が保存されたら発火するアクションwp_insert_post
– 投稿(メディアを含む)が保存されたら発火するアクションsave_post_{$post->post_type}
、save_post
、wp_insert_post
はどれも同じ引数を取り順番に呼ばれるため、どれを使用しても同じ結果になります。ただし v3.7.0 から追加された save_post_{$post->post_type}
は投稿タイプで限定されるため、フック関数内で if
などによる制御構文を書かずに済むという利点があります。特に理由がない限りはこのアクションにフックさせるのが無難だと思われます。
例えば book というカスタム投稿タイプの新規投稿・投稿編集時に追加の処理をしたい場合は
<?php
add_action( 'save_post_book', function( $post_ID, $post, $update ) {
// ここで追加の処理を行う
} );
のように関数をフックさせます。
customize_register
フックを利用します。