wordpress
WordPressでテーマを自作する場合のfunction.php
最終更新日: 2023年4月15日
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の先頭への記述、適当に書いといて。
オリジナルテーマのメリットは何といっても軽くて済ませられること。汎用性は低くなる(?なんねーよ)かもだが、サイト個々のデザインに応じたコーディングをしたければ既存のテーマなんて面倒で使ってられない。