“P” Etiketi İle Resim Sarma Wordpress'i Durdur


33

Bunun için basit bir çözüm bulmak için yüksek ve düşük aradım, ancak boşuna. Wordpress, resimlerimi p etiketleriyle sarmalamaya devam ediyor ve üzerinde çalıştığım bir sitenin düzeninin eksantrik niteliği nedeniyle, bu çok can sıkıcı bir durum.

Görüntüleri açmak için bir jQuery çözümü yarattım, ama o kadar da iyi değil. Sayfaya yüklenen diğer sayfalar nedeniyle kalıyor ve bu nedenle değişikliklerin yapılması yavaş. Wordpress'in yalnızca p etiketli görüntüleri sarmasını önlemenin bir yolu var mı? Belki çalıştırılabilir bir kanca veya filtre.

Bir resim yüklerken ve ardından WYSIWYG editörüne eklerken bu oluyor. Kod görünümüne elle girmek ve p etiketlerini kaldırmak, istemci teknik olarak beceriksiz olmadığı için bir seçenek değildir.

Görüntülerin satır içi olduğunu biliyorum, ancak sitenin kodlu görüntülerine sahip olma biçimleri divs içinde ve blok olarak ayarlanmış durumda, bu nedenle geçerli kodlar.


Yanıtlar:


34

işte dün bir müşteri sitesinde yaptığımız sorunla tam olarak karşılaştığımız şey ... ... eklenti olarak hızlı bir filtre oluşturdum ve etkinleştirdim.

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

Bunu / wp-content / plugins klasörünüzdeki bir php dosyasına bırakıp etkinleştirirseniz, p etiketlerini yalnızca görüntü içeren herhangi bir para biriminden kaldırması gerekir.

Regexp'in diğer editörlerin çıktılarıyla başarısız olup olmayacağı konusunda ne kadar güçlü olduğundan emin değilim - örneğin, img etiketi sadece>> ile başarısız olduğunda kapanır. Herhangi birinin daha güçlü bir şeyi varsa, bu gerçekten yardımcı olacaktır.

Alkış,

James

--- Geliştirilmiş filtre ---

Bağlantılara sarılmış görüntülerle çalışmak için bağlantıları çıkışta tutar ve p etiketlerini kaldırır.

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

Şüphesiz, bu doğru cevaptır. Teşekkürler James, denedim ve çok çalışıyor.
Dwayne Charrington

Merhaba @Dwayne - Geri bildiriminiz için teşekkür ederiz. Bağlantıları işleyecek gelişmiş bir filtre ekledim, şimdi müşteri sitemizde kullanıyoruz.
jamesc

Bunu kesinlikle Wordpress eklenti havuzuna koymalısınız. Hızlı bir google araması, pek çok kişinin bu sorunu yaşadığını ve iyi bir çözümü olmadığını gösteriyor.
Geoffrey Burdett

1
Bunun HTML5 varsayılan imgişaretlemesiyle, yani <img ...>kapanış çizgisi olmadan çalışmayacağını unutmayın . Bunu regex'inizde isteğe bağlı yapmak daha iyidir. Ya da daha iyisi, onunla .*ilgilenecek şekilde dışarıda bırakabilirsiniz .
Bram Vanroy

Herhangi biri <img ...>olmadan çalışmasını sağlayan oldu />mu?
Runnick

13

Temel olarak, WordPress'i img gibi biçimlendirmek amacıyla blok seviyesindeki öğeye benzetmenizi sağlamanız gerekir . Bu elemanlar kodlanmıştırwpautop() ve liste ne yazık ki filtrelenmez.

Yapmam gereken şey:

  1. wpautop()Farklı ad altında çatal .
  2. Değişkende imgregexp ekleyin $allblocks.
  3. Kaldır wpautopdan the_contentfiltresi.
  4. Çatallı versiyonunuzu şuna ekleyin the_content.
  5. Öncelikle oynamanız gerekebilir ve işlem sırasındaki değişiklik nedeniyle bir şey bozulursa muhtemelen diğer filtreleri kaldırmanız ve yeniden eklemeniz gerekebilir.

Bu yaklaşımı deneyeceğim. İmg etiketini allblocks değişkenine eklemeyi hiç düşünmedim, bu dahi bir fikir. Nasıl gittiğimi göreceğim.
Dwayne Charrington

İlk önce iyi çalıştı, sonra bir resim bir bağlantı etiketi içindeyken ve ikisi de zaten bir paragrafın içindeyken senaryoya çarptım (p> img> a). İmg bir blok olarak kabul edildiğinde, wp-autop, img etiketi başlamadan önce paragraf etiketini kapatır ve düzeni bozar.
benz001

2

belki bu yardımcı olur

remove_filter('the_content', 'wpautop')

Ama sonra her şeyin paragrafını manuel olarak ekleyeceksin.


