サポート » 使い方全般 » the_excerpt() で表示される &nbsp

  • 解決済 tk5

    (@tk5)


    index.php で投稿の抜粋の表示を以下のように行っているのですが、投稿内容のスペースの位置によっては「&nbsp」や「&nbs」、「&nb」、「&n」が抜粋の最後に表示されてしまいます。

    使用しているテーマ:独自テーマ(2ヶ国語・マルチサイト)
    プラグイン「WP Multibyte Patch」は日本語サイトで有効化
    excerpt 関連の記述
    functions.php

    //抜粋の文字数を変更
    function new_excerpt_mblength($length) {
    	return 100;
    }
    add_filter('excerpt_mblength', 'new_excerpt_mblength');
    
    //抜粋の最後の文字列を変更
    function new_excerpt_more($more) {
    	return __('...', 'theme_name');
    }
    add_filter('excerpt_more', 'new_excerpt_more');

    index.php

    <?php
    //ブログだけ抜粋の文字数を160文字に
    function excp_length_home($length) {
    	return 160;
    }
    add_filter('excerpt_mblength', 'excp_length_home');
    ?>

    投稿の抜粋の表示

    <?php
    $my_excerpt = apply_filters('the_excerpt', get_the_excerpt());
    echo '<p>' .$my_excerpt . '<span class="more"><a href="'.get_permalink(). '"> ( ' .__('more', 'theme_name').' ) </a></span></p>';
    ?>

    以下のように「&nbsp」や「&nbs」、「&nb」を空に置換するとそれらは表示されないようになるのですが、何かもう少しいい方法があればご教示いただければありがたいです。

    または、そもそも上記の抜粋の表示方法に問題があればご指摘いただければありがたいです。

    <?php
    $patterns = '/&nbsp;|&nbsp|&nbs|&nb|&n/';
    $replacements = '';
    $my_excerpt = preg_replace($patterns, $replacements, get_the_excerpt());
    $my_excerpt = apply_filters('the_excerpt', $my_excerpt);
    echo '<p>' .$my_excerpt . '<span class="more"><a href="'.get_permalink(). '"> ( ' .__('more', 'theme_name').' ) </a></span></p>';
    ?>

    よろしくお願いいたします。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • フォーラム » 【重要】 お読みください » 問題解決のためのチェックリスト

    上記トピックは確認しましたか?
    WP標準でもWP Multibyte Patchでもスペースを文字参照に変更していないようです。
    文字参照に変更しているプラグインまたはテーマの記述を特定してはどうでしょう?
    プラグインが原因だった場合は代替となるプラグインを探すか、プラグインの作者さんに報告すれば良いです。

    トピック投稿者 tk5

    (@tk5)

    popup さま、

    ご指摘ありがとうございます。

    プラグインは以下のものを使っています。

    Akismet
    Contact Form 7
    Really Simple CAPTCHA
    Multi Device Switcher
    WP Multibyte Patch

    私の書き方が悪かったと思います。ユーザーさんがブログを書くときにビジュアルモードで改行する際に「Enterキー」を押すと「 」が挿入されてしまい、それが文字数としてカウントされていて、ちょうどその部分が最後(excerpt_mblength で設定した文字数)の場合にその一部が表示されてしまうのではと思っているのですが、何かいい方法はないかと思っています。

    トピック投稿者 tk5

    (@tk5)

    すみません。

    &nbsp; をそのまま書いてしまいました。

    ユーザーさんがブログを書くときにビジュアルモードで改行する際に「Enterキー」を押すと「&nbsp;」が挿入されてしまい、それが文字数としてカウントされていて、ちょうどその部分が最後(excerpt_mblength で設定した文字数)の場合にその一部が表示されてしまうのではと思っているのですが、何かいい方法はないかと思っています。

    こんにちは

    ご指摘の件

    $post = get_post(25589);
    setup_postdata($post);
    echo get_the_excerpt();

    で文末の不要な改行が、nbsp;に置換されるのが確認できました。
    文中のnbsp;も削除すると、p要素の表示に何らかの変化を与えるかもしれないです。

    add_filter('get_the_excerpt', 'my_excerpt');
    
    function my_excerpt( $content){
        return trim( $content ,"ここは以下参照");
    }

    「ここは以下参照」は、書けないので

    半角スペース+&nbsp;です

    で&nbsp;は、除去できると思います

    書き方を変えて

    $p = get_post(25589);
    
    echo wp_html_excerpt($p->post_content,100,'...');

    等でもいいと思います。

    トピック投稿者 tk5

    (@tk5)

    nobita さま、

    ご回答いただきありがとうございます。

    ご教示いただいた方法が理解できていないのですが、以下のように試してみました。

    1番目の方法
    functions.php

    add_filter('get_the_excerpt', 'my_excerpt');
    
    function my_excerpt( $content){
        return trim( $content ," &nbsp;");
    }

    index.php には以下2つを試しました。

    <?php echo '<p>' .get_the_excerpt() . '<span class="more"><a href="'.get_permalink(). '"> ( ' .__('more', 'xxxx').' ) </a></span></p>';
    $my_excerpt = apply_filters('the_excerpt', get_the_excerpt());
    
    <?php echo '<p>' .$my_excerpt . '<span class="more"><a href="'.get_permalink(). '"> ( ' .__('more', 'xxxx').' ) </a></span></p>';

    どちらでも、抜粋に表示される「&nbs」や「&nb」はそのままでした。

    2番目の方法
    index.php に以下を記述してみました。

    $p = get_post(get_the_ID());
    echo '<p>' .wp_html_excerpt($p->post_content,160,'...') . '<span class="more"><a href="'.get_permalink(). '"> ( ' .__('more', xxxx').' ) </a></span></p>';

    この場合、抜粋の「&nbs」や「&nb」は表示されなくなりましたが、今度はキャプションのショートコードが表示されてしまいました。

    試しに以下のようにしても同じでキャプションのショートコードが表示されてしまいました。

    $p = get_post(get_the_ID());
    
    $my_excerpt = apply_filters('the_excerpt', wp_html_excerpt($p->post_content,160,'...'));
    
    echo '<p>' .$my_excerpt . '<span class="more"><a href="'.get_permalink(). '"> ( ' .__('more', 'xxxx').' ) </a></span></p>';

    おそらく正しく理解できていないのだと思います。。。

    ショートコード込だと

    $p = get_post(25589);
    $content = strip_shortcodes( $p->post_content );
    echo wp_html_excerpt($content,100,'...');

    でいけると思います

    ビジュアルモードで余分な改行を行うと空の段落'<p>&nbsp;</p>’が作成されるんですね。
    WP Multibyte Patchが無効でも同様の動作だったので、コアを修正してもらう必要があるんじゃないかと思います。
    修正されるまでは現状のまま利用して、余分な改行を行わないようにしてはどうでしょう?

    [問題点]
    ‘the_excerpt’、’get_the_excerpt’で’&nbsp;’が残っていると、指定文字数によっては’&#038;n’や’&n’のように一部だけ表示される

    [修正案]
    ‘wp-includes/formatting.php’にある’wp_trim_words()’関数で、指定文字数によるトリムを行う前、’wp_strip_all_tags()’を実行する直前もしくは直後に’&nbsp;’を削除しておけば良いんじゃないかと思います。

    問題報告前の動作確認とプロジェクトへの報告はどなたか英語が分かる人にお願いしたいのですが。

    トピック投稿者 tk5

    (@tk5)

    nobita さま、

    いけました!
    ご教示いただいた方法で、問題が解決できました。
    本当にありがとうございました。

    wp_html_excerpt(), strip_shortcodes() 勉強になりました。

    $p = get_post(get_the_ID());
    $content = strip_shortcodes( $p->post_content );
    echo '<p>' .wp_html_excerpt($content,160,__('...', 'xxxx'))
        . '<span class="more"><a href="'.get_permalink()
        . '"> ( ' .__('more', 'xxxx')
        .' ) </a></span></p>';

    popup さま

    ご助言ありがとうございました。
    私はまだあまり理解できていないので「問題報告」はできませんが、感謝です。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「the_excerpt() で表示される &nbsp」には新たに返信することはできません。