Webデザイン

僕がWordPressのオリジナルテーマを作るときよくfunctions.phpに記述するソースコード

WordPressテーマ制作・カスタマイズでよく使うソースコードまとめ

どうもこんにちは。
Web/App/UIデザイナーのサトウです。

今回は、僕がWordPressのオリジナルテーマを作るときよくfunctions.phpに記述するソースコードをご紹介していきます。

自分自身の中で整理する意味も込めて、みなさんと共有したいと思います。

目次

基本機能の追加

CSSファイル、JSファイルを読み込む

// CSSファイル、JSファイルを読み込む
function theme_enqueue_files() {
  wp_enqueue_style('parent-style', get_template_directory_uri().'/style.css' );// 親テーマのCSS
  wp_enqueue_style('self-style', get_stylesheet_directory_uri().'/style.css', array('parent-style'));// 子テーマのCSS
  wp_enqueue_script('primary-script', get_template_directory_uri().'/primary.js' );// 先に読み込むjs
  wp_enqueue_script('secondary-script', get_stylesheet_directory_uri().'/secondary.js', array('primary-script'));// 後に読み込むjs
}
add_action('wp_enqueue_scripts', 'theme_enqueue_files');

親テーマを持たない場合は parent-style の部分が self-style になり、もちろん子テーマ用CSSの読み込みは不要になります。
self-style の後ろのほうで指定している array(‘parent-style’) は、「parent-styleを読み込んでから読み込んでね」という指定です。

jQuery を使用する場合は、まず最初に jQuery が読み込まれるように指定しましょう。

ウィジェットエリアを追加

ウィジェットを表示させる場所を追加します。

// ウィジェットエリアを追加
if (function_exists('register_sidebar')) {
  register_sidebar(array(
    'name'          => '半角/全角でわかりやすい名前',
    'id'            => '半角で識別用ID',
    'before_widget' => '<div id="%1$s" class="widget %2$s">',
    'after_widget'  => '</div>',
    'before_title'  => '<h4 class="widgettitle">',
    'after_title'   => '</h4>',
  ));
}

複数のウィジェットエリアが必要な場合は register_sidebar(array( 〜 )); を必要な分だけ記述します。

ウィジェットエリアを設置する場所には下記を記述します。
()内に識別子としてIDを指定します。

if (is_active_sidebar('半角で識別用ID')) {
  dynamic_sidebar('半角で識別用ID');
}

カスタムメニューを追加

()の中には識別子とメニュー位置名を指定します。
識別子はメニューを呼び出す際に使用する文字列、メニュー位置名は管理画面でメニュー設定をする際に表示される名称です。

// カスタムメニューlocation設定
register_nav_menu('menu-location-name', 'メニュー位置名');

複数のメニューが必要な場合は必要な分だけ記述します。

メニューを表示させる場所には下記を記述します。
theme_locationに識別子を指定します。

wp_nav_menu( array(
  'theme_location'=>'menu-location-name',
  'container'     =>'',
  'container_id'  =>'半角英数でID',
  'menu_class'    =>''
));

投稿にサムネイル機能を追加

// 投稿にサムネイル機能を追加
add_theme_support('post-thumbnails');
set_post_thumbnail_size(300, 300, true);

サムネイルのサイズを追加

// サムネイルのサイズを追加
set_post_thumbnail_size( width, height, trimming );

trimmingは指定したサイズに画像を切り抜くかどうかの指定です。
trueかfalseを指定します。

不要な基本機能の無効化

固定ページの本文にpタグが自動挿入されないようにする

