Stoppen Sie WordPress, indem Sie Bilder in ein "P" -Tag einbinden

33

Ich habe hoch und niedrig nach einer einfachen Lösung dafür gesucht, aber ohne Erfolg. Wordpress umhüllt meine Bilder weiterhin mit p-Tags und aufgrund der Ungereimtheit des Layouts für eine Site, an der ich arbeite, ist dies sehr ärgerlich.

Ich habe eine jQuery-Lösung zum Auspacken von Bildern erstellt, aber sie ist nicht so toll. Es verzögert sich, weil andere Inhalte auf der Seite geladen werden und die Änderungen daher nur langsam durchgeführt werden. Gibt es eine Möglichkeit zu verhindern, dass Wordpress nur Bilder mit p-Tags umschließt? Ein Haken oder Filter, der vielleicht ausgeführt werden kann.

Dies geschieht, wenn ein Bild hochgeladen und dann in den WYSIWYG-Editor eingefügt wird. Manuell in die Codeansicht zu wechseln und die p-Tags zu entfernen, ist keine Option, da der Client technisch nicht so unfähig ist.

Ich verstehe, dass Bilder inline sind, aber die Art und Weise, wie ich die Site-codierten Bilder habe, befindet sich innerhalb von divs und ist so eingestellt, dass sie blockieren, sodass sie gültiger Code sind.

Dwayne Charrington
quelle

Antworten:

34

Hier ist, was wir gestern auf einer Client-Site gemacht haben, mit der wir genau dieses Problem hatten ... Ich habe einen schnellen Filter als Plugin erstellt und ihn aktiviert.

<?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');

Wenn Sie das in eine PHP-Datei in Ihrem Ordner / wp-content / plugins ablegen und dann aktivieren, sollte es die p-Tags aus jedem Absatz entfernen, der nur ein Bild enthält.

Ich bin nicht sicher, wie stark die reguläre Ausdrucksweise in Bezug darauf ist, ob sie bei Ausgaben anderer Editoren fehlschlägt - zum Beispiel, wenn das img-Tag mit nur> geschlossen wird, wird sie fehlschlagen. Wenn jemand etwas Stärkeres hat, wäre das wirklich hilfreich.

Prost,

James

--- Verbesserter Filter ---

Wenn Sie mit Bildern arbeiten möchten, die in Verknüpfungen eingebunden sind, werden die Verknüpfungen in der Ausgabe beibehalten und die p-Tags entfernt.

return preg_replace('/<p>\s*(<a .*>)?\s*(<img .* \/>)\s*(<\/a>)?\s*<\/p>/iU', '\1\2\3', $content);
jamesc
quelle
Dies ist ohne Zweifel die richtige Antwort. Danke James, ich habe es versucht und es funktioniert wunderbar.
Dwayne Charrington
Hallo @Dwayne - danke für das Feedback. Ich habe einen verbesserten Filter hinzugefügt, der Links verarbeitet. Wir verwenden ihn jetzt auf unserer Client-Site.
Jamesc
Sie sollten dies auf jeden Fall in das Wordpress-Plugin-Repository stellen. Eine schnelle Google-Suche zeigt, dass viele Menschen dieses Problem haben und keine gute Lösung finden.
Geoffrey Burdett
1
Beachten Sie, dass dies mit HTML5-Standardmarkup nicht funktioniert img, dh <img ...>ohne den abschließenden Schrägstrich. Es ist besser, dies in Ihrem regulären Ausdruck optional zu machen. Oder noch besser, Sie können es weglassen, da Sie .*sich darum kümmern werden.
Bram Vanroy
Hat jemand dafür gesorgt, dass es <img ...>ohne funktioniert />?
Runnick
13

Grundsätzlich müssen Sie dafür sorgen, dass WordPress img wie ein Element auf Blockebene behandelt, um es zu formatieren. Solche Elemente sind fest codiertwpautop() und die Liste wird leider nicht gefiltert.

Was ich tun würde, ist:

  1. Gabel wpautop()unter anderem Namen.
  2. Add imgto reguläre Ausdrücke in $allblocksVariablen.
  3. wpautopVom the_contentFilter entfernen .
  4. Fügen Sie Ihre gegabelte Version hinzu the_content.
  5. Möglicherweise müssen Sie mit Priorität spielen und möglicherweise andere Filter entfernen und wieder hinzufügen, wenn aufgrund einer geänderten Verarbeitungsreihenfolge ein Fehler auftritt.
Rarst
quelle
Ich werde diesen Ansatz ausprobieren. Ich hätte nie gedacht, das img-Tag tatsächlich zur allblocks-Variable hinzuzufügen, das ist eine geniale Idee. Ich werde sehen, wie ich gehe.
Dwayne Charrington
Zuerst hat es gut funktioniert, dann traf ich das Szenario, wenn sich ein Bild in einem Ankertag befindet und sich beide bereits in einem Absatz befinden (also p> img> a). Wenn img als Block behandelt wird, schließt wp-autop das Absatz-Tag, bevor das img-Tag startet, und sprengt das Layout.
benz001
2

Vielleicht hilft das

remove_filter('the_content', 'wpautop')

