WordPressのテーマを自作する ? その2(functions.php編)

自分がfunctions.phpに基本的に入れてるやつ
前回からめちゃめちゃ時間経ってない?
ということで結構人それぞれな気がするこのファイル。私の場合。
/** サムネイル有効 **/
/*------------------------------------------*/
add_theme_support('post-thumbnails');
/** 投稿の設定 **/
/*------------------------------------------*/
$mypost_label = '取扱製品'; // ラベル
$mypost_slug = 'products'; // スラッグ
/** 投稿の変更 **/
/*------------------------------------------*/
function edit_admin_menus() {
global $menu, $submenu, $mypost_label;
$menu[5][0] = $mypost_label;
$submenu['edit.php'][5][0] = $mypost_label.'一覧';
}
function revcon_change_post_object() {
global $wp_post_types, $mypost_label;
$labels = &$wp_post_types['post']->labels;
$labels->name = $mypost_label;
$labels->singular_name = $mypost_label;
$labels->add_new = '新規追加';
$labels->add_new_item = $mypost_label .'を追加';
$labels->edit_item = $mypost_label .'の編集';
$labels->new_item = $mypost_label;
$labels->view_item = $mypost_label .'の表示';
$labels->search_items = $mypost_label .'を検索';
$labels->not_found = $mypost_label .'が見つかりませんでした。';
$labels->not_found_in_trash = 'ゴミ箱内に' .$mypost_label .'が見つかりませんでした。';
$labels->all_items = '全ての' .$mypost_label;
$labels->menu_name = $mypost_label;
$labels->name_admin_bar = $mypost_label;
}
add_action('admin_menu', 'edit_admin_menus');
add_action('init', 'revcon_change_post_object');
/** 投稿もarchive.phpで表示させる **/
/*------------------------------------------*/
function post_has_archive($args, $post_type) {
global $mypost_slug;
if ('post' == $post_type) {
$args['rewrite'] = true;
$args['has_archive'] = $mypost_slug; // 上記で設定したスラッグ。上記設定してない場合は文字列(例:'products')
}
return $args;
}
add_filter('register_post_type_args', 'post_has_archive', 10, 2);
/** 要らないメニュー非表示 **/
/*------------------------------------------*/
function remove_admin_menus() {
global $menu;
unset($menu[25]); // コメント
}
add_action('admin_menu', 'remove_admin_menus');
/** 設定ページにキーワード追加 **/
/*------------------------------------------*/
function add_site_word_field($whitelist_options) {
$whitelist_options['general'][] = 'site_word';
return $whitelist_options;
}
add_filter('whitelist_options', 'add_site_word_field');
function regist_site_word_field() {
add_settings_field('site_word', 'サイトキーワード', 'display_site_word', 'general');
}
add_action('admin_init', 'regist_site_word_field');
function display_site_word() {
$site_word = get_option('site_word');
?>
<input name="site_word" value="<?php echo esc_html( $site_word ); ?>" class="regular-text" style="border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);">
<p>このサイトのキーワードを半角カンマ(,)区切りで設定出来ます。</p>
<?php
}
/** SVG対応 **/
/*------------------------------------------*/
function cc_mime_types ( $mimes ) {
$mimes [ 'svg' ] = 'image/svg+xml' ;
return $mimes ;
}
add_filter ( 'upload_mimes' , 'cc_mime_types' ) ;
function fix_svg_thumb_display() {
echo '<style>
td.media-icon img[src$=".svg"], img[src$=".svg"].attachment-post-thumbnail {
width: 100% !important;
height: auto !important;
}
</style>
';
}
add_action('admin_head', 'fix_svg_thumb_display');
/** editor-style.cssを有効にする **/
/*------------------------------------------*/
add_editor_style('editor-style.css');
function custom_editor_settings( $initArray ){
$initArray['body_class'] = 'editor-area';
return $initArray;
}
add_filter('tiny_mce_before_init', 'custom_editor_settings');
/*------------------------------------------
* 表への出力関連
*----------------------------------------*/
/** wp_head()の制御 **/
/*------------------------------------------*/
remove_action('wp_head', 'feed_links', 2);
remove_action('wp_head', 'feed_links_extra', 3);
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'index_rel_link');
remove_action('wp_head', 'start_post_rel_link', 10, 0);
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
remove_action('wp_head', 'wp_print_styles', 8);
remove_action('wp_head', 'wp_print_head_scripts', 9);
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'rel_canonical');
remove_action('wp_head', 'rest_output_link_wp_head');
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('wp_head', 'wp_oembed_add_host_js');
/** 絵文字のコードを消す **/
/*------------------------------------------*/
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('admin_print_styles', 'print_emoji_styles');
remove_filter('the_content_feed', 'wp_staticize_emoji');
remove_filter('comment_text_rss', 'wp_staticize_emoji');
remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
/** タイトルタグの区切り **/
/*------------------------------------------*/
/**- タイトルタグをサポートさせる -**/
function mytheme_setup() {
add_theme_support('title-tag');
}
add_action('after_setup_theme', 'mytheme_setup');
/**- タイトルタグからディスクリプションを削除 -**/
function remove_tagline($title) {
if (isset($title['tagline'])) {
unset($title['tagline']);
}
return $title;
}
add_filter( 'document_title_parts', 'remove_tagline' );
/**- タイトルタグの仕切り「-」を「|」へ変更 -**/
function my_document_title_separator($sec) {
$sec = "|";
return $sec;
}
add_filter('document_title_separator', 'my_document_title_separator');
/** Pagination **/
/*------------------------------------------*/
function pagination($pages = '', $range = 2) {
$showitems = ($range * 2)+1; //表示するページ数(5ページ)
global $paged; //現在のページ値
if(empty($paged)) $paged = 1; //デフォルトのページ
if($pages == '') {
global $wp_query;
$pages = $wp_query->max_num_pages; //全ページ数を取得
if(!$pages) { //全ページ数が空の場合は、1とする
$pages = 1;
}
}
if(1 != $pages) { //全ページが1でない場合は表示
echo "<div class=\"pagination\">\n";
echo "<ul>\n";
//Prev:現在のページ値が1より大きい場合は表示
if($paged > 1) echo "<li class=\"prev\"><a href='".get_pagenum_link($paged - 1)."'>Prev</a></li>\n";
for ($i=1; $i <= $pages; $i++) {
if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems )) {
//現在のページ数と一致すればactiveクラス付与
echo ($paged == $i)? "<li class=\"active\">".$i."</li>\n":"<li><a href='".get_pagenum_link($i)."'>".$i."</a></li>\n";
}
}
//Next:総ページ数より現在のページ値が小さい場合
if ($paged < $pages) echo "<li class=\"next\"><a href=\"".get_pagenum_link($paged + 1)."\">Next</a></li>\n";
echo "</ul>\n";
echo "</div>\n";
}
}
/**- Paginationのテンプレートへの表示方法は以下 -**/
/*
<?php
if (function_exists("pagination")) {
pagination($additional_loop->max_num_pages);
}
?>
*/
/** テンプレートに持ち込んで使いまわしたい変数 **/
/*------------------------------------------*/
$tmp_dir = get_template_directory_uri(); // テンプレートディレクトリURL
$site_url = home_url(); // ホームページURL
説明
サムネイル機能を有効にする
/** サムネイル有効 **/
/*------------------------------------------*/
add_theme_support('post-thumbnails');
記事毎のアイキャッチ機能を有効にします。
投稿の設定
/** 投稿の設定 **/ /*------------------------------------------*/ $mypost_label = '取扱製品'; // ラベル $mypost_slug = 'products'; // スラッグ
デフォルトの「投稿」の名称及びスラッグをカスタマイズするために、変数に入れておきます。後ほど使用します。
投稿の変更
/** 投稿の変更 **/
/*------------------------------------------*/
function edit_admin_menus() {
global $menu, $submenu, $mypost_label;
$menu[5][0] = $mypost_label;
$submenu['edit.php'][5][0] = $mypost_label.'一覧';
}
function revcon_change_post_object() {
global $wp_post_types, $mypost_label;
$labels = &$wp_post_types['post']->labels;
$labels->name = $mypost_label;
$labels->singular_name = $mypost_label;
$labels->add_new = '新規追加';
$labels->add_new_item = $mypost_label .'を追加';
$labels->edit_item = $mypost_label .'の編集';
$labels->new_item = $mypost_label;
$labels->view_item = $mypost_label .'の表示';
$labels->search_items = $mypost_label .'を検索';
$labels->not_found = $mypost_label .'が見つかりませんでした。';
$labels->not_found_in_trash = 'ゴミ箱内に' .$mypost_label .'が見つかりませんでした。';
$labels->all_items = '全ての' .$mypost_label;
$labels->menu_name = $mypost_label;
$labels->name_admin_bar = $mypost_label;
}
add_action('admin_menu', 'edit_admin_menus');
add_action('init', 'revcon_change_post_object');
デフォルトの「投稿」を、上記にて設定した名称へ変更します。
投稿もarchive.phpで表示させる
/** 投稿もarchive.phpで表示させる **/
/*------------------------------------------*/
function post_has_archive($args, $post_type) {
global $mypost_slug;
if ('post' == $post_type) {
$args['rewrite'] = true;
$args['has_archive'] = $mypost_slug; // 上記で設定したスラッグ。上記設定してない場合は文字列(例:'products')
}
return $args;
}
add_filter('register_post_type_args', 'post_has_archive', 10, 2);
普通の投稿もカスタム投稿タイプもカテゴリアーカイブも、私は全部「archive.php」で表示させちゃうので上記を追記。「category.php」は使ってません。
「category.php」を使用される方は上記のコードは必要ないかと思います。
要らないメニュー非表示
/** 要らないメニュー非表示 **/
/*------------------------------------------*/
function remove_admin_menus() {
global $menu;
unset($menu[25]); // コメント
}
add_action('admin_menu', 'remove_admin_menus');
コメント機能は基本的に使ってないので消しちゃいます。
他にも、使用しないメニューは上記のメニュー番号を変更して適用することで、消すことができます。
※デフォルトである項目の場合。別の場合は書き方変わります。
設定ページにキーワード追加
/** 設定ページにキーワード追加 **/
/*------------------------------------------*/
function add_site_word_field($whitelist_options) {
$whitelist_options['general'][] = 'site_word';
return $whitelist_options;
}
add_filter('whitelist_options', 'add_site_word_field');
function regist_site_word_field() {
add_settings_field('site_word', 'サイトキーワード', 'display_site_word', 'general');
}
add_action('admin_init', 'regist_site_word_field');
function display_site_word() {
$site_word = get_option('site_word');
?>
<input name="site_word" value="<?php echo esc_html( $site_word ); ?>" class="regular-text" style="border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);">
<p>このサイトのキーワードを半角カンマ(,)区切りで設定出来ます。</p>
<?php
}
「設定」→「一般」には、ディスクリプションを記入するフィールドはあるのですが、キーワードを設定する項目がありませんので追加します。
現在ではあまり意味を為さないと言われていますが、一応。
SVG対応
/** SVG対応 **/
/*------------------------------------------*/
function cc_mime_types ( $mimes ) {
$mimes [ 'svg' ] = 'image/svg+xml' ;
return $mimes ;
}
add_filter ( 'upload_mimes' , 'cc_mime_types' ) ;
function fix_svg_thumb_display() {
echo '<style>
td.media-icon img[src$=".svg"], img[src$=".svg"].attachment-post-thumbnail {
width: 100% !important;
height: auto !important;
}
</style>
';
}
add_action('admin_head', 'fix_svg_thumb_display');
デフォルトだとメディアへのSVGのアップロードは許可されていませんので、追加できるようにします。
editor-style.cssを有効にする
/** editor-style.cssを有効にする **/
/*------------------------------------------*/
add_editor_style('editor-style.css');
function custom_editor_settings( $initArray ){
$initArray['body_class'] = 'editor-area';
return $initArray;
}
add_filter('tiny_mce_before_init', 'custom_editor_settings');
WYSYWYGエディタに、独自のスタイルを適用します。
functions.phpと同ディレクトリにeditor-style.cssを追加しておきましょう。
wp_head()の制御 / 絵文字のコードを消す
/** wp_head()の制御 **/
/*------------------------------------------*/
remove_action('wp_head', 'feed_links', 2);
remove_action('wp_head', 'feed_links_extra', 3);
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'index_rel_link');
remove_action('wp_head', 'start_post_rel_link', 10, 0);
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
remove_action('wp_head', 'wp_print_styles', 8);
remove_action('wp_head', 'wp_print_head_scripts', 9);
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'rel_canonical');
remove_action('wp_head', 'rest_output_link_wp_head');
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('wp_head', 'wp_oembed_add_host_js');
/** 絵文字のコードを消す **/
/*------------------------------------------*/
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('admin_print_styles', 'print_emoji_styles');
remove_filter('the_content_feed', 'wp_staticize_emoji');
remove_filter('comment_text_rss', 'wp_staticize_emoji');
remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
デフォルトでサイト側に吐き出されるものには、不要なものも沢山ありますので、整理しておきます。
タイトルタグの区切り
/** タイトルタグの区切り **/
/*------------------------------------------*/
/**- タイトルタグをサポートさせる -**/
function mytheme_setup() {
add_theme_support('title-tag');
}
add_action('after_setup_theme', 'mytheme_setup');
/**- タイトルタグからディスクリプションを削除 -**/
function remove_tagline($title) {
if (isset($title['tagline'])) {
unset($title['tagline']);
}
return $title;
}
add_filter( 'document_title_parts', 'remove_tagline' );
/**- タイトルタグの仕切り「-」を「|」へ変更 -**/
function my_document_title_separator($sec) {
$sec = "|";
return $sec;
}
add_filter('document_title_separator', 'my_document_title_separator');
タイトルタグを自動で生成するようにして、不要なコメントを削除します。
また、デフォルトでは「ページの名称 – サイトタイトル」と、区切りが「-」になりますので、
任意のもの(上記では「|」へ)変更します。
ページネーション
/** Pagination **/
/*------------------------------------------*/
function pagination($pages = '', $range = 2) {
$showitems = ($range * 2)+1; //表示するページ数(5ページ)
global $paged; //現在のページ値
if(empty($paged)) $paged = 1; //デフォルトのページ
if($pages == '') {
global $wp_query;
$pages = $wp_query->max_num_pages; //全ページ数を取得
if(!$pages) { //全ページ数が空の場合は、1とする
$pages = 1;
}
}
if(1 != $pages) { //全ページが1でない場合は表示
echo "<div class=\"pagination\">\n";
echo "<ul>\n";
//Prev:現在のページ値が1より大きい場合は表示
if($paged > 1) echo "<li class=\"prev\"><a href='".get_pagenum_link($paged - 1)."'>Prev</a></li>\n";
for ($i=1; $i <= $pages; $i++) {
if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems )) {
//現在のページ数と一致すればactiveクラス付与
echo ($paged == $i)? "<li class=\"active\">".$i."</li>\n":"<li><a href='".get_pagenum_link($i)."'>".$i."</a></li>\n";
}
}
//Next:総ページ数より現在のページ値が小さい場合
if ($paged < $pages) echo "<li class=\"next\"><a href=\"".get_pagenum_link($paged + 1)."\">Next</a></li>\n";
echo "</ul>\n";
echo "</div>\n";
}
}
ページネーションを自動作成します。
表示させるには、テンプレートファイルのループ後の任意の場所へ
<?php
if (function_exists("pagination")) {
pagination($additional_loop->max_num_pages);
}
?>
を記載します。
また、上記のコードで生成されるhtmlは以下となります。
<div class="pagenation"> <ul> <li class="active">1</li> <li><a href='/page/2/'>2</a></li> <li class="next"><a href="/page/2/">Next</a></li> </ul> </div>
テンプレートに持ち込んで使いまわしたい変数
/** テンプレートに持ち込んで使いまわしたい変数 **/ /*------------------------------------------*/ $tmp_dir = get_template_directory_uri(); // テンプレートディレクトリURL $site_url = home_url(); // ホームページURL
個人的に便利なので。
使用したいテンプレートそれぞれに、
<?php global $tmp_dir, $site_url; ?>
を忘れずに。
この他にも、作りたいサイトによっていろいろ入れてます。
それはまたの機会に~。