// 固定ページの本文にpタグが自動挿入されないようにする
function no_wpautop_in_page() {
  if(is_page() {
    remove_filter('the_content','wpautop');
  }
}
add_action('wp','no_wpautop_in_page');

本文冒頭にコメントを付けてpタグが自動挿入されないようにする

// 本文冒頭にコメント<!--noautop-->を付けてpタグが自動挿入されないようにする
function noautop( $content ) {
  if ( strpos( $content, '<!--noautop-->' ) !== false ) {
    remove_filter( 'the_content', 'wpautop' );
    $content = preg_replace( "/\s*\<!--noautop-->\s*(\r\n|\n|\r)?/u", "", $content );
  }
  return $content;
}
add_filter( 'the_content', 'noautop', 1 );

投稿、固定ページのメディアimgタグにwidth、height、classが付かないようにする

// 投稿、固定ページのメディアimgタグにwidth、height、classが付かないようにする
add_filter( 'image_send_to_editor', 'remove_image_attribute', 10 );
add_filter( 'post_thumbnail_html', 'remove_image_attribute', 10 );

function remove_image_attribute( $html ){
  $html = preg_replace( '/(width|height)="\d*"\s/', '', $html ); // width, height を付けない
  $html = preg_replace( '/class=[\'"]([^\'"]+)[\'"]/i', '', $html ); // class を付けない
  return $html;
}

絵文字機能を停止する

// 絵文字機能を停止する
function disable_emojis() {
  remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
  remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
  remove_action( 'wp_print_styles', 'print_emoji_styles' );
  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' );
  add_filter( 'tiny_mce_plugins', 'disable_emojis_tinymce' );
}
add_action( 'init', 'disable_emojis' );

サムネイル画像の自動生成を止める

不要なサイズは生成されないようにしてしまいましょう。
放っておくとサーバー容量を圧迫することになりかねません。

// サムネイル画像の自動生成を止める
add_image_size('thumbnail', 0, 0);    /* サムネイル */
add_image_size('medium', 0, 0);       /* 中サイズ */
add_image_size('large', 0, 0);        /* 大サイズ */
add_image_size('medium_large', 0, 0); /* 縦横上限768サイズ */
add_image_size('1536x1536', 0, 0);    /* 縦横上限1536サイズ */
add_image_size('2048x2048', 0, 0);    /* 縦横上限2048サイズ */

管理画面のカスタマイズ

ログイン画面のロゴを変更する

必須ではないですが、これをするだけでログイン画面の印象がガラッと変わるのでおすすめです。

// ログイン画面のロゴを変更する
function custom_login_logo() { ?>
  <style>
    .login #login {
      width:  400px;
    }
    .login #login h1 a {
      width:  160px;
      height: 206px;
      background: url(<?php echo get_stylesheet_directory_uri(); ?>/img/logo-login.svg) no-repeat 0 0;
    }
    .login #login #loginform {
      margin-right: 20px;
      margin-left:  20px;
    }
  </style>
<?php }
add_action( 'login_enqueue_scripts', 'custom_login_logo' );

固定ページ編集画面のビジュアルエディタを無効化

本文エリアにHTMLを記述している場合、ビジュアルエディタで編集されてしまうとソースコードが崩れてしまうケースがあります。
投稿はクライアントがお知らせ等で使いたいケースが多いのでビジュアルエディタを残し、固定ページだけビジュアルエディタを無効化するといいと思います。

最近はブロックエディタのカスタムHTMLというものが登場したので、そちらを使えばいいかもしれません。

// 固定ページのビジュアルエディタを無効化
function disable_visual_editor_in_page() {
	global $typenow;
	if( $typenow == 'page' ){
		add_filter('user_can_richedit', 'disable_visual_editor_filter');
	}
}
function disable_visual_editor_filter(){
	return false;
}
add_action('load-post.php', 'disable_visual_editor_in_page');
add_action('load-post-new.php', 'disable_visual_editor_in_page');

投稿画面の「表示オプション」「ヘルプ」「カテゴリーのよく使うものと新規カテゴリーを追加」「タグのよく使うものと新規タグを追加」を非表示

クライアントの目に触れなくていいものは極力非表示にしてシンプルにしてあげると、不慣れな人でも心理的ハードルが下がっていいと思います。

