the_excerpt()の表示処理

category.phpなどで表示される記事抜粋用の関数the_excerpt()。
この関数を使って抜粋される文字数の変更やリンク文字列などの表示を変えたい場合、子テーマのfunction.phpに関数を記述しオーバーライド(上書き処理)しないといけません。

「the_excerpt()を変更する関数を追加したのに処理してくれない!」そんなときの処理を紹介します。

そもそもなぜ利かなかったのか

結論、利用している親テーマで、get_the_excerpt()の変更処理がかかっていたのが原因でした。(最初に確認しておけば良かったのですが。。)

子テーマに書かれた関数が優先するハズなのに、なぜ利かないのだろうと四苦八苦したので今回の記事を書くに至りましたw

とりあえず謎コードに悩まされる

親テーマに書かれていた関数は下記のようなものでした。

function XXXX($hoge){
  $text = substr($hoge, 0 , -10);
  return $text.'..~~省略~~;
}
add_filter(get_the_excerpt, XXXX);

まず、なぜsubstr()に疑問を持ちました。

多くの場合(日本語サイトの場合、WP multibyte pathのプラグインを入れた状態で)excerpt_lengthやexcerpt_mblengthを使った制御をさせますが、この親テーマにはsubstr()を使って微妙な処理をしています。意図が読めず謎です。。

さて、そもそも表示上何が問題だったのかというと、抜粋された記事の末尾に表示される省略部分で文字化けが起きていたのです。
とりあえず、ローカル環境でsubstrを削除しreturnの変数を書き換えたら文字化けは解消されました。やはりこいつが文末文字化けの原因。

そこで、親テーマfunctionを元に戻しプライオリティ付きでremove_filterを試すもなぜかダメでした。…なぜ?まだまだ勉強が必要ですね。。

指定したのはthe_excerpt()なハズなのに

不明点がもう1つ。僕が指定したのはthe_excerpt()です。確かに親テーマにはget_the_excerpt()の指定がされていましたが、phpファイルにはthe_excerpt()としっかり記述されています。

Codexで調べてみる

Codexには下記が書かれておりました。

このテンプレートタグ the_excerpt() は、現在の投稿の抜粋を、文末に […](角括弧+三点リーダー)をつけて表示します。この三点リーダーは「続きを読む」リンクではありません。抜粋を直接表示するために使われますが、get_the_excerpt() から返された文字列に開始と終了の <p> タグを追加します。

引用元:Codex

答えは単純でした。
処理上、get_the_excerptで内容を取得して、pタグだけ付けてthe_excerptで吐き出す形なのでthe_excerptに処理を追加しても意味がなかったのです。

改めてget_the_excerptに処理

ここが一番の謎。
上記にも書いてありますが、remove_filterを行っても全く効きませんでした。…というよりも、そもそも抜粋文字列が全て消え、”…”このドットだけが表示されてしまいます。

最終的な解決方法

色々調べた結果、下記で解決することが分かりました。

add_action('init', function(){
remove_filter('get_the_excerpt', 'XXXX');
});

remove_filterをinitでadd_actionするんですね。

事後調査

アクションフック

add_action()は、ページを表示する過程で処理を差し込むためのフックで、何も指定しなかった場合の優先順位はデフォルトで「10」。

フィルターフック

add_filter()は、既存の処理の”結果”を変更するためのフック。

アクションとフィルターの実行順序

調査していくと下記順序で処理されているようでした。

1,do_action
2,add_action
3,apply_filters
4,add_filter

また、今回利用したinitアクションは初期化フック。
このタイミングでremove_filterを追加する形にすれば効いてくれるんですね。

Similar Posts