はじめに
こんにちは!「WordPress 3分間フッキング」シリーズへようこそ。このシリーズでは、WordPressのフックを活用して、プラグインを入れずに簡単なコードでサイトをカスタマイズする方法をご紹介しています。
私たちは埼玉県川越市を拠点に、WordPressサイトのカスタマイズやトラブル対応、技術サポートを行っています。地域の企業様からのご相談も大歓迎です!
今回は「the_title」フィルターを使って、投稿や固定ページのタイトル表示をカスタマイズする方法をご紹介します。たった数行のコードで、長いタイトルの自動省略や、下書き・非公開記事の視認性向上ができますよ!
タイトル表示をカスタマイズするフック
WordPressでは「the_title」というフィルターフックを使うことで、投稿タイトルの表示をカスタマイズすることができます。このフックは投稿や固定ページのタイトルが表示される前に実行され、タイトルの内容を変更する機会を与えてくれます。
今回は以下の2つのカスタマイズを実装します:
- 長すぎるタイトルを自動的に省略して「…」を表示
- 下書きや非公開投稿のタイトルに状態を示す接頭辞を追加
1. 長いタイトルを自動的に省略するフック
ブログのサイドバーやメニュー、関連記事一覧などで、長すぎるタイトルはレイアウトを崩してしまうことがあります。次のフックを使えば、指定した文字数を超えるタイトルを自動的に省略できます。
1 2 3 4 5 6 |
add_filter('the_title', function($title) { if (mb_strlen($title, 'UTF-8') > 50) { return mb_substr($title, 0, 47, 'UTF-8') . '…'; } return $title; }); |
このコードは日本語の文字化けを防ぐため、マルチバイト対応の「mb_strlen」と「mb_substr」関数を使用しています。これにより、日本語を含むタイトルでも正しく文字数をカウントし、省略できます。
2. 投稿ステータスに応じてタイトルを修飾するフック
下書き状態や非公開状態の投稿は、管理画面の一覧で見たときに、一目でそれとわかるとより便利です。次のフックを使えば、管理者が閲覧しているときのみ、投稿ステータスに応じてタイトルの先頭に「【下書き】」や「【非公開】」を追加できます。
1 2 3 4 5 6 7 8 9 10 11 |
add_filter('the_title', function($title, $id) { $post = get_post($id); if (current_user_can('edit_posts')) { if ($post->post_status === 'draft') { return '【下書き】' . $title; } elseif ($post->post_status === 'private') { return '【非公開】' . $title; } } return $title; }, 10, 2); |
このフックでは引数が2つ必要なため、関数定義の末尾に「10, 2」を指定しています。これを忘れると投稿IDが取得できず、正しく動作しません。
実装手順
フック処理を実装する際には、主に2つの方法があります。1つは名前付きの関数を定義してフック名と関数名を指定する方法、もう1つは今回一部のコードで使用している「無名関数」(クロージャ)を使う方法です。
無名関数とは、名前を持たない関数のことで、function() { ... }
という形で直接定義します。コードをより簡潔にでき、その場限りの処理に適しています。一方、名前付き関数は再利用性が高く、別の場所からも呼び出せるメリットがあります。
以下は名前付き関数を使った同等の実装例です:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 名前付き関数を使った実装例 function wp3min_limit_title_length($title) { if (mb_strlen($title, 'UTF-8') > 50) { return mb_substr($title, 0, 47, 'UTF-8') . '…'; } return $title; } add_filter('the_title', 'wp3min_limit_title_length'); function wp3min_add_status_prefix($title, $id) { $post = get_post($id); if (current_user_can('edit_posts')) { if ($post->post_status === 'draft') { return '【下書き】' . $title; } elseif ($post->post_status === 'private') { return '【非公開】' . $title; } } return $title; } add_filter('the_title', 'wp3min_add_status_prefix', 10, 2); |
初心者の方は、このように関数に名前を付ける方法の方がわかりやすいかもしれません。大規模なテーマやプラグイン開発では、名前の衝突を避けるために名前付き関数が推奨されています。
functions.phpへの追加方法
では実際に、これらのフックをWordPressサイトに実装する手順を見ていきましょう。
functions.phpへの追加方法
これらのコードは、使用しているテーマの「functions.php」ファイルに追加します。
- WordPressの管理画面から「外観」→「テーマエディター」を開きます
- 右側のファイル一覧から「functions.php」を選択します
- ファイルの最後に以下のコードを追加します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/** * タイトル表示をカスタマイズする */ // 1. 長いタイトルを自動的に省略する add_filter('the_title', function($title) { if (mb_strlen($title, 'UTF-8') > 50) { return mb_substr($title, 0, 47, 'UTF-8') . '…'; } return $title; }); // 2. 投稿ステータスに応じてタイトルを修飾する add_filter('the_title', function($title, $id) { $post = get_post($id); if (current_user_can('edit_posts')) { if ($post->post_status === 'draft') { return '【下書き】' . $title; } elseif ($post->post_status === 'private') { return '【非公開】' . $title; } } return $title; }, 10, 2); |
子テーマを使用している場合は、親テーマではなく子テーマの functions.php に追加してください。もし子テーマを使っていない場合は、テーマのアップデートで上書きされないよう、子テーマを作成することをおすすめします。
動作確認
コードを追加したら、以下の点を確認しましょう:
- 長いタイトルの記事を表示し、タイトルが省略されるかチェック
- 下書き状態の記事を管理画面で表示し、「【下書き】」が付くかチェック
- 非公開状態の記事を管理画面で表示し、「【非公開】」が付くかチェック
- 一般ユーザーとしてログアウトし、ステータス表記が表示されないかチェック
確認項目 | 管理者表示 | 一般ユーザー表示 | 備考 |
---|---|---|---|
長いタイトル | 47文字+「…」 | 47文字+「…」 | どのユーザーでも省略される |
下書き投稿 | 「【下書き】」+タイトル | 表示されない | 下書きは一般には非表示 |
非公開投稿 | 「【非公開】」+タイトル | 表示されない | 非公開は一般には非表示 |
実用例とカスタマイズポイント
これらのフックは、さまざまな方法でカスタマイズできます。よくあるカスタマイズ例をいくつかご紹介します。
文字数制限の変更
サイトのデザインに合わせて、省略する文字数を調整できます。例えば、サイドバー用に20文字に制限する場合:
1 2 3 4 5 6 7 |
add_filter('the_title', function($title) { // サイドバー表示の場合のみ制限(is_active_widget などで判定) if (/* サイドバー表示の条件 */ && mb_strlen($title, 'UTF-8') > 20) { return mb_substr($title, 0, 17, 'UTF-8') . '…'; } return $title; }); |
特定の投稿タイプにのみ適用
例えば、「product」という投稿タイプにのみステータス表示を適用したい場合:
1 2 3 4 5 6 7 8 9 10 11 12 |
add_filter('the_title', function($title, $id) { $post = get_post($id); // 特定の投稿タイプの場合のみ処理 if ($post && $post->post_type === 'product' && current_user_can('edit_posts')) { if ($post->post_status === 'draft') { return '【下書き】' . $title; } elseif ($post->post_status === 'private') { return '【非公開】' . $title; } } return $title; }, 10, 2); |
投稿タイプによって異なる処理を行う場合は、必ず $post オブジェクトが取得できているかをチェックしてください。一部のコンテキストでは $id から正しく投稿情報を取得できないことがあります。
他の投稿ステータスの対応
WordPressには、他にも「pending」(レビュー待ち)、「future」(予約投稿)などのステータスがあります。これらにも対応させることで、より高機能なステータス表示が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
add_filter('the_title', function($title, $id) { $post = get_post($id); if (current_user_can('edit_posts') && $post) { switch ($post->post_status) { case 'draft': return '【下書き】' . $title; case 'pending': return '【レビュー待ち】' . $title; case 'future': return '【予約投稿】' . $title; case 'private': return '【非公開】' . $title; } } return $title; }, 10, 2); |
switchを使うことで、多数の条件分岐を扱いやすく整理できます。将来的にステータス種類が増えた場合も、柔軟に対応できるコード構造です。
まとめ
「the_title」フィルターを使うことで、WordPressの投稿タイトル表示を様々な方法でカスタマイズできることがわかりました。
今回学んだポイント:
- 長すぎるタイトルを自動的に省略して「…」を表示する方法
- 投稿ステータス(下書き・非公開)に応じてタイトルに接頭辞を追加する方法
- フィルターフックで引数を複数受け取る際の「10, 2」の意味
「the_title」フィルターのような小さなカスタマイズでも、サイトの使い勝手やデザインを大きく向上させることができます。ぜひご自身のWordPressサイトに取り入れてみてください!
WordPressのフックシステムを理解すると、プラグインに頼らずとも自分の手でさまざまなカスタマイズができるようになります。このシリーズを通じて、もっとWordPressをコントロールできるようになりましょう!
埼玉県川越市を拠点に活動する私たちは、WordPressのカスタマイズから保守管理まで幅広くサポートしています。小さなカスタマイズでもお気軽にご相談ください。
よくある質問(FAQ)
Q: このフックはどこで動作しますか?
A: 「the_title」フィルターはWordPressがタイトルを表示するほぼすべての場所で動作します。投稿一覧、個別記事、ウィジェット、メニュー、管理画面などです。
Q: 文字数制限が特定の場所だけで動作するようにできますか?
A: はい、条件分岐を追加することで可能です。例えば「is_home()」や「is_archive()」などの条件関数と組み合わせることで、特定のページでのみ文字数を制限できます。
Q: フィルターの優先順位「10」は変更した方がいいですか?
A: 通常は「10」のままで問題ありませんが、他のプラグインとの競合がある場合は数字を小さくすると先に実行され、大きくすると後に実行されます。例えば「5」にすると他のフックより先に、「20」にすると後に実行されます。
Q: ステータス表示は管理者のみではなく編集者にも表示したいです
A: 「current_user_can()」の条件を調整してください。例えば「current_user_can(‘edit_others_posts’)」とすると、他のユーザーの投稿を編集できる権限を持つユーザー(編集者以上)に表示されます。
Q: 省略記号「…」を別の文字に変更できますか?
A: はい、コードの「…」の部分を好きな文字列に変更できます。例えば「…続きを読む」などに変更可能です。
WordPressカスタマイズやプラグイン開発でお困りごとがありましたら、埼玉県川越市にある私たちにお気軽にご相談ください:WordPressカスタマイズ・プラグイン開発サービス