2026年6月23日

2026年6月23日

WordPressでプラグインなしで実装できる機能まとめ|functions.phpで置き換えるコード例

WordPress の小さな機能の多くは、プラグインを入れなくても、子テーマの functions.php か mu-plugin に数行のコードを書くだけで実装できます。絵文字スクリプトの停止、抜粋の文字数の変更、管理バーの非表示、リダイレクト、OGP タグの出力、XML-RPC の制限、リビジョン数の上限といった機能が代表例です。この記事では、それぞれのコード例と注意点、コードを書く場所の選び方、そして「この機能はプラグインに任せたほうがよい」という判断の目安までを説明します。

コードを書く前の準備

書く場所を決める:子テーマか mu-plugin か

コードを書く場所は、主に次の2つです。

  • 子テーマの functions.php: 見た目に関わる機能(抜粋の長さ、管理バーの表示など)を書くのに向いています。親テーマの functions.php に直接書くと、テーマの更新で消えてしまうため、子テーマを使います。テーマを変更するとコードも効かなくなる点に注意してください。
  • mu-plugin(必須プラグイン): wp-content/mu-plugins/ フォルダに PHP ファイルを置くと、WordPress が自動で読み込みます。管理画面から無効化できず、テーマを変えても動き続けるため、XML-RPC の制限のようにサイト全体の動作に関わる設定に向いています。フォルダがなければ自分で作成します。

mu-plugin のファイルは、次のように書き始めます。

<?php
/**
 * Plugin Name: サイト独自の設定
 * Description: XML-RPC の制限など、テーマに依存しない設定をまとめたもの
 */

// ここにコードを書く

構文エラーに備える

functions.php や mu-plugin に構文エラーがあると、サイトが表示されなくなったり、「重大なエラー」の画面になったりします。次の点を守ると、問題が起きても戻しやすくなります。

  • 編集前にバックアップを取る: 少なくとも編集するファイルのコピーを手元に残します。
  • 管理画面のテーマファイルエディターではなく、FTP や SFTP で編集する: エディターで保存した直後にエラーが出ると、管理画面に入れなくなることがあります。FTP などで編集していれば、ファイルを元に戻すだけで復旧できます。
  • ステージング環境で先に試す: 本番に入れる前に、コピーした環境で動作を確認します。
  • **<?php を重複させない**: functions.php の先頭にはすでに <?php があるため、追記するときはその後ろにコードだけを書きます。

以下のコード例は WordPress 本体に用意されているフックや定数を使ったものです。WordPress の更新で内部の仕組みが変わることもあるため(2026年10月現在)、導入後はページのソースや画面で効果が出ているかを確認してください。

1. 絵文字スクリプトを読み込まない

WordPress は、古いブラウザでも絵文字を表示できるように、すべてのページに絵文字用のスクリプトとスタイルを出力しています。現在の主要なブラウザは絵文字を自前で表示できるため、止めても表示に問題が出ることはほとんどありません。

// 絵文字用のスクリプトとスタイルを出力しない
add_action( 'init', function () {
    remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
    remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
    remove_action( 'wp_enqueue_scripts', 'wp_enqueue_emoji_styles' );
    remove_action( 'admin_enqueue_scripts', 'wp_enqueue_emoji_styles' );
    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' );
} );

スタイルの出力方法は WordPress のバージョンによって異なるため、新旧両方の関数を外しています。登録されていない処理を外そうとしても、エラーにはなりません。効果は、ページのソースに wp-emoji を含むスクリプトが出ていないかで確認できます。

2. 抜粋の長さと末尾の表記を変える

記事一覧に表示される抜粋の長さは、excerpt_length フィルターで変更できます。日本語の環境では、この値は単語数ではなく文字数として扱われます。

// 抜粋の長さを 80 文字にする
add_filter( 'excerpt_length', function ( $length ) {
    return 80;
}, 999 );

// 抜粋の末尾の「[…]」を「…」に変える
add_filter( 'excerpt_more', function ( $more ) {
    return '…';
} );

効かない場合は、テーマが独自の方法で抜粋を作っている可能性があります。また、投稿の編集画面で「抜粋」欄に手入力した文章は、この設定に関係なくそのまま表示されます。

3. 管理バーを管理者以外に表示しない

会員サイトなどで、ログインした一般ユーザーにはサイト上部の管理バーを見せたくない場合は、show_admin_bar フィルターを使います。

// 投稿の編集権限がないユーザーには管理バーを表示しない
add_filter( 'show_admin_bar', function ( $show ) {
    if ( ! current_user_can( 'edit_posts' ) ) {
        return false;
    }
    return $show;
} );

すべてのユーザーで非表示にするなら、add_filter( 'show_admin_bar', '__return_false' ); の1行で足ります。なお、この設定はサイトの表側の表示だけに効き、管理画面の上部バーは消えません。

4. 特定の URL を別の URL へリダイレクトする

削除したページや URL を変えたページを新しいページへ転送したい場合、件数が少なければ template_redirect アクションで対応できます。

// 404 になる旧 URL を新しい URL へ 301 リダイレクトする
add_action( 'template_redirect', function () {
    if ( ! is_404() ) {
        return;
    }

    $path = wp_parse_url( wp_unslash( $_SERVER['REQUEST_URI'] ?? '' ), PHP_URL_PATH );
    $path = untrailingslashit( (string) $path );

    $map = array(
        '/old-page'    => '/new-page/',
        '/old-service' => '/service/',
    );

    if ( isset( $map[ $path ] ) ) {
        wp_safe_redirect( home_url( $map[ $path ] ), 301 );
        exit;
    }
} );