// 投稿画面の「表示オプション」「ヘルプ」「カテゴリーのよく使うものと新規カテゴリーを追加」「タグのよく使うものと新規タグを追加」を非表示
function hide_category_tabs_adder() {
  global $pagenow;
  global $post_type;
  if ( is_admin() && ($pagenow=='post-new.php' || $pagenow=='post.php') ) {
    echo '<style type="text/css">
    #contextual-help-link-wrap,#screen-options-link-wrap{display:none;}
    #category-tabs, #category-adder {display:none;}
    #post_tag-tabs, #post_tag-adder {display:none;}
    #categorychecklist, #post_tagchecklist {margin-top:0; margin-bottom:0;}
    .categorydiv .tabs-panel {padding: 0 !important; background: none; border: none !important;}
    </style>';
  }
}
add_action( 'admin_head', 'hide_category_tabs_adder' );

「投稿」のラベルを任意のものに変更する(例:アイテム)

カスタム投稿タイプを使ってもいいですが、投稿に他の用途がないのであれば投稿のラベルを変更して使ってもいいと思います。

// 「投稿」のラベルを任意のものに変更する(例:アイテム)
function custom_post_labels( $labels ) {
  $labels->name = 'アイテム'; // 投稿
  $labels->singular_name = 'アイテム'; // 投稿
  $labels->add_new = 'アイテムを追加'; // 新規追加
  $labels->add_new_item = 'アイテムを追加'; // 新規投稿を追加
  $labels->edit_item = 'アイテムの編集'; // 投稿の編集
  $labels->new_item = '新規アイテム'; // 新規投稿
  $labels->view_item = 'アイテムを表示'; // 投稿を表示
  $labels->search_items = 'アイテムを検索'; // 投稿を検索
  $labels->not_found = 'アイテムが見つかりませんでした。'; // 投稿が見つかりませんでした。
  $labels->not_found_in_trash = 'ゴミ箱内にアイテムが見つかりませんでした。'; // ゴミ箱内に投稿が見つかりませんでした。
  $labels->parent_item_colon = ''; // (なし)
  $labels->all_items = 'アイテム一覧'; // 投稿一覧
  $labels->archives = 'アイテムアーカイブ'; // 投稿アーカイブ
  $labels->insert_into_item = 'アイテムに挿入'; // 投稿に挿入
  $labels->uploaded_to_this_item = 'このアイテムへのアップロード'; // この投稿へのアップロード
  $labels->featured_image = 'アイキャッチ画像'; // アイキャッチ画像
  $labels->set_featured_image = 'アイキャッチ画像を設定'; // アイキャッチ画像を設定
  $labels->remove_featured_image = 'アイキャッチ画像を削除'; // アイキャッチ画像を削除
  $labels->use_featured_image = 'アイキャッチ画像として使用'; // アイキャッチ画像として使用
  $labels->filter_items_list = 'アイテムリストの絞り込み'; // 投稿リストの絞り込み
  $labels->items_list_navigation = 'アイテムリストナビゲーション'; // 投稿リストナビゲーション
  $labels->items_list = 'アイテムリスト'; // 投稿リスト
  $labels->menu_name = 'アイテム'; // 投稿
  $labels->name_admin_bar = 'アイテム'; // 投稿
  return $labels;
}
add_filter( 'post_type_labels_post', 'custom_post_labels' );

投稿画面のタグ入力欄をチェックボックスに変更

タグが自由入力だと表記揺れのリスクが発生したり、単純に入力の手間が増えたりします。
チェックボックスにしておくとそのリスクを減らせます。

// 投稿画面のタグ入力欄をチェックボックスに変更
function re_register_post_tag_taxonomy() {
  global $wp_rewrite;
  $rewrite = array(
    'slug' => get_option('tag_base') ? get_option('tag_base') : 'tag',
    'with_front' => ! get_option('tag_base') || $wp_rewrite->using_index_permalinks(),
    'ep_mask' => EP_TAGS,
  );
  $labels = array(
    'name' => _x( 'Tags', 'taxonomy general name' ),
    'singular_name' => _x( 'Tag', 'taxonomy singular name' ),
    'search_items' => __( 'Search Tags' ),
    'popular_items' => __( 'Popular Tags' ),
    'all_items' => __( 'All Tags' ),
    'parent_item' => null,
    'parent_item_colon' => null,
    'edit_item' => __( 'Edit Tag' ),
    'view_item' => __( 'View Tag' ),
    'update_item' => __( 'Update Tag' ),
    'add_new_item' => __( 'Add New Tag' ),
    'new_item_name' => __( 'New Tag Name' ),
    'separate_items_with_commas' => __( 'Separate tags with commas' ),
    'add_or_remove_items' => __( 'Add or remove tags' ),
    'choose_from_most_used' => __( 'Choose from the most used tags' ),
    'not_found' => __( 'No tags found.' )
  );
  register_taxonomy( 'post_tag', 'post', array(
    'hierarchical' => true,
    'query_var' => 'tag',
    'rewrite' => $rewrite,
    'public' => true,
    'show_ui' => true,
    'show_admin_column' => true,
    '_builtin' => true,
    'labels' => $labels
  ) );
}
add_action( 'init', 're_register_post_tag_taxonomy', 1 );

