wordpress the_excerpt() で表示される &nbsp

2014年7月3日

エディタのビジュアルモードで投稿を作成する(ブログを書く)際、改行する時に「Enterキー」を押すと「 」が挿入されてしまう。

この挿入された「 」が、抜粋の文字数の指定した位置(デフォルトの110文字か、excerpt_mblength で設定した文字数)あたりにあると「&nbsp」や「&nbs」、「&nb」、「&n」という文字が抜粋の最後に表示されてしまうことがある。

それらの「&nbsp」や「&nbs」、「&nb」、「&n」という文字を表示させないようにする方法のメモ。

目次

「&nbsp」などが表示される例

ループ内で以下のように抜粋を表示しているとこのような現象が起こることがある。

<?php
$my_excerpt = apply_filters('the_excerpt', get_the_excerpt());
echo '<p>' .$my_excerpt . '</p>';
?>

または、単純に以下のようにしている場合でも同じ。

<?php the_excerpt(); ?>

解決方法

参考ページ:WordPress フォーラム

不要な「&nbsp」や「&nbs」、「&nb」、「&n」という文字を表示させないようにするには以下のように記述して抜粋を表示する。

<?php
$p = get_post(get_the_ID());
$content = strip_shortcodes( $p->post_content );
echo '<p>' .wp_html_excerpt($content, 160, '...'). '</p>'; 
?>
  • get_post() で投稿オブジェクトを取得して、変数 $p に格納。
  • パラメータの投稿の ID は get_the_ID() で取得。
  • コンテンツ($p->post_content)にはショートコードも入っている可能性があるので strip_shortcodes() を使ってコンテンツからショートコードを削除
get_post( $post_id, $output, $filter)
投稿を1件だけ読み込む
パラメータ:

  • $post_id (必須): 投稿の ID が格納された変数。(変数に入れて参照渡しにする)
  • $output (オプション): 戻り値の型を指定。OBJECT、ARRAY_N、または ARRAY_A。デフォルトは OBJECT
  • $filter (オプション): フィルターを指定(デフォルトは ‘raw’)
戻り値:投稿情報が見つかった場合は $output で指定した形式(オブジェクトまたは配列)。投稿情報が見つからない場合は null。
利用可能箇所:どこでも可能
strip_shortcodes( $content )
ショートコードを取り除く
パラメータ:$content (必須):ショートコードを取り除く文字列
戻り値:ショートコードを取り除いた文字列
wp_html_excerpt( $str, $count, $more )
HTML 文字列から指定した数の文字列を抽出する。
タグはカウントされないが、文字参照は1文字としてではなくキーワードの長さがカウントされる。例:&amp; は4文字としてカウントされる
パラメータ:

  • $str (必須):文字列
  • $count (必須):抽出する最大文字数
  • $more (オプション):抽出した文字列の最後に付加する文字列。指定しなければ空文字列(デフォルト:null)
戻り値:抽出した文字列(タグは取り除かれている)

wp_html_excerpt() を使っての抜粋の表示

「WP Multibyte Patch」のデフォルトの抜粋の文字数を変更するには、’excerpt_mblength’ フィルターフックを使うが、特定のページ(テンプレート)のみ更に変更するには、また更に’excerpt_mblength’ フィルターフックを特定のページ(テンプレート)に記述する必要がある。

また、抜粋されたテキストの最後の文字列を変更するには、’excerpt_more’ フィルターフックを使う必要がある。

関連ページ: プラグインの「WP Multibyte Patch」デフォルトの抜粋の文字数の変更

ところが、wp_html_excerpt() を使うと両方とも指定して抜粋を表示することができるみたいでとても便利。

抜粋するテキストの文字数を「160文字」で、抜粋されたテキストの最後の文字列を「…」にして、更に (続きを読む)というリンクを出力するには以下をループ内で記述。

$p = get_post(get_the_ID());
$content = strip_shortcodes( $p->post_content );
echo '<p>' .wp_html_excerpt($content, 160, '...')
    . '<a class="more" href="'.get_permalink(). '"> (続きを読む) </a></p>';