Eliminare paragraf din jurul unei poze

WordPress are tendința nefericită de a împacheta aproape totul în etichetele <p>. Deși acest lucru este adesea util pentru blocurile de text dintr-o postare, acesta limitează capacitatea noastră de a crea imagini în mod succint și consistent, indiferent de conținutul lor, care conține tagul <a>, <p> sau ambele. Cu alte cuvinte, rareori doriți ca <a> stilurile de etichete (de ex., Border-bottom &: hover) sau <p> stiluri (de exemplu, marginea-jos și max-lățimea) să afecteze stilul imaginilor copilului. Cea mai curată soluție găsită este să scriu o expresie regulată care să filtreze post_content și să înlăture tagurile <p> în jurul <img> în timp ce păstrează textul înconjurător și stilul său (de exemplu, caractere aldine, italice).

Functia care face asta posibil se adauga in functions.php este:

<?php
/**
 * Move image inside <p> tag above the <p> tag while preserving any link around image.
 * Can be prevented by adding any attribute or whitespace to <p> tag, e.g. <p class="yolo"> or even <p >
 */
function gc_remove_p_tags_around_images($content)
{
	$contentWithFixedPTags =  preg_replace_callback('/<p>((?:.(?!p>))*?)(<a[^>]*>)?\s*(<img[^>]+>)(<\/a>)?(.*?)<\/p>/is', function($matches) 
	{
		/*
		Groups 	Regex 			Description
			<p>			starting <p> tag
		1	((?:.(?!p>))*?)		match 0 or more of anything not followed by p>
			    .(?!p>) 		anything that's not followed by p>
			  ?: 			non-capturing group. 
				    *?		match the ". modified by p> condition" expression non-greedily
		2	(<a[^>]*>)?		starting <a> tag (optional)
			\s*			white space (optional)
		3	(<img[^>]+>)		<img> tag
			\s*			white space (optional)
		4	(<\/a>)? 		ending </a> tag (optional)
		5	(.*?)<\/p>		everything up to the final </p>
			i modifier 		case insensitive
			s modifier		allows . to match multiple lines (important for 1st and 5th group)
		*/
			
		// image and (optional) link: <a ...><img ...></a>
		$image = $matches[2] . $matches[3] . $matches[4];
		// content before and after image. wrap in <p> unless it's empty
		$content = trim( $matches[1] . $matches[5] );
		if ($content) {
			$content = '<p>'. $content .'</p>';
		}
		return $image . $content;
	}, $content);
	
	// On large strings, this regular expression fails to execute, returning NULL
	return is_null($contentWithFixedPTags) ? $content : $contentWithFixedPTags;
}
add_filter('the_content', 'gc_remove_p_tags_around_images');

 

Lasă un răspuns

Adresa ta de email nu va fi publicată.

Alte articole din aceiasi categorie