「P」タグでのWordpressの折り返し画像の停止


33

私はこれを簡単に解決する方法を探していましたが、役に立ちませんでした。Wordpressは画像をpタグでラップし続けます。作業中のサイトのレイアウトは風変わりであるため、非常に迷惑です。

画像のラップを解除するjQueryソリューションを作成しましたが、それほど素晴らしいものではありません。ページに他のものがロードされているために遅れるため、変更の実行が遅くなります。Wordpressがpタグで画像だけをラップするのを防ぐ方法はありますか?おそらく実行可能なフックまたはフィルター。

これは、画像をアップロードしてからWYSIWYGエディターに挿入するときに発生します。手動でコードビューに移動してpタグを削除することは、クライアントが技術的に適切でないため、オプションではありません。

画像はインラインであることを理解していますが、サイトでコード化された画像の方法はdiv内にあり、ブロックするように設定されているため、有効なコードです。


回答:


34

昨日、この正確な問題を抱えていたクライアントサイトで行ったことを次に示します。プラグインとしてクイックフィルターを作成し、アクティブにしました。

<?php
/*
Plugin Name: Image P tag remover
Description: Plugin to remove p tags from around images in content outputting, after WP autop filter has added them. (oh the irony)
Version: 1.0
Author: Fublo Ltd
Author URI: http://fublo.net/
*/

function filter_ptags_on_images($content)
{
    // do a regular expression replace...
    // find all p tags that have just
    // <p>maybe some white space<img all stuff up to /> then maybe whitespace </p>
    // replace it with just the image tag...
    return preg_replace('/<p>(\s*)(<img .* \/>)(\s*)<\/p>/iU', '\2', $content);
}

// we want it to be run after the autop stuff... 10 is default.
add_filter('the_content', 'filter_ptags_on_images');

これを/ wp-content / pluginsフォルダーのphpファイルにドロップしてからアクティブにすると、画像を含むparaからpタグを削除する必要があります。

他のエディターからの出力で失敗するかどうかについて、正規表現がどれほど強力かはわかりません-たとえば、imgタグが>だけで閉じられた場合、失敗します。誰かがより強力な何かを持っている場合、それは本当に役立ちます。

乾杯、

ジェームス

---改善されたフィルター---

リンクにラップされた画像を操作するために、出力にリンクを保持し、pタグを削除します。

return preg_replace('/<p>\s*(<a .*>)?\s*(<img .* \/>)\s*(<\/a>)?\s*<\/p>/iU', '\1\2\3', $content);

間違いなく、これが適切な答えです。ジェームスに感謝します、私はそれを試してみました、そしてそれはすばらしく動作します。
ドウェインチャーリントン

こんにちは@Dwayne-フィードバックをありがとう。リンクを処理する改善されたフィルターを追加しました。現在、クライアントサイトで使用しています。
ジェームズ

これは必ずWordpressプラグインリポジトリに配置する必要があります。グーグルで簡単に検索すると、多くの人がこの問題を抱えており、良い解決策がないことがわかります。
ジェフリーバーデット14

1
これは、HTML5のデフォルトimgマークアップでは、つまり<img ...>、スラッシュなしでは機能しないことに注意してください。正規表現でオプションにすることをお勧めします。または、さらに良いことに、あなたはそれ.*を世話するので、それを省くことができます。
ブラムヴァンロイ

誰もそれ<img ...>なしでそれを動作させました/>か?
Runnick

13

基本的に、WordPressでimgをフォーマットの目的でブロックレベル要素のように扱う必要があります。そのような要素はハードコーディングされてwpautop()おり、残念ながらリストはフィルタリングされません。

私がやることは:

  1. wpautop()別の名前でフォークします。
  2. 変数のimg正規表現に追加し$allblocksます。
  3. フィルターwpautopから削除しthe_contentます。
  4. 分岐したバージョンをに追加しますthe_content
  5. 処理順序が変更されたために何かが壊れた場合は、優先してプレイし、他のフィルターを削除して追加し直す必要があるかもしれません。

このアプローチを試してみます。imgタグをallblocks変数に実際に追加することは考えもしませんでした。これは天才的なアイデアです。どうやって行くか見ていきます。
ドウェインチャーリントン

最初はうまくいきましたが、画像がアンカータグ内にあり、両方がすでに段落内にある場合(p> img> a)にシナリオをヒットしました。imgをブロックとして扱うと、wp-autopはimgタグが開始する前に段落タグを閉じ、レイアウトを無効にします。
benz001 14

2

多分これは助けになるでしょう

remove_filter('the_content', 'wpautop')

ただし、それ以外の場合は手動で段落を追加します。


私はこのアプローチを検討しましたが、pタグの必要性に大きく依存していると言ったように、レイアウトがエキセントリックです。私は2列のテキストを実行しているので、pタグが左にフロートされて2列のテキストの外観が得られます。したがって、画像をラップするapタグが問題になるのは、それが浮いているためです。
ドウェインチャーリントン

1

Soskaは1つ/簡単な方法を提供しました。

しかし、私がやることは、コンテンツから画像を抽出し、それを個別に表示することです。


私もこれを考慮しましたが、それはまだオプションです。ただし、すべての面倒を保存するのは1つの画像のみであるため、代わりにおすすめの投稿サムネイルを使用するだけで、画像の表示方法を制御できます。
ドウェインチャーリントン

また、あなたは...親指の画像のように、ポスト/ページにカスタムフィールドを追加し、その値に画像のパスを保存することができます
のAvinash

