WordPressで多言語対応サイトを制作中、英語ページで本文を抜粋していた箇所が全文表示されてしまうというケースに遭遇しました。
このページではその原因と対処法についてメモ代わりにまとめておきたいと思います。
多言語対応サイトの英語ページで本文抜粋が効かないときの対処方法
WordPress多言語対応サイトの英語ページでwp_trim_words()を使うと全文表示されてしまう
原因はプラグイン「WP Multibyte Patch」とwp_trim_words()関数の併用でした。
wp_trim_words()関数はテキストの先頭から指定した単語数(上記では40単語)を抜粋するもので、今回はこれを使い以下のような形で本文の冒頭40単語を抜粋するようにしていました。
<?php echo wp_trim_words(get_the_content(), 40, '…'); ?>
しかし日本語では語句の間を半角スペースで区切らないため、単語のカウントがうまくいかず、(ほぼ)全文表示されてしまうというケースがあるようです。
それを回避するために、日本語サイトで「WP Multibyte Patch」というプラグインが使われている場合には、wp_trim_words()関数は単語数に関係なく冒頭110文字(初期値)を抜粋するようになります。
今回の場合は「WP Multibyte Patch」を使った上で英語ページを作成したため、単語数による抜粋がうまくいかなくなってしまったようでした。
mb_substr()関数を使って本文を抜粋する
wp_trim_words()関数の代わりにmb_substr()関数を試してみたところ、無事に抜粋することができました。
<?php echo mb_substr(get_the_content(), 0, 40, 'UTF-8').'…'; ?>
なお今回は40文字以上であれば末尾に「…」を付け、それ以下なら「…」を付けず出力したかったので、以下のようにしてみました。
<?php
if( mb_strlen( get_the_content() ) > 40 ): //本文が40文字以上の場合、末尾に「…」を付けて抜粋
$excerpt = mb_substr( get_the_content(), 0, 40, 'UTF-8' );
echo $excerpt.'…';
else: //本文が40文字以内ならそのまま表示
echo get_the_content();
endif;
?>
まとめ
以上、多言語対応サイトの英語ページで本文抜粋(wp_trim_words)が効かないときの対処方法でした。
日本語などマルチバイト文字の言語を含む多言語対応サイトではよくあるケースだと思うので、抜粋文を出力する際には気をつけた方がよさそうです。