Verifique se o primeiro parágrafo é uma imagem, então, mostre o código personalizado logo depois?

Gostaria de adicionar algum código em functions.php que faz isso:

Como eu faço isso? Um exemplo de trecho de código é muito bem-vindo.

PS: O código personalizado também pode ser um anúncio (por exemplo, o Google Adsense).

Solutions Collecting From Web of "Verifique se o primeiro parágrafo é uma imagem, então, mostre o código personalizado logo depois?"

Como sobre algumas linhas simples Com jQuery?

 jQuery(document).ready( function ($) { if ($(".entry-content:first-child").has('img').length) //this check for the img tag $(".entry-content:first-child").after("
MY CUSTOM CODE
"); else $(".entry-content:first-child").before("
MY CUSTOM CODE
"); });

Atualizar:

Aqui está uma solução simples usando o DOMDocument nativo do php

 add_filter('the_content','add_code_before_afterImage'); function add_code_before_afterImage($content){ $MYCODE = '
this is my custom code
'; $doc = new DOMDocument(); @$doc->loadHTML('< ?xml encoding="'.get_bloginfo('charset').'">'.$content); $ps = $doc->getElementsByTagName('p'); foreach ($ps as $p) { if (false !== stripos($p->nodeValue,'img')); return str_replace($p->nodValue, $p->nodValue.$MYCODE, $content); } break; } //if we got here then there is no img tag in the first paragraph //so we return the code before the content. return $MYCODE.$content; }

Atualização 2:

O comentário de @ Sarathi me faz pensar que você realmente não precisa analisar qualquer parte do conteúdo, basta puxar o primeiro parágrafo e verificar se ele tem uma tag img, então aqui está uma solução mais simples e, por muito mais rápida, usando apenas o str_replace e stripos nativos do PHP

 add_filter('the_content','simple_img_tag_search'); function simple_img_tag_search($content){ $MYCODE = '
this is my custom code
'; //split content to first paragraph and the rest $paragraphs = explode( '', $content, 2 ); //extract the first paragraph $first_paragraph = $paragraphs[0]; //then just look for img tag if (false === stripos($first_paragraph, "',$first_paragraph.''.$MYCODE,$content); } }

Para pegar o primeiro parágrafo (

), você pode usar um regex. Isso não é ótimo , então seja avisado. 🙂

Em seguida, você teste a correspondência para uma imagem e insira o conteúdo extra, dependendo do resultado do teste. Eu uso duas funções aqui, uma para cada etapa: a primeira encontra o primeiro parágrafo, a segunda muda a primeira partida.

 // Late priority parameter to let shortcodes and other filters do their work first. add_filter( 'the_content', 'wpse_52662_add_extra', 1000 ); /** * Reads the content and calls a callback to add extra content. * * @param string $content * @return string */ function wpse_52662_add_extra( $content ) { // restrict to single posts: if ( ! is_single() ) { return $content; } return preg_replace_callback( '~

|\s+[^>]*>)(.*?)

~miU' // find

, 'wpse_52662_callback' // pass the result to the callback , $content , 1 // stop after first match ); } /** * Callback for wpse_52662_add_extra() * * @param array $m Matches. $m[0] contains the whole match, * $m[2] the content of the paragraph. * @return string */ function wpse_52662_callback( $m ) { $extra = '

Hello World!

'; return ( FALSE === strpos( $m[2], '

Você pode usar DOMDocument para analisar o conteúdo HTML assim:

 add_filter( 'the_content', 'add_html_after_first_image' ); function add_html_after_first_image( $content ) { $my_custom_html = '
MY CUSTOM CODE
'; // Create a dom document from the post content. // The content needs to be wrapped in a root element to be valid xml, hence the div tags. // I used loadXML because loadHTML adds the unnecessary , , and . if( $dom = DOMDocument :: loadXML( '
' . $content . '
' ) ) { // Create a document fragment with your custom html. $custom = $dom -> createDocumentFragment(); $custom -> appendXML( $my_custom_html ); // Get the root element, and first child. $root = $dom -> firstChild; $first = $root -> firstChild; // Check if the first child is a paragraph, the first grandchild is an image, // and if the paragraph has no content other than the image. $has_image = 'p' == $first -> tagName && '' == trim( $first -> textContent ) && 1 == count( $first -> childNodes ) && 'img' == $first -> firstChild -> tagName; // If $has_image is true then add the custom div after the first paragraph, // otherwise add it before. $root -> insertBefore( $custom, $has_image ? $first -> nextSibling : $first ); // Set the new content to the altered html. $content = $dom -> saveHTML(); } return $content; }

EDITAR:

Aqui está uma function atualizada que foi otimizada para executar mais rapidamente do que a function acima.

Dica: a marca

não deve conter nenhum conteúdo diferente da tag .

(Isso inclui espaços em branco)

 add_filter( 'the_content', 'add_html_after_first_image' ); function add_html_after_first_image( $content ) { $my_custom_html = '
MY CUSTOM CODE
'; // Explode the content to extract and parse only the first paragraph. $parts = explode( '', $content, 2 ); $p = $parts[0] . ''; // Create a dom document from the first paragraph of content. // I used loadXML because loadHTML adds the unnecessary , , and . // Checking for an opening

tag prevents the creation of a DOMDocument, // and lowers the execution time on posts that don't start with a paragraph. if( substr( $p, 0, 3 ) == '

' && $dom = @DOMDocument :: loadXML( $p ) ) { // Create a document fragment with your custom html. $custom = $dom -> createDocumentFragment(); $custom -> appendXML( $my_custom_html ); $first = $dom -> firstChild; // Check if the first child is a paragraph, the first grandchild is an image, // and if the paragraph has no content other than the image. $has_image = 'p' == $first -> tagName && '' == $first -> textContent && 1 == count( $first -> childNodes ) && 'img' == $first -> firstChild -> tagName; // If $has_image is true then add the custom div after the first paragraph, // otherwise add it before. $dom -> insertBefore( $custom, $has_image ? $first -> nextSibling : $first ); // Set the new content to the altered html. $p = $dom -> saveHTML(); } // If the dom document could not be created, then the first element is not a // paragraph and the custom code should be prepended to the content. else $p = $my_custom_html . $p; // Append the rest of the content to the paragraph. return $p . $parts[1]; }