1

この記事は少し古いですが、CSSを使用しない限り、はるかに簡単なソリューションがあります。

imgタグをdivにラップしても、ほとんど悪影響はありません。


1

この正確な問題を修正するプラグインを開発しました:http : //wordpress.org/extend/plugins/unwrap-images/

jQueryのネイティブアンラップ機能を使用してpタグのすべてのイメージをアンラップするため、マージンを設定したり、コードをいじりたくない人のためにWordpressコードに直接飛び込むよりも優れています。

これが誰かを助けることを願っています!乾杯、ブライアン


どうやらまだ30以上のアクティブなインストールがあります:D
Julix

1

受け入れられた答えは画像だけで助けましたが、修正されたコードは私のサイトでリンクされた画像をうまく処理しません。このブログ投稿には、完全に機能するコードがあります。

コードは次のとおりです。

function wpautop_forked($pee, $br = 1) {

if ( trim($pee) === '' )
return '';
$pee = $pee . "\n"; // just to make things a little easier, pad the end
$pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
// Space things out a little
$allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li
|pre|select|option|form|map|area|blockquote|img|address|math|style|input
|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer
|nav|figure|figcaption|details|menu|summary)';
$pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "\n$1", $pee);
$pee = preg_replace('!(</' . $allblocks . '>)!', "$1\n\n", $pee);
$pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines
if ( strpos($pee, '<object') !== false ) {
$pee = preg_replace('|\s*<param([^>]*)>\s*|', "<param$1>", $pee); // no pee inside object/embed
$pee = preg_replace('|\s*</embed>\s*|', '</embed>', $pee);
}
$pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates
// make paragraphs, including one at the end
$pees = preg_split('/\n\s*\n/', $pee, -1, PREG_SPLIT_NO_EMPTY);
$pee = '';
foreach ( $pees as $tinkle )
$pee .= '<p>' . trim($tinkle, "\n") . "</p>\n";
$pee = preg_replace('|<p>\s*</p>|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace
$pee = preg_replace('!<p>([^<]+)</(div|address|form)>!', "<p>$1</p></$2>", $pee);
$pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee); // don't pee all over a tag
$pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problem with nested lists
$pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $pee);
$pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee);
$pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)!', "$1", $pee);
$pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee);
if ($br) {
$pee = preg_replace_callback('/<(script|style).*?<\/\\1>/s', create_function('$matches', 'return str_replace("\n", "<WPPreserveNewline />", $matches[0]);'), $pee);
$pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line breaks
$pee = str_replace('<WPPreserveNewline />', "\n", $pee);
}
$pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*<br />!', "$1", $pee);
$pee = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!', '$1', $pee);
if (strpos($pee, '<pre') !== false)
$pee = preg_replace_callback('!(<pre[^>]*>)(.*?)</pre>!is', 'clean_pre', $pee );
$pee = preg_replace( "|\n</p>$|", '</p>', $pee );

return $pee;
}

remove_filter('the_content', 'wpautop');
add_filter('the_content', 'wpautop_forked');

乾杯!


1

私は専門家ではありませんが、pのタグに包まれたimgを解決しようとして午後の午後を過ごしただけで、これはうまくいきました。

私はワードプレスベースのテーマに取り組んでおり、これをfunctions.jsファイルに追加しました

JQuery関数のラップ解除

> $(document).ready(function (){
> 
> // for images wraped in a tags
> 
> $(‘.entry a’).unwrap(‘p’);
> 
> //for images wraped in just p tags
> $(‘.entry img’).unwrap(‘p’);

これで、pとimgを別々に処理できます。

また、これを使用してimgの周りに異なるクラスのdivを追加することもできます:

$(document).ready(function (){

$('.entry img').wrap('<div class="justImg"></div>');

display:noneを使用してpタグを作成したかったため、この最後の1つは問題を解決しませんでした。だから私は本当にそれらの画像をそこから取り出す必要がありました。


3
本当に引用符を使用していますか?:)
fuxia

私はこのアプローチを最初に考えましたが、jQueryを介した不必要なDOM操作の考えは、トリッキーな正規表現を使用してPHPでこれを行う場合、リスクが大きくなり、不要なオーバーヘッドが生じる可能性がありました。
ドウェインチャーリントン

0

投稿によっては、WP Unformattedプラグインを使用して投稿ごとにauto-p機能を無効にすることもできます。


それは非常に便利ですが、私が見ることができる唯一の警告は、画像にPタグを持たず、ページ内にテキストも含める場合、それは1つの大きな混乱になることです。これはおそらく、画像とおそらく数行のテキストのみを含む投稿に適しています。それでも、便利です。
ドウェインチャーリントン

うん、だからこそ、投稿次第だと言った。
Synetech

0

誰かが任意のタグに対してこれを修正するための迅速で汚い方法を探している場合は、ここで私がやったことです:

  1. wp-content / formatting.phpに移動します
  2. wpautop関数を見つけます。(あなたがそれを見逃した場合、それはWP-AUTO-Pです、それを手に入れますか?)
  3. 「すべてのブロック」変数のフィンは、次のようになります $allblocks = '(?:table|thead|tfoot|capti...
  4. 最後に、省略したいブロックを追加します- imgaなど、タグが追加されて自動ピーピングを避けるために(...)menu|summary)';変更が 終了した場合など 。パイプセパレータに注意してください-それは正規表現構文です!(...)menu|summary|a)';a|

それだけです、ハッピーワードプレス!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.