• 解決済 developer

    (@6flat)


    <br>

    などの空要素が

    <br />

    とならないように下記の様なコードをfunctions.phpに追加しているのですが、意図した部分でconvert_charsを停止できません。
    単一記事ページでは投稿部分のみconvert_charsが無効になっていますが、コメント部分では有効なままです。
    また、ホームやアーカイブなどの他のページでは投稿部分にもconvert_charsが有効なままです。
    どうにかしてこの変換を止めたいのですが、どうしたら良いでしょうか。

    // オートフォーマット関連の無効化
    add_action( 'init', function() {
        remove_filter( 'the_title',    'wpautop' );
        remove_filter( 'the_content',  'wpautop' );
        remove_filter( 'the_excerpt',  'wpautop' );
        remove_filter( 'comment_text', 'wpautop' );
        remove_filter( 'the_title',    'wptexturize' );
        remove_filter( 'the_content',  'wptexturize' );
        remove_filter( 'the_excerpt',  'wptexturize' );
        remove_filter( 'comment_text', 'wptexturize' );
        remove_filter( 'the_title',    'convert_chars' );
        remove_filter( 'the_content',  'convert_chars' );
        remove_filter( 'the_excerpt',  'convert_chars' );
        remove_filter( 'comment_text', 'convert_chars' );
        remove_filter( 'the_editor_content', 'wp_richedit_pre' );
    });
    
    // オートフォーマット関連の無効化 TinyMCE
    add_filter( 'tiny_mce_before_init', function( $init ) {
        $init['wpautop'] = false;
        $init['apply_source_formatting'] = ture;
        return $init;
    });

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • こんにちは

    add_filter( 'the_title', 'my_html4_break',11 );
    add_filter( 'the_content', 'my_html4_break',11 );
    //...
    
    function my_html4_break( $return_value ) {
    
    	return preg_replace( '!(<br)[^/]+/>!','<br>', $return_value );
    }

    のように、フィルタで上書きするといいと思います。

    トピック投稿者 developer

    (@6flat)

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

    // convert_charsで変換されたタグを置換
    add_filter( 'the_title',    'my_html4_break', 11 );
    add_filter( 'the_content',  'my_html4_break', 11 );
    add_filter( 'the_excerpt',  'my_html4_break', 11 );
    add_filter( 'comment_text', 'my_html4_break', 11 );
    function my_html4_break( $return_value ) {
    	return preg_replace( '!(<br)[^/]+/>!', '<br>', $return_value );
    }

    上記の様に試してみたところ、br要素が全て消え、改行した箇所が全てp要素で囲まれる様になってしまいました。
    また、remove_filterによるオートフォーマットの無効化と合わせて使用したところ、br要素は消えなくなりましたが置換が効いていないようです。

    add_filter( 'the_title',    'my_html4_break', 11 );
    add_filter( 'the_content',  'my_html4_break', 11 );
    //add_filter( 'the_excerpt',  'my_html4_break', 11 );
    add_filter( 'comment_text', 'my_html4_break', 12 );
    function my_html4_break( $return_value ) {
    	return preg_replace( '!(<br)[^/]+/>!', '<br>', $return_value );
    }

    こちらで確認しましたが、

    the_excerptは、br入らないと思いますので3件テスト

    WordPress4.1 twentyfifteen

    コメントだけは、プライオリティ 12でないと変換されませんでしたが、全部変換されました。

    <br>が消えるという事ですが、であれば、正規表現はヒットしていると思いますので、

    他に、<br>を削除するようなフィルタがあるとか、他の整形用のプラグイン等の影響ではないかと思います。

    プライオリティを、999とかに変更して確認してみてください。

    トピック投稿者 developer

    (@6flat)

    ありがとうございます。
    プライオリティを30まで上げたところ、コメントの方は無事反映されました。

    また、<br>が消えた件についてはこちらの勘違いでした。
    正確には連続した<br>だけが消え、一つだけの箇所はきちんと置換されていました。
    (本来は連続して<br>を使うという事をせずにCSSで対応すべきなのですが、諸事情でどうしても連続で使用する場面があるという状況です)

    尚、次の様にしたところ連続した空要素が消える様な事は無くなったのですが、問題などあれば指摘して頂けると助かります。

    // オートフォーマット関連の無効化
    add_action( 'init', function() {
        remove_filter( 'the_title',    'wpautop' );
        remove_filter( 'the_content',  'wpautop' );
        remove_filter( 'the_excerpt',  'wpautop' );
        remove_filter( 'comment_text', 'wpautop' );
        remove_filter( 'the_title',    'wptexturize' );
        remove_filter( 'the_content',  'wptexturize' );
        remove_filter( 'the_excerpt',  'wptexturize' );
        remove_filter( 'comment_text', 'wptexturize' );
        remove_filter( 'the_editor_content', 'wp_richedit_pre' );
    });
    
    // オートフォーマット関連の無効化 TinyMCE
    add_filter( 'tiny_mce_before_init', function( $init ) {
        $init['wpautop'] = false;
        $init['apply_source_formatting'] = ture;
        return $init;
    });
    
    // convert_charsで変換されたタグを置換
    add_filter( 'the_title',    'my_html4_break', 11 );
    add_filter( 'the_content',  'my_html4_break', 11 );
    add_filter( 'comment_text', 'my_html4_break', 30 );
    function my_html4_break( $return_value ) {
    	return preg_replace( '!(<br)[^/]+/>!', '<br>', $return_value );
    }

    Codexにも書いてありますが、
    この関数は、意図したフィルター以外のフィルターも除去する可能性があります。

    remove_filterを使うのは極力避けたほうがいいです。

    なんで?

    the_title the_content等のフィルタは、プラグインで頻繁に使われます。
    つまり、プラグインの動作がどんどん不安定になったりする可能性があるので、やめたほうがいいです。

    TinyMCEのその設定は、調べていないのでよくわかりませんが、私の理解では、tinymceで作られたhtmlは、最終的に、WordPressの、wpautopでフィルタされて出力されます。

    二つの方法で、htmlが生成されることによって、p要素のおかしな配置が発生する事がありますが、だからと言って 機能そのものを無効化する処理を行うより

    フィルタなどで、不具合店の修正をする方が簡単だと思います。

    本来は連続してを使うという事をせずにCSSで対応すべきなのですが、諸事情でどうしても連続で使用する場面があるという状況で

    もし行間調整などの目的でしたら、最新バージョンと出来のいいテーマを使っていれば、
    行間は、エディタでの連続改行で調整できますよ

    ソースは

    <p>&nbsp;</p>

    トピック投稿者 developer

    (@6flat)

    連続改行についてはご指摘の通り行間調整が目的なので、その部分を見直しながら空要素が使われた時の末尾のスラッシュについてはフィルタを用いて置換する事で対応しようと思います。
    また、remove_filterについて安易な使用は避けた方が良いという事もとても勉強になりました。
    ありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「空要素にスラッシュが挿入されない様にしたい」には新たに返信することはできません。