投稿画面でのカスタム分類の並び順を「説明」順にする

// 投稿画面でのカスタム分類の並び順を「説明」順にする
function taxonomy_orderby_description( $orderby, $args ) {
  if (is_admin()){
    $orderby = 'tt.description';
  }
  return $orderby;
}
add_filter( 'get_terms_orderby', 'taxonomy_orderby_description', 10, 2 );

管理画面の投稿一覧から「タグ」の列を削除する

「表示オプション」でオフにすればいいだけではありますが、クライアントワークで確実にオフにしておきたい場合などに有効です。

// 管理画面の投稿一覧から「タグ」の列を削除する
function custom_columns($columns) {
  unset($columns['tags']);
  return $columns;
}
add_filter( 'manage_posts_columns', 'custom_columns' );

管理画面の投稿一覧から「コメント」の列を削除する

こちらも同じく「表示オプション」で対応できますが、恒久的にオフにするのであればこの方法も有効です。

// 管理画面の投稿一覧から「コメント」の列を削除する
function custom_columns2($columns2) {
  unset($columns2['comments']);
  return $columns2;
}
add_filter( 'manage_posts_columns', 'custom_columns2' );

投稿画面のレイアウトをデフォルトで1カラムにする

こちらも「表示オプション」で対応できますが、クライアントワークで確実に対応しておきたい場合などに有効です。

// 投稿画面のレイアウトをデフォルトで1カラムにする
add_filter( 'get_user_option_screen_layout_post', 'one_columns_screen_layout' );
function one_columns_screen_layout() {
  return 1;
}

投稿編集画面にメタボックスを追加してメッセージを表示させる

// 投稿編集画面にメタボックスを追加してメッセージを表示させる
function add_custom_box(){
  add_meta_box( 'custom-box-1','ここにタイトル','inner_custom_box',
    array('post', 'page'), //表示させる画面 'dashboard', 'custom_post_type' など
    'side', //表示させる場所 'normal', 'side', 'advanced'
    'default', //表示順 'high', 'core', 'default', 'low'
  );
  function inner_custom_box(){echo 'ここにメッセージ'; }
}
add_action( 'admin_menu', 'add_custom_box' );

管理者以外の管理画面にWordPressアップデートの通知を出さないようにする

複数人で運用しているブログやメディア等で、編集者や投稿者、寄稿者といったユーザーに対して余計なアップデート通知を表示させたくない場合に有効です。

// 管理者以外の管理画面にWordPressアップデートの通知を出さないようにする
function update_nag_admin_only() {
  if ( ! current_user_can( 'administrator' ) ) {
    remove_action( 'admin_notices', 'update_nag', 3 );
  }
}
add_action( 'admin_init', 'update_nag_admin_only' );

カスタム投稿タイプ

プラグイン「Custom Post Type UI」を使ってもいいですが、あまりプラグインが増えてもアレなので、僕はfunctions.phpに書くことにしています。

カスタム投稿タイプを作成

