先日Twenty Tenの小テーマを制作していて、困ったことがありました。
それは『続きを読む』部分についてです。
この部分については、WordPress関数『the_excerpt』なので、フィルターフック『excerpt_more』を使ってカスタマイズしよう、と思ったら上手くいきませんでした。
というわけで、その原因などを書いてみたいと思います。
症状
どういったことをしようかと思っていたかというと、『続きを読む』の<a>タグにclassを追加しようとしてました。
そこで以下のようなコード。
function add_anchor($more){
return '<a href="'. esc_url( get_permalink() ) . '" class="test-class">続きを読む</a>';
}
add_filter('excerpt_more', 'add_anchor');
これでうまくいくはず・・・と思いましたが、変化無しでした。
原因
ここで原因が判らず、結構ハマったのですが、ようやく原因特定。
それは、Twenty Tenのfunctions.phpの以下の部分でした。
function twentyten_auto_excerpt_more( $more ) {
return ' …' . twentyten_continue_reading_link();
}
add_filter( 'excerpt_more', 'twentyten_auto_excerpt_more' );
つまり、Twenty Tenでもexcerpt_moreにフックしていたことでした。
解決方法
上記のコードから、twentyten_continue_reading_link()を確認。以下のようなコードです。
if ( ! function_exists( 'twentyten_continue_reading_link' ) ) :
/**
* Returns a "Continue Reading" link for excerpts
*
* @since Twenty Ten 1.0
* @return string "Continue Reading" link
*/
function twentyten_continue_reading_link() {
return ' <a href="'. get_permalink() . '">' . __( 'Continue reading <span class="meta-nav">→</span>', 'twentyten' ) . '</a>';
}
endif;
というわけで、制作していた小テーマのfunctions.phpで、以下のようにtwentyten_continue_reading_link()を自分で作ることで解決しました。
function twentyten_continue_reading_link() {
return '<a href="'. esc_url( get_permalink() ) . '" class="test-class">続きを読む</a>';
}
親テーマと小テーマのfunctions.phpの関係は、1)先に小テーマのfunctions.phpを呼び出し、2)次に親テーマのfunctions.phpを呼び出す、という順序です。なので、以上で解決出来ました。
他のフック
他にもいくつか関連のフックがありますね。注意が必要です。
『get_the_excerpt』にもフックされてます。
function twentyten_custom_excerpt_more( $output ) {
if ( has_excerpt() && ! is_attachment() ) {
$output .= twentyten_continue_reading_link();
}
return $output;
}
add_filter( 'get_the_excerpt', 'twentyten_custom_excerpt_more' );
また、the_excerptで出力される文字列についても同様にフックされています。
function twentyten_excerpt_length( $length ) {
return 40;
}
add_filter( 'excerpt_length', 'twentyten_excerpt_length' );
ただ日本語の場合には、これでは対応出来ません。
以前にも『日本語で『the_excerpt』の文字数を変える方法2パターン』で書きましたが、プラグイン『WP Multibyte Patch』を有効にした状態で、フィルターフック『excerpt_mblength』を使います。
まとめ
今回は、実際には小テーマ制作の際にハマった部分ですが、Twenty Tenを直接カスタマイズする場合にももちろん使えますね。
あと、別なテーマのカスタマイズや小テーマ制作の際にも注意すべき点でもあります。