Oprește WordPress să împacheteze imaginile în tag-uri "P"

17 ian. 2011, 06:08:51
Vizualizări: 34.3K
Voturi: 39

Am căutat îndelung o soluție simplă pentru această problemă, dar fără succes. WordPress continuă să împacheteze imaginile mele în tag-uri p și, din cauza naturii excentrice a layout-ului pentru un site la care lucrez, acest lucru este extrem de deranjant.

Am creat o soluție jQuery pentru a dezîmpacheta imaginile, dar nu este foarte eficientă. Are lag din cauza altor elemente care se încarcă pe pagină și astfel modificările sunt lente. Există o modalitate de a preveni ca WordPress să împacheteze doar imaginile cu tag-uri p? Poate un hook sau un filtru care poate fi rulat.

Acest lucru se întâmplă când se încarcă o imagine și apoi se inserează în editorul WYSIWYG. Accesarea manuală a vizualizării codului și eliminarea tag-urilor p nu este o opțiune, deoarece clientul nu este atât de priceput din punct de vedere tehnic.

Înțeleg că imaginile sunt inline, dar în modul în care am codat site-ul, imaginile sunt în interiorul div-urilor și setate ca block, deci sunt cod valid.

1
Toate răspunsurile la întrebare 11
11
41

iată ce am făcut ieri pe un site al unui client unde am avut exact această problemă... Am creat un filtru rapid ca și plugin și l-am activat.

<?php
/*
Plugin Name: Elimină tag-urile P din jurul imaginilor
Description: Plugin pentru a elimina tag-urile p din jurul imaginilor în conținutul afișat, după ce filtrul autop al WordPress le-a adăugat. (ironia sorții)
Version: 1.0
Author: Fublo Ltd
Author URI: http://fublo.net/
*/

function filter_ptags_on_images($content)
{
    // facem un înlocuire cu expresie regulată...
    // găsim toate tag-urile p care au doar
    // <p>poate ceva spațiu alb<img tot conținutul până la /> apoi poate spațiu alb </p>
    // înlocuim doar cu tag-ul de imagine...
    return preg_replace('/<p>(\s*)(<img .* \/>)(\s*)<\/p>/iU', '\2', $content);
}

// vrem să ruleze după operațiunile autop... 10 este valoarea implicită.
add_filter('the_content', 'filter_ptags_on_images');

Dacă pui acest cod într-un fișier php în folderul /wp-content/plugins și apoi îl activezi, ar trebui să elimine tag-urile p din orice paragraf care conține doar o imagine.

Nu sunt sigur cât de puternică este expresia regulată în ceea ce privește posibilitatea de a eșua cu output-uri din alte editoare - de exemplu, dacă tag-ul img este închis doar cu >, va eșua. Dacă cineva are ceva mai robust, ar fi foarte util.

Salutări,

James

--- Filtru îmbunătățit ---

Pentru a funcționa cu imagini care sunt încadrate în link-uri, păstrează link-urile în output și elimină tag-urile p.

return preg_replace('/<p>\s*(<a .*>)?\s*(<img .* \/>)\s*(<\/a>)?\s*<\/p>/iU', '\1\2\3', $content);
2 feb. 2011 14:26:35
Comentarii

Fără îndoială, acesta este răspunsul corect. Mulțumesc James, l-am încercat și funcționează excelent.

Dwayne Charrington Dwayne Charrington
3 feb. 2011 05:25:38

Salut @Dwayne - mulțumesc pentru feedback. Am adăugat un filtru îmbunătățit care va gestiona link-urile, acum îl folosim pe site-ul clientului nostru.

jamesc jamesc
4 feb. 2011 19:29:20

Ar trebui neapărat să publici asta în repository-ul de pluginuri Wordpress. O căutare rapidă pe Google arată că mulți oameni au această problemă fără o soluție bună.

Geoffrey Burdett Geoffrey Burdett
29 aug. 2014 16:19:28

Rețineți că acest lucru nu va funcționa cu marcajul implicit HTML5 img, adică <img ...> fără slash-ul de închidere. Este mai bine să faceți acest lucru opțional în regex. Sau, și mai bine, îl puteți omite, deoarece .* se va ocupa de asta.

Bram Vanroy Bram Vanroy
10 mar. 2015 21:41:31

A reușit cineva să funcționeze pentru <img ...> fără />?

Runnick Runnick
17 dec. 2017 15:41:26

Apropo, acest lucru nu pare să funcționeze cu Gutenberg.

jarrodwhitley jarrodwhitley
14 mar. 2019 17:06:43

Acest lucru nu funcționează dacă există text în interiorul paragrafului.

