Steamer Lane Studio技術備忘録WordPress

WordPressでテーマを自作する場合のfunction.php

wordpress WordPressでテーマを自作する場合のfunction.php
最終更新日: 2025年3月6日

WordPressでそのテーマによるブログなら特に弄るところってないけど、普通のWebサイト・企業サイトとか店舗サイトもWPって時代なのでやり始めたがなんちゃらテーマなんて所詮ブログ用で、特にMTやってきた人間はDBとかmtmlの「この値」だけ引っ張ってコーディングするって事がしたいから、じゃぁ「テーマ作るしかない」ってとこに行きついた。
phpほぼ素人だが、理想はMTのデフォルトテンプレートの様な真っ白に近いものを造る。
ググってみると必須コードから便利機能的なコードまで知ることが出来る。
phpのバージョンとwpのバージョン(とりま4.5)とをベースに、ググった結果記事のコードが合うかどうか、他のコードと合うかどうか調べながら作る。
もちろんデバグはtrueにしてエラーが分るようにうするが、一発目は手探りで必須コードのみ集めて管理画面が最低限動くものを作成し、そこから欲しい機能に対応したコードを盛ってゆく感じ。
まず必須コードをいくつか。

// メニューの有効化 ※必須
register_nav_menu('mainmenu', 'メインメニュー');
// html5で出力 ※必須
add_theme_support( 'html5', array(
'search-form',
'comment-form',
'comment-list',
'gallery',
'caption',
) );
// 投稿フォーマットのサポート ※必須
add_theme_support( 'post-formats', array(
'aside', //アサイド
'gallery', //ギャラリー
'image', //画像
'link', //リンク
'quote', //引用
'status', //ステータス
'video', //動画
'audio', //音声
'chat', //チャット
) );
// 日付の出力 ※必須
function smart_entry_date() {
// 日付
printf( '',
esc_attr( get_the_date( ) ),
get_the_date()
);
}

// カテゴリの出力 ※必須function smart_entry_category($pretag="", $endtag="") {$categories_list = get_the_category_list( ', ' );if ( $categories_list ) {printf( $pretag.'%1$s'.$endtag,$categories_list);}}

// カテゴリ出力でcategoryという勝手に作られる階層を削除 ※必須ではないが/category/が間に入るカテゴリーアーカイブ(MTの言い回しだな)のパスは嫌!add_filter('user_trailingslashit', 'remcat_function');function remcat_function($link) {return str_replace("/category/", "/", $link);}// タグの出力 ※必須function smart_entry_tag($pretag="", $endtag="") {$tags_list = get_the_tag_list( '', ', ' );if ( $tags_list ) {printf( $pretag.'%1$s'.$endtag,$tags_list);}}// パンくずリスト ※必須 ここはそのサイトの構造で弄んないといけないけどね、検索結果まで一応作ったわ。function breadcrumb() {$home = '

'.get_bloginfo('description').' '.get_bloginfo().'

';$homeb = ' '.get_bloginfo().'';//下層ページはblog description無しecho '<div id="bcNav">';if ( is_front_page() ) {echo $home;}else if ( is_category() ) {// カテゴリページの場合$cat = get_queried_object();$cat_id = $cat->parent;$cat_list = array();while ($cat_id != 0){$cat = get_category( $cat_id );$cat_link = get_category_link( $cat_id );array_unshift( $cat_list, ''.$cat->name.'' );$cat_id = $cat->parent;}echo $homeb;foreach($cat_list as $value){echo $value;}the_archive_title('

', '

');}else if( is_tag() ) {// tagページの場合echo $homeb;/*単純なタグ検索でコメントアウト下は複数タグチェックによる絞り込み検索用$str.='

'. single_tag_title( '' , false ). 'のほげほげ

';*/$str= $_SERVER["REQUEST_URI"];$dec = urldecode( $str );$rep = preg_replace("/\/tag\//", "", $dec);echo '

' .$rep. 'のhoge

';}else if ( is_single() ) {// 投稿ページの場合echo $homeb;$cat = get_the_category();if( isset($cat[0]->cat_ID) ) $cat_id = $cat[0]->cat_ID;$cat_list = array();while ($cat_id != 0){$cat = get_category( $cat_id );$cat_link = get_category_link( $cat_id );array_unshift( $cat_list, ''.$cat->name.'' );$cat_id = $cat->parent;}foreach($cat_list as $value){echo $value;}the_title('

', '

');}else if( is_page() ) {// 固定ページの場合echo $homeb;//親ページがある際に表示$wp_obj = get_queried_object();$page_id = $wp_obj->ID;$page_title = $wp_obj->post_title;if ($wp_obj->post_parent !== 0) {$parent_array = array_reverse(get_post_ancestors($page_id));foreach ($parent_array as $parent_id) {echo '' . get_the_title($parent_id) .'' ;}}the_title('

', '

');}else if( is_search() ) {// 検索ページの場合echo $homeb;echo '

'.get_search_query().'の検索結果

';}else if ( is_archive() ) {// 月別アーカイブ・タグページの場合echo $homeb;the_archive_title('

', '

');}else if( is_404() ) {// 404ページの場合echo $home;echo '

ページが見つかりません

';}echo '</div>';}//catページで投稿の最初の画像サムネール取得 ※必須 ほんとに必須か?と思うが確かなかったら動かなかったかもfunction catch_entfst_image() {global $post;

if ( preg_match_all( '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches) ) {$first_img = $matches[1][0];} else {$first_img = false;}return $first_img;}//admin_bar削除 ※必須function mytheme_kill_admin_bar(){return false;}// show_admin_barにフィルターする。最後に処理してもらいたいので、1,000番目に登録。つーか最後でなくてもあまり問題ないわ。add_filter( 'show_admin_bar', 'mytheme_kill_admin_bar' , 1000 );

ここまで必須コード集めてくる中で、同じ機能でダメなものとかあった。だからこれは現状での(当方的な都合でだが)必須コードの最終形。
テーマで他に必須なのがstyle.cssとfunction.phpの先頭への記述、適当に書いといて。
オリジナルテーマのメリットは何といっても軽くて済ませられること。汎用性は低くなる(?なんねーよ)かもだが、サイト個々のデザインに応じたコーディングをしたければ既存のテーマなんて面倒で使ってられない。