// カスタム投稿タイプを作成
add_action( 'init', 'create_post_type' );
function create_post_type() {
  // カスタム投稿タイプ01
  register_post_type(
    'customPostType01', array(
      'label'  => 'カスタム投稿名',
      'labels' => array(
        'name'             => 'カスタム投稿名',
        'add_new'          => 'カスタム投稿を追加する',
        'edit_item'        => 'カスタム投稿を編集する',
        'view_item'        => 'カスタム投稿を見る',
        'add_new_item'     => '追加するカスタム投稿の情報を入力',
        'enter_title_here' => 'タイトル'
      ),
      'hierarchical'       => true,
      'public'             => true,
      'menu_position'      => 4,
      'has_archive'        => true,
      'show_in_nav_menus'  => true,
      'supports'           => array(
        'title',
        'editor',
        'excerpt',
        'thumbnail',
        'custom-fields',
        'revisions',
        'page-attributes'
      ),
      'show_in_rest' => true,// ブロックエディタに対応
    )
  );
}

複数のカスタム投稿タイプが必要な場合は、register_post_type(〜);を必要な分だけ記述します。

カスタム投稿タイプ投稿画面のタイトル入力欄のplaceholderを変更

カスタム投稿タイプの内容に合わせたplaceholderに変更するだけで、「ちゃんとしてる感」がグッと増します。

// タイトルのplaceholderを指定の文字列に差し替え
add_filter( 'enter_title_here', 'custom_enter_title_here', 10, 2 );
function custom_enter_title_here( $enter_title_here, $post ) {
  $post_type = get_post_type_object( $post->post_type );
  if ( isset( $post_type->labels->enter_title_here ) && $post_type->labels->enter_title_here && is_string( $post_type->labels->enter_title_here ) ) {
    $enter_title_here = esc_html( $post_type->labels->enter_title_here );
  }
  return $enter_title_here;
}

カスタム分類を作成

複数のカスタム分類が必要な場合は必要な分だけ記述します。
カスタム分類はカスタム投稿タイプとセットで使われることが多いですが、普通の投稿にカテゴリーやタグを増やすこともできます。

カテゴリーのように階層構造を持った分類を作成する場合

//カスタム分類(カテゴリー)を作成
register_taxonomy(
  'custom-category', /* カスタム分類の名前*/
  'customPostType01', /* 分類を適用するカスタム投稿の名前*/
  /* 'post', 投稿に適用する場合はこちらを使う */
  array(
    'label'             => '分類',
    'singular_label'    => '分類',
    'show_admin_column' => true,
    'hierarchical'      => true, /* 階層化あり */
  )
);

タグクラウドのように階層構造を持たない分類を作成する場合

//カスタム分類(タグクラウド)を作成
register_taxonomy(
  'custom-category', /* カスタム分類の名前*/
  'customPostType01', /* 分類を適用するカスタム投稿の名前*/
  /* 'post', 投稿に適用する場合はこちらを使う */
  array(
    'label'                 => '分類',
    'singular_label'        => '分類',
    'show_admin_column'     => true,
    'hierarchical'          => false, /* 階層化なし */
    'update_count_callback' => '_update_post_term_count', /* 関連付けられた公開済み投稿数を返す */
  )
);

カスタム分類の一覧画面における表示件数を設定

//カスタム分類の一覧画面における表示件数を設定
function change_posts_per_page($query) {
    if ( is_admin() || ! $query->is_main_query() )
        return;
    if ( $query->is_archive('posttypename') ) { //カスタム投稿タイプを指定
        $query->set( 'posts_per_page', '20' ); //表示件数を指定
    }
}
add_action( 'pre_get_posts', 'change_posts_per_page' );

管理画面のカスタム投稿タイプ一覧画面にカスタム分類での絞り込みを追加する

// 管理画面のカスタム投稿タイプ一覧画面にカスタム分類での絞り込みを追加する
function add_term_dropdown( $post_type ) {
  if($post_type == 'customPostTypeSlug') {
    $term_slug = get_query_var('customTaxonomySlug');
    wp_dropdown_categories(array(
      'show_option_all' => __('カスタム分類名', 'my_theme'),
      'selected'        => $term_slug,
      'name'            => 'customTaxonomySlug',
      'taxonomy'        => 'customTaxonomySlug',
      'value_field'     => 'slug',
    ));
  }
}
add_action('restrict_manage_posts', 'add_term_dropdown', 10, 3);

