抜粋の[…]や「続きを読む」をfunctions.phpで変更する方法【WordPress】
アーカイブページなどで使用する事も多い抜粋表示。私も、いちいち投稿にmoreタグなんて入れてられないので、アーカイブページは抜粋オンリーです。でも、抜粋表示の最後って、「続きを読む」だったり「…」だったり、「Read more…」だったりとテーマやWordPressのバージョンによっても様々です。日本語⇔英語を変更したい…とか、「…」の位置がイメージと違う…なんて、ちょこっと変更したい場合も多いですよね。
という事で、今回はアーカイブページなどで使う抜粋表示の末尾テキストをカスタマイズする方法です。
~ 目次 ~
「全文」と「抜粋」の末尾テキストの仕組みは全く違う
最近のWordPressのテーマは、カスタマイザーでアーカイブページの全文 or 抜粋表示を切り替えられるものが主流ではないかと思います。こういったテーマの内部では、設定が全文ならthe_content、抜粋ならthe_excerptで出力するように切り替えています。
今回、変更するのは抜粋(the_excerpt)で出力している場合の末尾テキストです。投稿ごとにmoreタグを挿入し、全文から抜粋表示させているケースではありません。似たような印象ですが、こちらは仕組みが全く違います。
the_excerptの仕組み
どうでもいいかもしれませんが、一応…。the_excerptの出力内容は、大まかに以下のように整形されています。
- wp_trim_excerpt関数でコンテンツからデフォルトの長さに抜粋※1されて、デフォルトの末尾テキスト[…]※2が付く
※1. excerpt_lengthフィルターで変更している場合は、単語数を変更
※2. excerpt_moreフィルターで変更している場合は、末尾テキストを変更 - get_the_excerptで整形された内容が取得される
- the_excerptで出力
抜粋の末尾に[…]が表示されている場合
抜粋の末尾にリンクも何も無い[…]が表示されていて、他に余計な文字が無い場合は、シンプルにこれを書き換えればOKです。
excerpt_moreフィルターフックは末尾テキストを置き換える為のフックです。下のコードをコピーして使用中のテーマのfunctions.phpに貼り付けてみましょう。
1 2 3 4 5 |
function new_excerpt_more($more){ global $post; return '...<a href="'. get_permalink($post->ID) . '">続きを読む</a>'; } add_filter('excerpt_more','new_excerpt_more',9999); |
上のコードをそのまま貼り付けると、末尾テキストが「…続きを読む」となり、「続きを読む」の部分だけ個別記事へのリンクになります。テキストを好きなように書き換えればカスタマイズ完了です。まだ記事は途中ですが、もう読む必要はありません。
抜粋の末尾が[…]以外の場合
WordPressの抜粋の末尾テキストは初期の状態で[…]です。他の文字が表示されていたり、記事ページへのリンクが貼られていたりしたら、テーマ独自の変更がされています。この場合も多くはexcerpt_moreで置換できます。下のコードをコピーして、使用中のテーマのfunctions.phpに貼り付けてみて下さい。
1 2 3 4 5 |
function new_excerpt_more($more){ global $post; return '...<a href="'. get_permalink($post->ID) . '">続きを読む</a>'; } add_filter('excerpt_more','new_excerpt_more',9999); |
「…続きを読む」に書き換わった
上のコードで、抜粋の末尾テキストが「…続きを読む」に書き換わって、もう余計な文字が表示されていない場合は、書き換え自体はこれでOKです。テキスト部分を好きなように書き換えて下さい。
※細かい事を言うと、上のコードは「上書き」をしています。本来は、不要になった「テーマによる書き換え」を消すべきですが、面倒な場合は消さなくても問題ないと思います。「いんや!消しておこう!」という場合は、excerpt_moreにフックされている不要になった関数を削除しましょう。次節も読んでください。
まったく変化がない
コードの記述ミスが無い事が前提ですが、まったく変化が無い場合は、他のフックを使って抜粋テキスト全体が変更されている事が考えられます。これを特定して削除する必要があります。
書き換わったが余計な文字がある
「…続きを読む【元々あったテキスト】」のように、元々表示されていたテキストが消えない場合があります。この場合は、別のフックで末尾テキストが追加されている事が考えられます。これを特定して、削除してやる必要があります。
抜粋を変更している関数を探す
抜粋の変更にあたって不要になった、あるいは邪魔な関数を探してみましょう。
抜粋の変更に使えるフィルターフック
ほとんどの場合、抜粋の末尾テキストはexcerpt_moreフックで変更されますが、抜粋の書き換えに使えるフックは、実行される順に主に下の4つがあります。事実上、excerpt_more以外の3つを使っても書き換えが出来ます。
- excerpt_more(抜粋が作られる途中)
- wp_trim_excerpt(抜粋が出来上がる時)
- get_the_excerpt(抜粋を取得する時)
- the_excerpt(抜粋を出力する時)
上の4つのフックは、カッコ内のタイミングで実行されます。
前の節のコードで、excerpt_moreフックを使って末尾テキストを書き換えました。しかし余計なテキストが残ってしまったり変化が無いという場合は、それより後に動く2.3.4のフックでさらに変更されているという事になります。
それぞれのフィルターフックに追加された関数を調べる
「フックされている関数なんかわかんないよ…」という場合は、以前にテスト用のページを作ってフックされている関数の一覧を表示する方法を書いた事があります。カンタンですし使い回しも利くので、よろしければどうぞ。
⇒ワードプレスで指定のフックにフックされた関数を手軽に調べる方法
探す時のコツ
「テーマ名_excerpt_more」のような関数名が良く使われます。
また、その他のフックでも、書き換え系の関数は、実行順序が一番最後になるように、priorityに大きな数が指定されている場合が多いので、その辺を目印に探してみましょう。
テーマ独自の関数をフックから削除
では、見つかった不要な関数をフックから削除しましょう。
このブログで使用している親テーマ(DiBlog)では、excerpt_moreフィルターフックにdi_blog_excerpt_moreという関数がpriority:1001でフックされていました。
以下は、これをremove_filterで削除する場合のコードです。実際に使う場合は「excerpt_more」をフック名、「di_blog_excerpt_more」を消したい関数名、「1001」をその関数のフックにおけるpriorityに変更します。
親テーマのfunctions.phpに記述する場合
親テーマの場合、単純に以下のように記述します。
1 |
remove_filter( 'excerpt_more', 'di_blog_excerpt_more',1001 ); |
子テーマのfunctions.phpに記述する場合
WordPressでは、親テーマのfunctions.phpより、子テーマのfunctions.phpの方が先に読み込まれます。ですから、単純にremove_filterを書いても、まだ消す対象が無いため削除できません。子テーマのfunctions.phpに記述する場合は、下の様にafter_setup_themeアクションフックで、親テーマの読み込みが終わったタイミングで削除するようにしましょう。
1 2 3 4 |
function child_theme_setup() { remove_filter( 'excerpt_more', 'di_blog_excerpt_more',1001 ); } add_action( 'after_setup_theme', 'child_theme_setup' ); |
ちなみに、remove_filterの第3引数は優先順位(priority)です。これも正確に記述しないとremove_filterできません。
このブログのテーマの場合は、抜粋の編集に使われていたのはこの関数だけでした。必要に応じて邪魔になる関数を削除しましょう。
最後に
どうでしょうか?ちゃんと希望通りの抜粋末尾テキストが表示されるようになりましたか?
excerpt_moreの書き換えを上書きしている関数を正確に削除できれば、「…続きを読む」が表示されるはずです。あとはコード内のテキストを自由に書き換えてカスタマイズ完了です。
慣れない方は、邪魔をしている関数を見つけるのが少々大変かもしれませんが、そこさえクリアすれば思い通りに抜粋の末尾テキストをカスタマイズできます。
参考サイト
「続きを読む」のカスタマイズ – WordPress Codex 日本語版