Aber dann werden Sie die Absätze für alles andere manuell hinzufügen.

Soska
quelle
Ich habe über diesen Ansatz nachgedacht, aber da das Layout, wie ich bereits sagte, exzentrisch ist, ist es stark darauf angewiesen, p-Tags zu benötigen. Während ich eine zweispaltige Textsache mache, werden p-Tags nach links verschoben, um das Erscheinungsbild von zwei Textspalten zu erhalten. Sie können also sehen, warum ein p-Tag, das ein Bild umschließt, ein Problem darstellt, da es auch darin schwebt.
Dwayne Charrington
1

Soska hat einen / einfachen Weg vorgegeben.

Ich extrahiere jedoch ein Bild aus dem Inhalt und zeige es separat an.

Avinash
quelle
Ich habe auch darüber nachgedacht und es ist immer noch eine Option. Da es sich jedoch nur um ein Bild handelt, um den ganzen Aufwand zu sparen, verwende ich stattdessen möglicherweise nur die Miniaturansichten der Beiträge, mit denen ich steuern kann, wie das Bild angezeigt wird.
Dwayne Charrington
Sie können dem Beitrag / der Seite auch ein benutzerdefiniertes Feld hinzufügen, z. B. ein
Avinash
1

Dieser Beitrag ist ein bisschen alt, aber es gibt eine viel einfachere Lösung, außer CSS.

Das Umschließen des img-Tags mit einem div hat nur geringe negative Auswirkungen.

Laoshi Ma
quelle
1

Ich habe ein Plugin entwickelt, das genau dieses Problem behebt: http://wordpress.org/extend/plugins/unwrap-images/

Es ist besser, als einen Rand festzulegen oder direkt in den Wordpress-Code einzutauchen, wenn Sie nicht mit Code herumspielen möchten, da die native Entpackungsfunktion von jQuery verwendet wird, um alle Bilder ihrer p-Tags zu entpacken.

Hoffe das hilft jemandem! Prost, Brian

gnzlz
quelle
anscheinend sind noch 30+ Installationen aktiv: D
Julix
1

Die akzeptierte Antwort hat mir nur bei den Bildern geholfen, aber der überarbeitete Code kann mit verknüpften Bildern auf meiner Site nicht gut umgehen. Dieser Blog-Beitrag hat einen Code, der perfekt funktioniert.

Hier ist der Code:

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');

Prost!

Rlesko
quelle
1

Ich bin kein Experte, habe aber den ganzen Nachmittag damit verbracht, in p-Tags verpackte De-Img-Probleme zu lösen, und das hat bei mir funktioniert.

Ich arbeite an einem WordPress-basierten Thema und habe es der Datei functions.js hinzugefügt

JQuery-Funktion auspacken

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

jetzt kann ich p und img separat arbeiten.

Sie können auch ein div mit einer anderen Klasse um das img hinzufügen, indem Sie dies verwenden:

$(document).ready(function (){

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

Letzteres hat mein Problem nicht gelöst, da ich p-Tags mit display erstellen wollte: none; Also musste ich diese Bilder wirklich rausholen.

M Joana
quelle
3
Verwenden Sie wirklich geschweifte Anführungszeichen? :)
fuxia
Ich habe diesen Ansatz vor langer Zeit in Betracht gezogen, aber der Gedanke an eine unnötige DOM-Manipulation über jQuery war zu riskant und potenziell unnötig, wenn Sie dies in PHP mit kniffligen regulären Ausdrücken tun können.
Dwayne Charrington
0

Je nach Beitrag kann eine andere Lösung darin bestehen, das unformatierte WP- Plugin zu verwenden, um die Auto-P-Funktion für jeden Beitrag einzeln zu deaktivieren.

Synetech
quelle
Das ist ziemlich nützlich, obwohl der einzige Nachteil, den ich sehen kann, darin besteht, dass Bilder, die keine P-Tags, sondern auch Text auf Ihrer Seite haben sollen, ein einziges Chaos darstellen. Dies ist wahrscheinlich gut für Posts, die nur Bilder und möglicherweise ein paar Textzeilen enthalten. Trotzdem nützlich.
Dwayne Charrington
Ja, deshalb habe ich gesagt, es kommt auf die Post an.
Synetech
0

Falls jemand nach einer schnellen und schmutzigen Möglichkeit sucht , dies für ein beliebiges Tag zu beheben, habe ich Folgendes getan:

  1. gehe zu wp-content / formatting.php
  2. finde wpautop Funktion. (falls du es verpasst hast, ist es WP-AUTO-P , verstehst du ?)
  3. Flossen die "all blocks" -Variable, sollte so ähnlich sein $allblocks = '(?:table|thead|tfoot|capti...
  4. am Ende fügen Sie den Block , den Sie auslassen wollen - img, aetc ... zum Beispiel , wenn es in endet (...)menu|summary)';Änderung (...)menu|summary|a)';des hinzufügen aTag und vermeiden autopeeing es. Beachten Sie den |Rohrtrenner - es ist Regex- Syntax!

Das war's, fröhliches WordPressing!

JDuarteDJ
quelle