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