ショートコードでいろいろなものを呼び出す

任意のテーマファイルを呼び出す

// 任意のテーマファイルを呼び出す
function include_themefile() {
  get_template_part('theme-file-name');
}
add_shortcode('shortcode-name', 'include_themefile');

都度指定してテーマファイルを呼び出す

// 都度指定してテーマファイルを呼び出す
function include_themefile($params = array()) {
  extract(shortcode_atts(array(
    'file' => 'default'
  ), $params));
  ob_start();
  include(get_theme_root() . '/' . get_template() . "/$file.php");
  return ob_get_clean();
}
add_shortcode('hello_file', 'include_themefile');

テーマを呼び出したい場所に下記のショートコードを記述します。

[hello_file file="theme-file-name"]

テーマフォルダのパスを呼び出す

// テーマフォルダのパスを呼び出す
function shortcode_templateurl() {
  return get_bloginfo('template_url');
}
add_shortcode('template_url', 'shortcode_templateurl');

アップロードフォルダのパスを呼び出す

// アップロードフォルダのパスを呼び出す
function shortcode_upload() {
  $upload_dir = wp_upload_dir();
  return $upload_dir['baseurl'];
}
add_shortcode('upload_url', 'shortcode_upload');

サイト名を呼び出す

// サイト名を呼び出す
function shortcode_blogname() {
    return get_bloginfo('name');
}
add_shortcode('blogname', 'shortcode_blogname');

サイトURLを呼び出す

// サイトURLを呼び出す
function shortcode_blogurl() {
    return get_bloginfo('url');
}
add_shortcode('blogurl', 'shortcode_blogurl');

任意のソースコードを呼び出す

// 任意のソースコードを呼び出す
function shortcode_works_system() {
  $template_directory = get_template_directory_uri();
  return '<Write HTML source code here>'; //複数行必要な場合はこの行を繰り返す
}
add_shortcode('system', 'shortcode_works_system');

カスタマイズ

投稿&固定ページの本文に含まれる画像パスをテーマフォルダ内の画像フォルダパスに置き換える

// 投稿&固定ページの本文に含まれる画像パスをテーマフォルダ内の画像フォルダパスに置き換える
function replaceImagePath($arg) {
  $content = str_replace('"img/', '"' . get_bloginfo('template_directory') . '/img/', $arg);
  return $content;
}
add_action('the_content', 'replaceImagePath');

投稿&固定ページの本文に含まれるメディアパスをルート相対に変更する

通常、投稿や固定ページにメディアを配置すると、「https://」から始まるフルパスで配置されますが、これを「/」から始まるルート相対パスで配置されるように変更します。

メディアを配置する際に記述されるパスを設定するもので、すでに配置されているものについては作用しません。

/* 投稿&固定ページの本文に含まれるメディアパスをルート相対に変更する */
function delete_host_from_attachment_url($url) {
  $regex = '/^http(s)?:\/\/[^\/\s]+(.*)$/';
  if (preg_match($regex, $url, $m)) {
    $url = $m;
  }
  return $url;
}
add_filter('wp_get_attachment_url', 'delete_host_from_attachment_url');
add_filter('attachment_link', 'delete_host_from_attachment_url');

投稿&固定ページの本文に挿入した画像にclassを追加する

//投稿&固定ページの本文に挿入した画像にclassを追加する
add_filter('get_image_tag_class', 'add_image_class');
function add_image_class( $classes ) {
  return $classes . ' post-content-image';
}

固定ページの body_class() にスラッグを追加する

// 固定ページの body_class() にスラッグを追加する
function pageslug_class($classes = '') {
  if (is_page()) {
    $page = get_post(get_the_ID());
    $classes[] = $page->post_name;
    if ($page->post_parent) {  // ページが子ページであったときの処理
      $classes[] = get_page_uri($page->post_parent) . '-' . $page->post_name;
      // 「親ページのスラッグ-子ページのスラッグ」という表示に調整
    }
  }
  return $classes;
}
add_filter('body_class', 'pageslug_class');