Justin Putney Justin Putney
1 mai 2021 01:23:57

Codul de mai jos a funcționat pentru a muta o imagine <img> în afara unui <p> chiar dacă este urmată de text: return preg_replace('/<p>(\s*)(<img .*>)/iU', "$2<p>", $content);

Justin Putney Justin Putney
1 mai 2021 02:30:19

Funcționează perfect... Mulțumesc

Dushan Dushan
24 nov. 2021 17:57:53

@jamesc Cum s-ar putea extinde acest lucru pentru a face același lucru și pentru alte elemente, cum ar fi <iframe>?

Robert Andrews Robert Andrews
31 mar. 2022 15:19:49

@RobertAndrews Nu am nicio idee, din păcate - nu am mai lucrat cu WordPress de aproape 10 ani.

jamesc jamesc
1 apr. 2022 13:42:40
Arată celelalte 6 comentarii
2
13

În esență, trebuie să faci ca WordPress să trateze img ca un element de tip block în scopul formatării. Aceste elemente sunt hardcodate în wpautop(), iar lista nu poate fi filtrată, din păcate.

Ce aș face eu:

  1. Fork wpautop() sub un nume diferit.
  2. Adaugă img la regexp în variabila $allblocks.
  3. Elimină wpautop din filtrul the_content.
  4. Adaugă versiunea ta modificată la the_content.
  5. S-ar putea să fie nevoie să ajustezi prioritatea și eventual să elimini și să readaugi alte filtre dacă ceva se strică din cauza schimbării ordinii de procesare.
17 ian. 2011 10:33:24
Comentarii

Voi încerca această abordare. Nu m-am gândit niciodată să adaug efectiv tag-ul img la variabila allblocks, asta e o idee genială. Voi vedea cum merge.

Dwayne Charrington Dwayne Charrington
17 ian. 2011 12:51:15

A funcționat bine la început, dar apoi am dat de scenariul când o imagine este în interiorul unui tag anchor și ambele sunt deja în interiorul unui paragraf (deci p > img > a). Cu img tratat ca un block, wp-autop închide tag-ul de paragraf înainte ca tag-ul img să înceapă, stricând layout-ul.

benz001 benz001
19 iul. 2014 05:53:38
1

poate acest lucru te va ajuta

remove_filter('the_content', 'wpautop')

Dar atunci va trebui să adaugi paragrafele manual pentru tot restul conținutului.

17 ian. 2011 09:54:43
Comentarii

Am luat în considerare această abordare, dar din cauză că layout-ul este excentric, așa cum am menționat, se bazează puternic pe nevoia de tag-uri p. Fac un layout cu 2 coloane de text unde tag-urile p sunt floatate la stânga pentru a crea aparența a două coloane de text. Deci poți înțelege de ce un tag p care înfășoară o imagine ar fi o problemă, pentru că ar float-ă și aceasta.

Dwayne Charrington Dwayne Charrington
17 ian. 2011 12:49:47
0

Acest articol este puțin învechit, dar există o soluție mult mai simplă, dacă nu aveți restricții legate de CSS.

Învelirea tag-ului img într-un div are un impact negativ foarte mic.

19 aug. 2011 21:48:51
2

Soska a oferit o soluție simplă.

Dar ceea ce fac eu este să extrag imaginea din conținut și să o afișez separat.

17 ian. 2011 11:46:33
Comentarii

Am luat în considerare și această opțiune și încă rămâne pe masă. Totuși, deoarece este vorba doar despre o singură imagine, pentru a evita toată agitația, aș putea folosi în schimb miniaturile articolelor recomandate, care îmi permit să controlez modul în care imaginea este afișată.

Dwayne Charrington Dwayne Charrington
17 ian. 2011 12:52:12

de asemenea, poți adăuga un câmp personalizat la postare/pagină, cum ar fi imaginea thumbnail și să salvezi calea imaginii în valoarea sa...

Avinash Avinash
17 ian. 2011 13:09:48
1

Am dezvoltat un plugin care rezolvă exact această problemă: http://wordpress.org/extend/plugins/unwrap-images/

Este mai bun decât setarea marginilor sau modificarea directă a codului WordPress pentru cei care nu doresc să se încurce cu codul, deoarece utilizează funcția nativă unwrap din jQuery pentru a elimina toate tag-urile p din jurul imaginilor.

Sper că acest lucru îi va ajuta pe cineva! Salutări, Brian

4 nov. 2011 10:18:42
Comentarii

aparent încă are peste 30+ de instalări active :D

Julix Julix
6 mai 2019 21:41:31
0