$map の左側に旧 URL のパス(末尾のスラッシュなし)、右側に転送先を書きます。WordPress をサブディレクトリにインストールしている場合は、左側のパスにもそのディレクトリ名を含めてください。転送先の確認は、ブラウザのキャッシュが残っていると正しく見えないことがあるため、シークレットウィンドウなどで行います。

なお、投稿のスラッグを変更した場合は、WordPress が旧スラッグからの転送を自動で行う仕組みを持っているため、このコードは不要なことが多くあります。

5. OGP タグを出力する

SNS で記事が共有されたときのタイトルや画像を指定する OGP タグは、wp_head アクションで出力できます。

// 投稿と固定ページに OGP タグを出力する
add_action( 'wp_head', function () {
    if ( ! is_singular() ) {
        return;
    }

    $post        = get_queried_object();
    $title       = get_the_title( $post );
    $description = wp_trim_words( wp_strip_all_tags( get_the_excerpt( $post ) ), 100, '…' );
    $url         = get_permalink( $post );
    $image       = get_the_post_thumbnail_url( $post, 'large' );

    echo '<meta property="og:type" content="article">' . "\n";
    echo '<meta property="og:title" content="' . esc_attr( $title ) . '">' . "\n";
    echo '<meta property="og:description" content="' . esc_attr( $description ) . '">' . "\n";
    echo '<meta property="og:url" content="' . esc_url( $url ) . '">' . "\n";
    echo '<meta property="og:site_name" content="' . esc_attr( get_bloginfo( 'name' ) ) . '">' . "\n";
    if ( $image ) {
        echo '<meta property="og:image" content="' . esc_url( $image ) . '">' . "\n";
        echo '<meta name="twitter:card" content="summary_large_image">' . "\n";
    }
} );

出力する値はすべて esc_attr() や esc_url() でエスケープしています。記事のタイトルや抜粋に引用符などが含まれていても、HTML が崩れないようにするためです。SEO プラグインやテーマがすでに OGP を出力している場合はタグが二重になるため、どちらか一方を止めてください。トップページやカテゴリーページにも出力したい場合は、条件分岐を追加する必要があります。

6. XML-RPC を制限する

XML-RPC は外部のアプリから WordPress を操作するための古い仕組みで、ログイン試行の総当たり攻撃に使われることがあります。使っていない場合は、xmlrpc_enabled フィルターで認証が必要な機能を止め、xmlrpc_methods フィルターでピンバック関連の機能も外します。

// 認証が必要な XML-RPC の機能を止める
add_filter( 'xmlrpc_enabled', '__return_false' );

// ピンバック関連のメソッドも外す
add_filter( 'xmlrpc_methods', function ( $methods ) {
    unset( $methods['pingback.ping'], $methods['pingback.extensions.getPingbacks'] );
    return $methods;
} );

このコードは WordPress の中で機能を止めるもので、xmlrpc.php へのアクセス自体はサーバーに届き続けます。アクセスが多くてサーバーの負荷が気になる場合は、Web サーバーの設定で xmlrpc.php へのアクセスを拒否するほうが効果的です。Jetpack や一部のスマートフォンアプリ、外部の投稿ツールは XML-RPC を使うことがあるため、止める前に利用状況を確認してください。

7. リビジョンの保存数を制限する

投稿を保存するたびに作られるリビジョン(編集履歴)は、上限を設けないとデータベースに溜まり続けます。これは functions.php ではなく、wp-config.php に定数を書いて設定します。

// 1つの投稿につき、リビジョンを最大 5 件まで保存する
define( 'WP_POST_REVISIONS', 5 );

この行は、wp-config.php の「編集が必要なのはここまで」という趣旨のコメントより上に書きます。wp-config.php はサイト全体の設定ファイルなので、編集前にバックアップを取ってください。false を指定するとリビジョンを保存しなくなりますが、誤って上書きしたときに戻せなくなるため、少数でも残しておくことをおすすめします。投稿タイプごとに数を変えたい場合は、wp_revisions_to_keep フィルターも使えます。

プラグインを使ったほうがよい場合

コードで置き換えれば、プラグインの管理画面や余計な処理を減らせます。ただし、書いたコードの保守は自分の責任になります。次のような機能は、実績のあるプラグインに任せたほうが安全です。

  • セキュリティ対策: ログイン試行の制限やファイアウォールは、新しい攻撃手法への対応が欠かせません。開発チームが継続的に更新しているプラグインのほうが適しています。
  • キャッシュやバックアップ: 失敗したときの影響が大きく、例外的なケースへの対応も多いため、自作は手間に見合いません。
  • 多数のリダイレクト: 転送の件数が多い場合や、404 の記録を見ながら管理したい場合は、Redirection などの専用プラグインが便利です。
  • サイト全体の SEO 設定: OGP だけでなく、構造化データや XML サイトマップまで含めて管理するなら、SEO プラグインにまとめるほうが整理しやすくなります。

コードを書くこと自体に不安がある場合は、Code Snippets のように管理画面からコード片を追加・停止できるプラグインを使う方法もあります。

まとめ

  • 小さな機能は、子テーマの functions.php か mu-plugin に数行のコードを書けばプラグインなしで実装できる
  • 見た目に関わるものは子テーマ、サイト全体の動作に関わるものは mu-plugin に書くと整理しやすい
  • 編集前にバックアップを取り、FTP や SFTP で編集し、ステージング環境で試してから本番に入れる
  • 出力する値はエスケープし、SEO プラグインやテーマとの機能の重複に注意する
  • セキュリティ、キャッシュ、バックアップ、大量のリダイレクトはプラグインに任せる

お気軽にご相談ください

お見積りへ お問い合わせへ
▲