WordPress 5.x で投稿の抜粋が表示されない不具合の改善方法

WordPress 5.0 から導入されたブロックエディタで投稿を作成した際、投稿内容から自動生成される抜粋 (the_excerpt) が表示されない不具合に遭遇したので、その原因と改善方法を紹介します。

投稿の抜粋は「the_excerptテンプレートタグ」を使用して出力しますが、その内部で使用されている「get_the_excerptテンプレートタグ」で抜粋が取得できない場合にも有効な改善方法です。

抜粋が表示されない不具合の発生状況

全てのブロックを「グループブロック (wp-block-group)」でグループ化すると、抜粋が表示されなくなりました。

WordPressのブロックエディタで入れ子にしたグループブロック

「グループブロック」を、HTML5のsection要素のように、見出し毎にグループ化するような使い方をしている場合は要注意です。

抜粋が表示されない原因

投稿の抜粋を出力するには、前述したように「the_excerptテンプレートタグ」を使用しますが、その内部では「get_the_excerptテンプレートタグ」によって抜粋が取得されます。

「get_the_excerptテンプレートタグ」の内部では「get_the_excerptフィルターフック」によって「wp_trim_excerpt関数」が実行されます。

この「wp_trim_excerpt関数」が投稿内容から抜粋を生成している部分になります。

その内部で使用されている「excerpt_remove_blocks関数」によって、抜粋に使用しないブロックを除外しているのですが、現時点の最新版である WordPress 5.5 では、入れ子になったブロックに対する処理が「カラムブロック (wp-block-columns)」しか行われておらず、「グループブロック」に対する処理が抜け落ちている様です。

「グループブロック」に限らず、オリジナルのWordPressテーマやWordPressプラグインによって追加されたブロックなども除去されてしまう可能性があります。

抜粋を表示させるための改善方法

1. excerpt_allowed_blocksフィルターフックを使用する

「excerpt_remove_blocks関数」には「excerpt_allowed_blocksフィルターフック」という抜粋に使用するブロックを変更するためのフィルターフックが用意されています。

add_filter( 'excerpt_allowed_blocks', function( $allowed_blocks ) {
  if( !in_array( 'core/group', $allowed_blocks, true ) ) {
    $allowed_blocks[] = 'core/group';
  }
  return $allowed_blocks;
} );

上記のようなコードをWordPressテーマのfunctions.phpに追加すれば除外されていたブロックが除外されなくなります。

しかし、前述したように「グループブロック」に対する処理が抜け落ちているため、この方法では「グループブロック」は除外されませんでした。

また、独自にブロックを作った場合には、その都度、同様の設定をして除外されないようにするなどの手間もかかるため、この方法はオススメできません。

2. wp_trim_excerpt関数を元にした自作フィルターを適用する

「the_excerptテンプレートタグ」で抜粋を出力する際に、抜粋が空だった場合の処理を追加する方法です。

add_filter( 'the_excerpt', function( $post_excerpt ) {
  if( empty( $post_excerpt ) ) {
    $post = get_post();
    $text = get_the_content( '', false, $post );
    if( !empty( $text ) ) {
      $text = strip_shortcodes( $text );
      $text = apply_filters( 'the_content', $text );
      $text = str_replace( ']]>', ']]>', $text );
      $excerpt_length = (int) apply_filters( 'excerpt_length', 55 );
      $excerpt_more = apply_filters( 'excerpt_more', ' […]' );
      $text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
      $post_excerpt = $text;
    }
  }
  return $post_excerpt;
}, 9 );

上記のようなコードをWordPressテーマのfunctions.phpに追加すれば、すべてのブロックを除外しないで抜粋を生成するようになります。

WordPress 5.0 から登場したブロックエディタは、バージョンアップによって、かなり洗練されてきましたね。従来のエディタからブロックエディタに切り替える人も多くなっているようです。

ただ、WordPressは利用者側から見れば、どんどん便利になっていきますが、制作者側から見ると、どんどん負担が増えてきているように感じるのは気のせいでしょうか?

WordPressがMovable Typeの二の舞にならなければいいのですが。

関連記事