Bu yaklaşımı göz önünde bulundurdum, ancak p etiketlerine ihtiyaç duyduğuna çok fazla güvendiğim dediğim gibi mizanpaj eksantrik. 2 sütunlu metin yapıyorum, p etiketlerinin bırakıldığı yerde 2 sütun metin görünümü vermek için kaldı. Böylece, bir resmi sarmalayan bir ap etiketinin neden bir sorun olacağını anlayabilirsiniz, çünkü onu da yüzüyor.
Dwayne Charrington

1

Soska bir / kolay yol verdi.

Ama yaptığım şey, içeriği görüntüden çıkarmak ve ayrı ayrı görüntülemek.


Bunu da düşündüm ve hala bir seçenek. Bununla birlikte, tüm zorlukları kurtarmak için yalnızca bir resim olduğundan, resmin nasıl görüntüleneceğini kontrol etmeme izin veren sadece post-post küçük resimleri kullanabilirim.
Dwayne Charrington

ayrıca yazıya / sayfaya özel resim ekleyebilir, örneğin başparmak görüntüsü ve görüntü yolunu değerine kaydedebilirsiniz ...
Avinash

1

Bu gönderi biraz eski, ancak CSS'yi sizin tarafınızdan engelleyen daha basit bir çözüm var.

İmg etiketinin bir div içine sarılması çok az olumsuz etkiye sahiptir.


1

Bu sorunu çözen bir eklenti geliştirdim: http://wordpress.org/extend/plugins/unwrap-images/

J etiketini ayarlamak istemedikleri için kenar boşluğunu ayarlamak veya doğrudan Wordpress koduna dalmaktan iyidir, çünkü p etiketlerinin tüm görüntülerini açmak için jQuery'nin yerel paket açma işlevini kullanır.

Umarım bu birine yardımcı olur! Şerefe, Brian.


görünüşe göre hala 30+ aktif kurulum var: D
Julix

1

Kabul edilen cevap sadece resimlerle ilgili bana yardımcı oldu, ancak gözden geçirilmiş kod sitemdeki bağlantılı görüntüleri iyi işlemiyor. Bu blog yazısı, mükemmel çalışan bir koda sahiptir.

İşte kod:

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

Şerefe!


1

Ben bir uzman değilim ama sadece öğleden sonrayı p etiketleriyle sarılmış deg'leri çözmeye çalışarak geçirdim ve bu benim için işe yaradı.

WordPress tabanlı bir tema üzerinde çalışıyorum ve bunu daha fazla bilmiyorum

Jquery işlevi açmak

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

şimdi p ve ayrı ayrı çalışabilirim.

Ayrıca bunu kullanarak img etrafında farklı bir sınıfa sahip bir div ekleyebilirsiniz:

$(document).ready(function (){

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

bu sonuncusu sorunumu çözmedi çünkü ekranlı p etiketleri yapmak istedim: none; Bu yüzden o img'leri oradan çıkarmak zorunda kaldım.


3
Gerçekten kıvırcık tırnak kullanıyor musunuz? :)
fuxia

İlk önce bu yaklaşımı düşündüm, ancak jQuery üzerinden gereksiz DOM manipülasyonu düşüncesi, bunu PHP'de zor düzenli ifadelerle yapabileceğiniz zaman çok büyük bir risk ve potansiyel gereksiz yük oldu.
Dwayne Charrington,

0

Gönderiye bağlı olarak, başka bir çözüm de WP Biçimlendirilmemiş eklentiyi, her bir gönderi başına auto-p işlevini devre dışı bırakmak için kullanmak olabilir .


Bu oldukça yararlı, görebildiğim tek uyarı, görüntülerin P etiketlerinin olmasını değil, sayfanızda da metinlerin olmasını istiyorsanız, bunun çok büyük bir karmaşa olacağı yönünde. Bu, muhtemelen sadece görüntüleri ve belki de birkaç satırlık metin içeren yazılar için iyi olacaktır. Yine de faydalı.
Dwayne Charrington

Evet, bu yüzden direğe bağlı olduğunu söyledim.
Synetech

0

Birisi herhangi bir etiket için bunu düzeltmek için hızlı ve kirli bir yol arıyorsanız, işte yaptığım:

  1. wp-content / formatting.php adresine gidin
  2. wpautop işlevini bulur. (kaçırdıysanız, WP-AUTO-P , anladınız mı?)
  3. "tüm bloklar" değişkenindeki yüzgeçler gibi bir şey olmalı $allblocks = '(?:table|thead|tfoot|capti...
  4. - sonunda sen omit isteyen blok eklemek img, ao biterse örneğin ... vb (...)menu|summary)';Değişikliğin (...)menu|summary|a)';eklemek için aetiket ve önlemek autopeeing bunu. Boru |ayırıcısına dikkat edin - regex sözdizimi!

İşte bu, mutlu Wordpressing!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.