記事一覧(アーカイブ)に並ぶ抜粋文が、途中で不格好に切れていたり、英語サイトのように単語数で区切られて日本語だと長すぎたり——そんな違和感を覚えたことはありませんか? WordPress標準の抜粋機能は「単語数」を基準にしているため、スペースで単語を区切らない日本語とは相性がよくありません。
Apuraテーマには、こうした日本語の抜粋表示を整えるためのヘルパー関数とフィルターが用意されています。この記事では、まず標準の抜粋設定をおさらいし、そのうえでApura独自の「文字数ベース」で本文を切り出す方法を、functions.php や子テーマにそのまま貼り付けられるコード例とともに紹介します。
抜粋(excerpt)と「続きを読む」の基本
WordPressの「抜粋」とは、記事一覧や検索結果などで表示される本文の要約のことです。投稿編集画面の「抜粋」欄に文章を入力すれば、それがそのまま使われます。空欄の場合は、本文の先頭から自動的に抜き出されたテキスト(自動抜粋)が表示されます。
この自動抜粋には、WordPress標準で2つの調整ポイントがあります。1つは抜粋の長さを決める excerpt_length フィルター、もう1つは末尾に付く記号を決める excerpt_more フィルターです。Apuraは、このうち excerpt_more をあらかじめ調整しており、標準の「[…]」ではなく三点リーダー(…)を表示するようにしています。
| フィルター | 役割 | Apuraでの状態 |
|---|---|---|
| excerpt_length | 自動抜粋の長さ(単語数) | WordPress標準(55語)のまま |
| excerpt_more | 抜粋末尾に付く文字列 | …(三点リーダー)に変更済み |
つまり、Apuraを有効化した時点で末尾は三点リーダーになっています。まずはこの標準の挙動を、必要に応じて微調整するところから始めましょう。
標準の抜粋を微調整する(excerpt_length / excerpt_more)
末尾の記号を変える
三点リーダーではなく「(続きを読む)」のようなテキストにしたい場合は、excerpt_more フィルターを上書きします。Apura標準の設定よりあとに実行されるよう、優先度を高め(大きい数値)に指定するのがポイントです。
<?php
/**
* 自動抜粋の末尾に「続きを読む」リンクを表示する。
*/
function my_custom_excerpt_more( $more ) {
return sprintf(
' … <a class="more-link" href="%1$s">%2$s</a>',
esc_url( get_permalink() ),
esc_html__( '続きを読む', 'apura-child' )
);
}
add_filter( 'excerpt_more', 'my_custom_excerpt_more', 20 );
URLは esc_url()、表示テキストは esc_html__() でエスケープし、リンク先には get_permalink() でその投稿のパーマリンクを渡しています。これで、抜粋の最後にクリックできる「続きを読む」リンクが付きます。
抜粋の長さ(単語数)を変える
自動抜粋の長さは excerpt_length フィルターで変更できます。返す数値は「単語数」です。
<?php
/**
* 自動抜粋の長さ(単語数)を変更する。
*/
function my_custom_excerpt_length( $length ) {
return 40; // 標準は 55。
}
add_filter( 'excerpt_length', 'my_custom_excerpt_length', 20 );
日本語向け:文字数で本文を切り出す content_limit ヘルパー
Apuraには、本文を「文字数」で切り出すためのテンプレートタグ(ヘルパー関数)が用意されています。日本語のように1文字ずつ数えたいケースにぴったりで、テンプレート内から直接呼び出して使います。代表的な関数は次の3つです。
| 関数 | 動作 | 戻り値 |
|---|---|---|
| apura_the_content_limit( $max, $tag ) | 現在の投稿本文を指定文字数で切り出して出力 | なし(echo) |
| apura_get_the_content_limit( $max, $tag ) | 同上だが、出力せず文字列を返す | エスケープ済みHTML文字列 |
| apura_get_truncated_text( $text, $max, $ellipsis ) | 任意のテキストを指定文字数で切り詰める | 切り詰めたプレーンテキスト |
テンプレートで本文を文字数制限して表示する
ループの中で apura_the_content_limit() を呼ぶと、現在の投稿本文を指定した文字数で切り出して出力できます。第1引数が最大文字数、第2引数が囲むHTMLタグです。
<?php
// 本文を120文字で切り出し、<p>タグで囲んで出力する。
if ( function_exists( 'apura_the_content_limit' ) ) {
apura_the_content_limit( 120, 'p' );
}
出力された文字列を加工してから使いたい場合は、出力せずに値を返す apura_get_the_content_limit() を使います。第2引数に空文字('')を渡すと、タグで囲まずにテキストだけを取得できます。
<?php
// タグで囲まず、本文を80文字で切り出して変数に受け取る。
$summary = '';
if ( function_exists( 'apura_get_the_content_limit' ) ) {
$summary = apura_get_the_content_limit( 80, '' );
}
// $summary はエスケープ済み。そのまま echo して安全に出力できる。
echo $summary;
任意のテキストを切り詰める
本文に限らず、カスタムフィールドの値などを文字数で切り詰めたいときは apura_get_truncated_text() が便利です。第1引数のテキストを、第2引数の文字数で切り詰め、第3引数の記号を末尾に付けて返します。
<?php
$raw = get_post_meta( get_the_ID(), 'lead_text', true );
$text = '';
if ( function_exists( 'apura_get_truncated_text' ) ) {
// 60文字で切り詰め、末尾に「…」を付ける。
$text = apura_get_truncated_text( $raw, 60, '…' );
}
echo esc_html( $text );
apura_get_truncated_text() はタグを除去したプレーンテキストを返すため、出力時に esc_html() でエスケープしておくと安心です。
フィルターで切り出しの挙動を細かく調整する
apura_get_the_content_limit() は、内部の各ステップにフィルターを用意しています。テンプレートを書き換えずに、末尾の記号や許可するタグ、最終的な出力をまとめて調整できます。
| フィルター | 用途 | 初期値 |
|---|---|---|
| apura_get_the_content_limit_more | 切り出した本文の末尾に付く記号 | ... |
| apura_get_the_content_limit_allowedtags | 除去せず残すHTMLタグの指定 | <script>,<style> |
| apura_get_the_content_limit | 最終的に返すHTML全体 | 組み立て済みの出力 |
たとえば、切り出した本文の末尾を三点リーダーに変えたい場合は、次のように apura_get_the_content_limit_more フィルターを使います。
<?php
/**
* content_limit の末尾記号を三点リーダーに変更する。
*/
function my_content_limit_more( $more ) {
return '…';
}
add_filter( 'apura_get_the_content_limit_more', 'my_content_limit_more' );
どの方法を選ぶ?使い分けの早見表
ここまで紹介した方法を、目的別に整理しました。多くの日本語サイトでは、文字数ベースの content_limit 系がもっとも扱いやすい選択肢です。
| やりたいこと | おすすめの方法 |
|---|---|
| 標準の自動抜粋の末尾だけ変えたい | excerpt_more フィルター |
| 日本語の本文を文字数で切りたい | apura_the_content_limit() / apura_get_the_content_limit() |
| カスタムフィールド等の文字列を切りたい | apura_get_truncated_text() |
| 切り出しの末尾記号・許可タグを調整したい | apura_get_the_content_limit_* フィルター |
まとめ:日本語サイトは「文字数ベース」で整える
WordPress標準の抜粋は単語数ベースのため、日本語サイトでは長さの調整が難しいのが弱点でした。Apuraは末尾記号を三点リーダーに整えるだけでなく、apura_the_content_limit() をはじめとする文字数ベースのヘルパー関数を備えており、日本語の記事一覧をきれいに見せられます。
- 末尾だけ変えるなら
excerpt_moreフィルターで手軽に。 - 日本語の本文は
apura_the_content_limit()で文字数指定。 - 末尾記号や許可タグは
apura_get_the_content_limit_*フィルターで微調整。
カスタムテンプレートを作るときは 必ず function_exists() で存在確認してから関数を呼び出し、安全でアップデートに強いカスタマイズを心がけましょう。