Răspunsul acceptat m-a ajutat doar cu imaginile, dar codul revizuit nu gestionează bine imaginile cu link pe site-ul meu. Acest articol de blog conține un cod care funcționează perfect.

Iată codul:

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

if ( trim($pee) === '' )
return '';
$pee = $pee . "\n"; // pentru a face lucrurile mai ușoare, adăugăm un newline la final
$pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
// Adăugăm spațiere
$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); // newlines cross-platform
if ( strpos($pee, '<object') !== false ) {
$pee = preg_replace('|\s*<param([^>]*)>\s*|', "<param$1>", $pee); // nu adăugăm paragrafe în interiorul object/embed
$pee = preg_replace('|\s*</embed>\s*|', '</embed>', $pee);
}
$pee = preg_replace("/\n\n+/", "\n\n", $pee); // eliminăm duplicatele
// creăm paragrafe, inclusiv unul la final
$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); // în anumite condiții ciudate poate crea un P doar cu spații albe
$pee = preg_replace('!<p>([^<]+)</(div|address|form)>!', "<p>$1</p></$2>", $pee);
$pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee); // nu adăugăm paragrafe în jurul unui tag
$pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // rezolvăm problema cu listele imbricate
$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); // adăugăm linii noi opțional
$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');

Noroc!

1 ian. 2012 15:19:51
2

Nu sunt expert, dar am petrecut toată după-amiaza încercând să rezolv problema imaginilor înfășurate în tag-uri p și asta a funcționat pentru mine.

Lucrez la o temă WordPress și am adăugat asta în fișierul functions.js

Funcția Jquery unwrap

$(document).ready(function (){

// pentru imagini înfășurate în tag-uri a
$('.entry a').unwrap('p');

// pentru imagini înfășurate doar în tag-uri p
$('.entry img').unwrap('p');

Acum pot lucra separat cu tag-urile p și img.

De asemenea, pot adăuga un div cu o clasă diferită în jurul imaginii folosind:

$(document).ready(function(){

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

Ultima variantă nu mi-a rezolvat problema pentru că voiam să fac tag-urile p cu display:none; așa că a trebuit să scot imaginile din ele.

18 feb. 2013 20:29:02
Comentarii

Chiar folosești ghilimele crețuite? :)

fuxia fuxia
18 feb. 2013 21:05:06

Am luat în considerare această abordare la început, dar gândul la manipularea inutilă a DOM-ului prin jQuery era prea riscantă și o posibilă suprasarcină inutilă, când poți face asta în PHP cu expresii regulate complicate.

Dwayne Charrington Dwayne Charrington
20 feb. 2013 01:29:26
0

Puneți imaginea în interiorul unui tag <div>, fără niciun caracter de spațiu între ele. Deci în loc de:

<div class="your_container">
    <div class="element1">...</div>
    <div class="element2">...</div>
    <img src="image.jpg" />
</div>

Scrieți așa:

<div class="your_container">
    <div class="element1">...</div>
    <div class="element2">...</div>
    <div><img src="image.jpg" /></div>
</div>

Am avut aceeași problemă cu elementele <a>, iar această soluție a funcționat pentru mine.

19 sept. 2020 17:33:17
2

În funcție de postare, o altă soluție ar putea fi utilizarea plugin-ului WP Unformatted pentru a dezactiva funcția auto-p pe baza fiecărei postări.

23 feb. 2011 03:33:35
Comentarii

Este destul de util, deși singura problemă pe care o văd este că dacă vrei ca imaginile să nu aibă tag-uri P, dar și să ai text în pagina ta, va fi o mare dezordine. Această soluție ar fi probabil bună pentru postările care au doar imagini și poate câteva rânduri de text. Totuși, util.

Dwayne Charrington Dwayne Charrington
23 feb. 2011 03:59:05

Da, de aceea am spus că depinde de postare.

Synetech Synetech
23 feb. 2011 04:48:42
0

În cazul în care cineva caută o metodă rapidă și murdară de a rezolva această problemă pentru orice tag, iată ce am făcut eu:

  1. mergi la wp-content/formatting.php
  2. găsește funcția wpautop. (dacă nu ai observat, este WP-AUTO-P, înțelegi?)
  3. găsește variabila "all blocks", ar trebui să fie ceva de genul $allblocks = '(?:table|thead|tfoot|capti...
  4. la final adaugă blocul pe care vrei să-l excludi - img, a, etc... de exemplu, dacă se termină în (...)menu|summary)'; modifică în (...)menu|summary|a)'; pentru a adăuga tagul a și a evita autop-ul. Atenție la separatorul pipe | - este sintaxă regex!

Asta e tot, spor la Wordpress-uit!

12 aug. 2018 01:04:00