コフス技術ブログ

WordPressにて標準で出力される不要なコードの削減と、不要機能を停止する例

この記事はにメンテナンスが行われています。

WordPressには標準で様々な機能が備わっており、ブログサイトとして利用する分であれば特別何もせずとも快適に利用できるよう設計されています。

ただある程度カスタマイズを想定してWordPressを選定した場合、標準機能が出力する不要なコードが邪魔になってしまったり、またそもそも不要な機能を停止させたいという事も多々遭遇します。

今回は私がWordPress案件でよく利用する不要機能停止(クリーンアップ)の例を紹介していきます。何かの役に立ちましたら幸いです。

管理画面系

標準だと管理画面(ダッシュボード)にも様々なUIが存在しますが、例えばWordPressへようこそウィジットが不要な場合も多いです。
管理画面上でチェックボックスをOFFにすることで非表示化することも出来ますが、ほぼほぼ不要なUIであれば最初からfunctions.phpで消してしまうのも有りですよね。

functions.php
/** WordPressへようこそ!を削除 */
remove_action( 'welcome_panel', 'wp_welcome_panel' );

/** ウィジェットを削除 */
add_action( 'wp_dashboard_setup', 'remove_dashboard_widget' );

/** アクティビティ、クイックドラフト、WordPressニュースの削除 */
function remove_dashboard_widget() {
  remove_meta_box( 'dashboard_activity', 'dashboard', 'normal' );
  remove_meta_box( 'dashboard_quick_press', 'dashboard', 'side' );
  remove_meta_box( 'dashboard_primary', 'dashboard', 'side' );
}

WordPress標準機能をOFF

標準で備わっているコメント機能も不要な案件も多いですよね。adminbarも毎回プロフィールより非表示化するのも面倒な場合も多いと思います。こういったWordPressが標準で持っている機能もfunctions.phpでOFFにすることが可能です。

自動保存機能も便利な機能ではありますが、案件によっては無くても問題ない事も。まとめてOFFにしてしまうこともよくあります。

functions.php
/** コメント機能 */
add_filter( 'comments_open', '__return_false' );

/** 管理画面のadminbarの表示 */
add_filter( 'show_admin_bar', '__return_false' );

/** 自動保存停止 */
function disable_autosave() {
  wp_deregister_script( 'autosave' );
}
add_action( 'wp_print_scripts', 'disable_autosave' );

自動ソースの吐き出しを抑制

実際の案件でWordPress開発をする時はほぼほぼ記述している自動で出力するソースの削除の例です。もはや鉄板とも言えますが、標準のWordPressはとにかく色々なソースを親切に出力してくれます。ただこの出力には脆弱性に繋がるヒントが入っている事もあったり、また使用しないソースを無駄に出力することもあります。

セキュリティーを高める為にも、またページパフォーマンスを向上させる為にも使用する事のないソースの出力は止めておくと開発がしやすくなります。

functions.php
/** Emoji系 */
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' );

/** OEmbed系 */
remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
remove_action( 'wp_head', 'wp_oembed_add_host_js' );

/** Wp-json系 */
remove_action( 'wp_head', 'rest_output_link_wp_head' );

/** EditURI */
remove_action( 'wp_head', 'rsd_link' );

/** Wlwmanifest */
remove_action( 'wp_head', 'wlwmanifest_link' );

/** WordPressバージョン出力metaタグ非表示 */
remove_action( 'wp_head', 'wp_generator' );

/** Rel linkの削除 */
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );

/** Canonical */
remove_action( 'wp_head', 'rel_canonical' );
remove_action( 'wp_head', 'wp_shortlink_wp_head' );
remove_action( 'wp_head', 'feed_links_extra', 3 );
remove_action( 'wp_head', 'feed_links', 2 );

/** DNSプリフェッチコード挿入を削除 */
add_filter( 'wp_resource_hints', 'remove_dns_prefetch', 10, 2 );

/** Gutenbergの読み込みスタイルを削除 */
add_action( 'wp_enqueue_scripts', 'remove_block_library_style' );

/** Remove_block_library_style */
function remove_block_library_style() {
  wp_dequeue_style( 'wp-block-library' );
  wp_dequeue_style( 'wp-block-library-theme' );
}

/** -----------------------------------------------------------
 *
 * DNSプリフェッチ削除.
 *
 * @param string $hints Description.
 * @param string $relation_type .
 * @return $hints
 * -----------------------------------------------------------*/