抜粋の長さを変更する

// 抜粋の長さを変更する
function custom_excerpt_length($length) {
  return 76;
}
add_filter('excerpt_length', 'custom_excerpt_length');

「続きを読む」の文字列を変更する

// 「続きを読む」の文字列を変更する
function new_excerpt_more( $more ) {
  return ' ...<a class="read-more" href="'. get_permalink( get_the_ID() ) . '">続きを読む</a>';
}
add_filter('excerpt_more', 'new_excerpt_more');

prevリンクnextリンクにclassを追加する

// prevリンクnextリンクにclassを追加する
function next_post_link_attributes($output) {
  $code = 'class="btn-next-post"';
  return str_replace('<a href=', '<a '.$code.' href=', $output);
}
add_filter('next_post_link', 'next_post_link_attributes');
function prev_post_link_attributes($output) {
  $code = 'class="btn-prev-post"';
  return str_replace('<a href=', '<a '.$code.' href=', $output);
}
add_filter('previous_post_link', 'prev_post_link_attributes');

カスタムメニューのliに付与されるclassを指定する

array()の中にclassをカンマ区切りで記述します。
【例】array(‘class01′,’class02′,’class03’)

/* カスタムメニューのliに付与されるclassを指定する */
add_filter('nav_menu_css_class', 'my_css_attributes_filter', 100, 1);
add_filter('nav_menu_item_id', 'my_css_attributes_filter', 100, 1);
add_filter('page_css_class', 'my_css_attributes_filter', 100, 1);
function my_css_attributes_filter($var) {
  return is_array($var) ? array_intersect($var, array('current-menu-item')) : '';
}

固定ページにカテゴリーを設定できるようにする

カテゴリー構造を持ったページを作成する際は一般的にカスタム投稿タイプを使用しますが、例えばすでに固定ページで制作されたページ群に対してカテゴリー構造を付与する改修などが必要になった際には役に立ちます。

// 固定ページにカテゴリーを設定できるようにする
function add_categories_to_pages(){
  register_taxonomy_for_object_type('category', 'page');
}
add_action('init','add_categories_to_pages');

カテゴリーアーカイブに固定ページを含める

// カテゴリーアーカイブに固定ページを含める
function add_page_to_category_archive( $query ) {
  if ( $query->is_category== true && $query->is_main_query() ) {
    $query->set('post_type', array( 'post', 'page' ));
  }
}
add_action( 'pre_get_posts', 'add_page_to_category_archive' );

アーカイブページのタイトルから前置詞を削除

各種アーカイブページのタイトル前に付く「カテゴリー:」「タグ:」「アーカイブ:」といった前置詞を取り除きます。

// アーカイブページのタイトルから前置詞を削除
add_filter( 'get_the_archive_title', function ($title) {
    if (is_category()) {
        $title = single_cat_title('',false);
    } elseif (is_tag()) {
        $title = single_tag_title('',false);
    } elseif (is_tax()) {
        $title = single_term_title('',false);
    } elseif (is_post_type_archive() ){
        $title = post_type_archive_title('',false);
    } elseif (is_date()) {
        $title = get_the_time('Y年n月');
    } elseif (is_search()) {
        $title = '検索結果:'.esc_html( get_search_query(false) );
    } elseif (is_404()) {
        $title = '「404」ページが見つかりません';
    } else {
    }
    return $title;
});

プラグイン対応

AddQuicktagプラグインをカスタム投稿タイプでも使用可能にする

// AddQuicktagプラグインをカスタム投稿タイプでも使用可能にする
add_filter( 'addquicktag_post_types', 'my_addquicktag_post_types' );
function my_addquicktag_post_types( $post_types ) {
  array_push($post_types,'post-type-name');
  return $post_types;
}

さて、今回は、僕がWordPressのオリジナルテーマを作るときよくfunctions.phpに記述するソースコードご紹介しました。
いかがだったでしょうか?
読んでくださったあなたの参考に少しでもなれば嬉しいです。
なお、この記事は普段の業務や情報収集を受けて随時アップデートしていきます。
それではまた次回。