サポート » 使い方全般 » pタグの除去

  • 初めて投稿させていただきます。

    トッピクタイトルにある通り「pタグの除去」について教えて頂きたく投稿させて頂きました。

    ■環境
    WordPress -> 3.2.1
      3.2.1には今週アップデートしました。
    MySQL -> 5
    PHP -> 5

    ■状況
    Blogにてソースコードハイライトのプラグインを使用しハイライトを行っています。
    先日発見したのですが、ソースコードにpタグが含まれた状態で表示されてしまっています。
    エントリーを書いた当初はpタグが表示されてしまう様なことはありませんでした。

    ハイライトに使用しているプラグインは以下になります。かっこ内はバージョンになります。
    ・WP-CodeBox(1.4.3)
    ・WP SyntaxHighlighter(1.4 )
    ・WP-Syntax(0.9.12)

    これらを併用ではなく1つだけ有効にした状態で使用しています。
    発見当時はWP-CodeBoxを使用していました。
    他2つも有効にし確認を行いましたが、やはりpタグが表示されてしまいました。

    Webでpタグ除去についての情報は沢山あったので試してみたのですが、どれもpタグを除去できる結果になりませんでした。

    試してみた情報が記載されているURLになります。
    http://kanari.info/b/247.html
    http://ja.forums.wordpress.org/topic/1714?replies=5
    http://www.techgaga.com/wordpress-plugin-disable-wpautop/
    http://3bee.jp/2011/07/19/wordpress%E3%81%AEp%E3%82%BF%E3%82%B0%E5%95%8F%E9%A1%8C%E3%81%A8%E8%87%AA%E5%88%86%E7%9A%84%E3%81%AA%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95/
    http://www.seotemplate.biz/blog/wordpress-plug/853/

    それと編集時は「HTMLモード」を使用し編集をしています。

    ■知りたい事
    色々試しましたが、pタグを除去できるやり方がまだ発見できておりません。
    pタグを除去できるやり方を教えて頂きたいと思います。

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

    <p>タグの除去より、何が、どのタイミングで<p>タグを付加しているか調べる方が重要かと思います。

    それが分からなければ、除去できないかと。

    タイミングとしては、大まか言えば、データベースに保存されているデータに既に<p>タグが付いているのか、それともページが表示される直前に何かが<p>タグを付加しているのかといった感じになるでしょう。

    コードが含まれる記事を再編集し、保存し直していなければ、表示のタイミングで<p>タグが付加されているのではないかと思いますが、これは確認した方が良いと思います。

    また、既存の記事でしか、この問題を確認されていないなら、3つのプラグイン用に新しくソースコードを含む記事を作成し、それぞれのプラグインで正しく表示されるかの確認もされた方が良いと思います。

    何らかの原因でエディターが悪さをしている可能性もありますし、「WP-CodeBox」、「WP SyntaxHighlighter」、「WP-Syntax」のいずれかの可能性もありますし、それ以外のプラグインが原因の可能性もあるので、余計なプラグインは無効化してテストしたほうが良いと思います。

    ちなみに「WP SyntaxHighlighter」は、ソースコードをビジュアルエディターで入力することを前提に設計しており、HTMLエディターから入力されコードに対して特別な処理はしていません。

    これは、HTMLエディターから入力されたコードは、ハイライト出来ないという意味ではありません。ハイライトできます。

    「WP SyntaxHighlighter」では、HTMLエディターから入力される場合は、<pre>タグで囲まれたコード部分をエスケープする必要があります。

    <pre class="brush: php">
    エスケープされたソースコード
    </pre>

    エスケープには、下記のツールが便利です。

    http://www.mapee.jp/tools/pretagmaker/

    トピック投稿者 stryh

    (@stryh)

    redcockerさん。

    返信有難う御座います。

    コードが含まれる記事を再編集し、保存し直していなければ、表示のタイミングで<p>タグが付加されているのではないかと思いますが、
    これは確認した方が良いと思います。

    これは既に確認をしています。
    投稿時に情報として含めておらず申し訳ありません。

    DBに<p>は一緒に保存されてません。それと再編集をし保存し直しも行っております。
    それでも<p>が挿入されているので表示のタイミングではないかと考えています。

    また、既存の記事でしか、この問題を確認されていないなら、3つのプラグイン用に新しくソースコードを含む記事を作成し、
    それぞれのプラグインで正しく表示されるかの確認もされた方が良いと思います。

    ご指摘を頂き3つのプラグイン様にソースコードを含む記事を作成しました。
    投稿してしまうのはゴミになってしまうのでプレビューで確認をしました。
    3つ共全てで<p>タグが挿入されるのを確認しました。

    もうちょっと調べてみます。

    こんにちは

    Webでpタグ除去についての情報は沢山あったので試してみたのですが、どれもpタグを除去できる結果になりませんでした。

    たとえば、functions.phpに

    remove_filter('the_content', 'wpautop');

    を記述して、投稿内のPタグが消えるのが普通の動作だと思います。

    これでpタグが除去できないということになると、ほかのプラグインやテーマのどこかで、

    add_filter('the_content', 'wpautop');

    が記述されている可能性もあると思います。

    テーマディレクトリやプラグインディレクトリに wpautopが使われていないか、チェックしてみるといいと思います。

    add_filterは、第三引数に  $priorityをセットできるので、ほかのものとコンフリクトして困るときには、値を変えて、後先を変更することもできます。

    WordPressは、preエレメント内のpタグは、以下の関数で除去しているようです。

    /**
     * Accepts matches array from preg_replace_callback in wpautop() or a string.
     *
     * Ensures that the contents of a <<pre>>...<</pre>> HTML block are not
     * converted into paragraphs or line-breaks.
     *
     * @since 1.2.0
     *
     * @param array|string $matches The array or string
     * @return string The pre block without paragraph/line-break conversion.
     */
    function clean_pre($matches) {
    	if ( is_array($matches) )
    		$text = $matches[1] . $matches[2] . "</pre>";
    	else
    		$text = $matches;
    
    	$text = str_replace('<br />', '', $text);
    	$text = str_replace('<p>', "\n", $text);
    	$text = str_replace('</p>', '', $text);
    
    	return $text;
    }

    エディタには、[php]とか書くと思いますので、
    したがって、実行順が関係している可能性があると思います。
    簡単には、
    SyntaxHighlighter.phpファイルを開いて

    // Display hooks
    		add_filter( 'the_content',                        array( &$this, 'parse_shortcodes' ),                              7 );

    7を1に変更するとかも、試して損はないかも

    DBに<p>は一緒に保存されてません。それと再編集をし保存し直しも行っております。
    それでも<p>が挿入されているので表示のタイミングではないかと考えています。

    TinyMCE Advanceなどにもセーブ前の<p>、<br />の除去を停止する機能がありますので、こういったものが影響しているわけでは無さそうですね。

    プラグインやテーマの表示前の処理が問題を引き起こしている可能性がありますが、一時的に停止したり標準のものを使ったりすることはできないでしょうか?

    「WP SyntaxHighlighter」は、<p>が付いたコードを渡されることを想定していませんので、そのまま表示してしまいます。

    「WP-CodeBox」や「WP-Syntax」も同じだと思います。

    ちなみに、どんな感じで<p>が付加されるのでしょうか?
    各行が<p></p>で囲まれる等。

    トピック投稿者 stryh

    (@stryh)

    nobitaさん。

    返信有り難う御座います。

    これでpタグが除去できないということになると、ほかのプラグインやテーマのどこかで、
    add_filter('the_content', 'wpautop');
    が記述されている可能性もあると思います。

    この線で疑ってみた所、テーマではadd_filterしている箇所はありませんでした。
    プラグインについては結構多い数のプラグインを使用しているため全て確認をしておりませんが、コードハイライトのプラグインに的を絞ってみてみました。

    SyntaxHighlighter.phpファイルを開いて

    // Display hooks
    add_filter( ‘the_content’, array( &$this, ‘parse_shortcodes’ ), 7 );

    7を1に変更するとかも、試して損はないかも

    wp-syntaxhighlighter/wp-syntaxhighlighter.phpに以下のコードがありました。
    add_filter('the_content', 'wp_sh_post_on_print', 9999);

    9999の所を1にして見た所、<p>タグは除去され、表示されました。
    しかし、また違う問題が出て来て、改行箇所が2重改行になってしまうという事象です。
    ↓のような感じです。

    $text = str_replace(‘
    ‘, ”, $text);
    $text = str_replace(‘<p>’, “\n”, $text);



    $text = str_replace(‘
    ‘, ”, $text);

    $text = str_replace(‘<p>’, “\n”, $text);

    取りあえず最初の問題はクリアになりましたが、引き続き調べてみます。

    有り難うございました。

    トピック投稿者 stryh

    (@stryh)

    redcockerさん。

    返信有り難う御座います。

    プラグインやテーマの表示前の処理が問題を引き起こしている可能性がありますが、一時的に停止したり標準のものを使ったりすることはできないでしょうか?

    これについてはまとまった時間が取れる時にやってみようと思います。

    ちなみに、どんな感じで<p>が付加されるのでしょうか?
    各行が<p></p>で囲まれる等。

    redcockerさんがご提示して頂いた「各行が<p></p>で囲まれる」です。

    add_filter('the_content', 'wp_sh_post_on_print', 9999);

    が影響すると言うことは、もしや以下のような書式でソースコードのマークアップに<script>タグを使われていますか?

    <script type="syntaxhighlighter" class="brush: php"><![CDATA[
    エスケープされたコード
    ]]></script>

    <script>を使われていない場合は、そのままコンテンツを返すのですが、もしかすると同じプライオリティで何か処理を行っているプラグインがあれば影響を与えるかもしれません。

    <pre>タグを使う分には不要な処理なので

    add_filter('the_content', 'wp_sh_post_on_print', 9999);

    // add_filter('the_content', 'wp_sh_post_on_print', 9999);

    とコメントアウトしてみて下さい。

    トピック投稿者 stryh

    (@stryh)

    redcockerさん。

    素早い返信有り難う御座います。

    が影響すると言うことは、もしや以下のような書式でソースコードのマークアップに<script>タグを使われていますか?

    <script type="syntaxhighlighter" class="brush: php"><![CDATA[
    エスケープされたコード
    ]]></script>

    いえ、この書式で書いてはおりません。
    <pre>を使用し書いております。

    <pre>タグを使う分には不要な処理なので
    add_filter('the_content', 'wp_sh_post_on_print', 9999);

    // add_filter('the_content', 'wp_sh_post_on_print', 9999);
    とコメントアウトしてみて下さい。

    コメントアウトを行いました。
    行った後、再度表示の確認を行った所、問題無くハイライトされることを確認しました。

    これであとは改行の問題だけです。
    有り難う御座いました。

    コメントアウトを行いました。
    行った後、再度表示の確認を行った所、問題無くハイライトされることを確認しました。

    これであとは改行の問題だけです。

    結果としては、「WP SyntaxHighlighter」で、<p>タグは消えたが、不要な改行は入ると言うことでしょうか?

    コメントアウトは、対象療法的な方法ですので、改行の問題が残ってるいる根本的な解決にはなっていないと思います。

    「WP SyntaxHighlighter」は、私の環境では問題ないですし、今のところ不具合の報告もありません。試していませんが「WP-CodeBox」や「WP-Syntax」も同様かと。

    テーマやプラグインが影響している可能性が高いと思いますので、まずは、プラグインを無効化したり、テーマを変えて切り分けたほうが良いかと思います。

    こんにちは

    改行2つには、手をつけないほうがいいかもしれません。

    コードは追いかけていませんが、
    フォーマットの処理をする場合には、改行二つを見つけて、pタグで囲む処理を基本的に行っていることが多いので、改行の数を変えることは、the_contentのソース以外の部分に、影響を与えてしまう可能性があります。(改行一個の場合は、brを挿入する)
    インラインタグだったらpで囲むけどブロックタグが使われていたら、囲むのやめるだとか、いろいろあると思うので検証が、大変になる事を懸念します

    改行が一つのままなら、この問題は発生しないので、本質的な原因は、改行を入れている部分にあるのかもしれないですね

    http://php.net/manual/ja/function.preg-replace-callback.php
    などを参考にして、clean_pre($matches)手本にした新しくadd_filterをfunctions.phpに書いたほうが無難かもしれないと思います。

    「WP-CodeBox」、「WP-Syntax」、「WP SyntaxHighlighter」、それぞれの現在のハイライト状態が不明なので一般的な話になりますが、ここまでの予想をまとめておきます。

    「WP-CodeBox」と「WP-Syntax」は基本的に同じ動作ですが、「WP SyntaxHighlighter」は全く異なります。

    「WP SyntaxHighlighter」は、WordPressの出力結果上で整形しているわけではなく、Javaスクリプトを使ってブラウザで整形しています。
    つまり、最終的にWordPressが出力するHTML、つまりは、ブラウザからソースを見た場合のコードに問題がなく、

    <pre class="brush: php">
    エスケープされたソースコード
    </pre>

    となっていれば、エスケープされた文字を元に戻し、その通りに正しくハイライト出来ます。
    「WP-CodeBox」、「WP-Syntax」、「WP SyntaxHighlighter」を無効化した状態のソースを見れば、それが、現在のテーマ、その他のプラグインが動作している状態での最終的な出力結果です。ここで異常があれば、少なくとも「WP SyntaxHighlighter」では、正しくハイライト出来ません。

    言い換えれば、「WP SyntaxHighlighter」は、WordPressがデータベースからデータを取り出し、HTMLを出力する間に実行される全てのフィルターの影響を受けますので、ここが今回の問題のポイントなのでしょう。

    対して、「WP-CodeBox」と「WP-Syntax」の場合は、「WP SyntaxHighlighter」は、WordPressの出力結果上で整形しています。
    つまり、ブラウザから見たソースは、タグでコードがレイアウトされたものになっています。

    「WP-CodeBox」と「WP-Syntax」は、the_contentにフィルターを掛けていますが、そのプライオリティは、「0」と「99」です。

    「99」の作業が終わった後は、<table>タグを使ってコードをレイアウトしているはずですので、「99」よりプライオリティが低いフィルターの影響を受けたとは考え難いと思います。でなければ<table>要素全てが影響を受けてしまいます。

    どうもお話からすると影響は、今のところ<pre>タグに限定的ですし。
    「WP-CodeBox」と「WP-Syntax」、「WP SyntaxHighlighter」は、いずれも<pre>タグを使いますので、如何にもと言った共通項です。

    遅くともプライオリティ「99」のフィルターが実行される以前に、コードが期待したものと異なっている可能性があります。
    「WP-CodeBox」と「WP-Syntax」は、期待した状態でコードを受け取っていないのでしょう。

    では、「WordPress 3.2.1」自体に問題があるのかと言えば、サーバー環境によって、そのような現象が出ることは否定できないかもしれませんが、一般的に起こるものであるなら同様の報告があるはずです。
    前にも書きましたが「WP SyntaxHighlighter」でそのような報告はありませんし、まして、コードの強調表示では、1、2を争う人気プラグインの「WP-Syntax」で報告がないのは変です。

    以上のような理由で、インストールされているテーマやプラグインが引き金になっている可能性が高いと思っています。

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • トピック「pタグの除去」には新たに返信することはできません。