function remove_dns_prefetch( $hints, $relation_type ) {
  if ( 'dns-prefetch' === $relation_type ) {
    return array_diff( wp_dependencies_unique_hosts(), $hints );
  }
  return $hints;
}

管理画面の左メニューの一部を削除

管理画面の左側には様々な項目が並んでいますが、例えばコメント機能を利用しないのであれば削除してしまってもいいでしょう。
メディア案件ではコメント機能をそもそも用いない事もありますし、また外部サービスを利用する事も多いので割と消すことも多いです。

案件に合わせて不要な項目を消してあげる、これだけでも管理画面の使い勝手が上がりますし、何よりスッキリしますよね。プラグインを利用せずとも削除することは可能です。

functions.php
function remove_menus() {

  /** 管理画面 */
  remove_menu_page( 'index.php' );

  /** 投稿 */
  remove_menu_page( 'edit.php' );

  /** メディア */
  remove_menu_page( 'upload.php' );

  /** 固定ページ */
  remove_menu_page( 'edit.php?post_type=page' );

  /** コメント */
  remove_menu_page( 'edit-comments.php' );

  /** 外観 */
  remove_menu_page( 'themes.php' );

  /** プラグイン */
  remove_menu_page( 'plugins.php' );

  /** ユーザー */
  remove_menu_page( 'users.php' );

  /** ツール */
  remove_menu_page( 'tools.php' );

  /** 設定 */
  remove_menu_page( 'options-general.php' );

}
add_action( 'admin_menu', 'remove_menus' );

ちなみにサブメニューの削除も可能です。以下が参考になると思います。

サムネイル自動生成停止

案件によりけりではありますが、サムネイルの自動生成を完全に止めてしまう事もあります。サーバーとDBの容量の削減ですね。

WordPressではサムネイル周りの生成を割と自由に設定が可能です。管理画面の設定->メディアよりサイズの指定も可能ですし、カスタムサイズを新たに定義することも可能です。

ただ案件によってはガチガチに最初で画像仕様を決めて、デザイナーさんが仕様に沿った画像を用意してくれる事もあります。そういった場合に限ってはサムネイルの自動生成は停止してもいいかもしれません。

functions.php
/** -----------------------------------------------------------
 *
 * サムネイル自動生成停止.
 *
 * @param string $sizes .
 * @return $sizes
 * -----------------------------------------------------------*/
function remove_image_sizes( $sizes ) {
  unset( $sizes['thumbnail'] );
  unset( $sizes['medium'] );
  unset( $sizes['large'] );

  return $sizes;
}
add_filter( 'intermediate_image_sizes_advanced', 'remove_image_sizes' );
update_option( 'medium_large_size_w', 0 );

ちなみに当サイトではサムネイルの内、thumbnailサイズのみ有効化し、mediumlargeサイズは生成しない様にしています。

the_post_thumbnailのクラスを削除

WordPressでサムネイルの出力は<?php the_post_thumbnail(); ?>で可能ですが、出力されたソースを見ると様々なclassが付属してきます。勿論意味があって付いてくるわけですが、仕様によっては要らない事も多いと思います。

そういった場合はfunction.phpで一括で削除してしまうのも有りです。

functions.php
/** -----------------------------------------------------------
 *
 * The_post_thumbnailのクラスを削除.
 *
 * @param string $output .
 * @return $output
 * -----------------------------------------------------------*/
function wps_post_thumbnail_remove_class( $output ) {
  $output = preg_replace( '/class=".*?"/', '', $output );
  return $output;
}
add_filter( 'post_thumbnail_html', 'wps_post_thumbnail_remove_class' );

URL自動補完機能を停止

便利な機能ではありますが、やはり案件によっては要らない事もあるのがURLの自動補完機能です。
WordPressを利用したことがある方ならURLをTypoしても適切なページにリダイレクトされた経験があると思いますが、あの機能の事ですね。

以下で停止させることが出来ます。

functions.php
/** -----------------------------------------------------------
 *
 * URL自動補完機能を停止.
 *
 * @link https://raw.githubusercontent.com/markmercedes/disable-canonical-redirect/master/disable-canonical-redirect.php
 *
 * -----------------------------------------------------------*/
add_filter(
  'redirect_canonical',
  function( $redirect_url ) {
    return false;
  }
);