El problema es bastante simple … solo desea contar una etiqueta específica en una página e insertar algo de contenido. Después o antes, es solo una cuestión de perspectiva. Entonces, digamos que desea que se inserte un anuncio, por ejemplo, después de la cuarta etiqueta H2.
Así que vayamos e insertemos un código de anuncio o cualquier otro bloque de contenido después de alguna etiqueta HTML. Aquí tenemos una función PHP simple:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function interBlock($content, $ad=null, $element="</h3>", $afterElement=3, $minElements=5) { // Configure su bloque para que se inserte aquí if (!$ad) $ad ='<h1>Your block here</h1>'; // contenido dividido $parts = explode($element, $content); // contar ocurrencias de elementos $count = count($parts); // comprobar si se encuentran los elementos mínimos requeridos if(($count-1)<$minElements) return $content; $output=''; for($i=0; $i<$count; $i++) { // esta es la parte central que reúne todo el contenido $output .= $parts[$i-1] . $element . (($i==$afterElement) ? $ad : ''); // esto se insertará después de |
… y puedes simplemente llamarlo así:
1 |
echo interBlock($my_content, $myAd, '</h2>', 4, 8); |
Esto colocará, $ myAd en $ myContent, después de la cuarta aparición de la etiqueta de cierre si hay al menos 8 apariciones de la etiqueta mencionada. Eso fue simple, ¿verdad? Ahora complicémonos un poco más.
Insertar bloque antes de que ocurra la etiqueta HTML
¿Y qué tal si necesitas agregar el contenido, antes del cuarto título? Vamos a hacer eso. Solo tendrás que cambiar la etiqueta por la etiqueta de apertura HTML, cambiar el orden donde se imprime todo el contenido.
1 |
$output .= (($i==$afterElement) ? $ad : '') .($i==1 ? $parts[0]:'') . $element . $parts[$i]; // esto se insertará antes |
Insertar bloque antes o después de una etiqueta alternativa
Ahora imaginemos que queremos insertar un anuncio después del tercer título de la página. Pero si no tenemos suficientes títulos en la página, solo queremos colocar un anuncio después del cuarto párrafo. Ese es un escenario razonable, ¿no?
Así que modifiquemos nuestra función. En lugar de devolver el contenido cuando no se encuentra el número mínimo de elementos, simplemente buscaremos $AlternativeTag como hicimos en primer lugar.
1 2 3 4 5 6 7 |
// comprobar si se encuentran los elementos mínimos requeridos if(($count-1)<$minElements) { $parts = explode($altElement, $content); // comprobar la etiqueta alternativa $count = count($parts); if(($count-1)<$minElements) return $content; // puede darse por vencido aquí y simplemente devolver el contenido original $element = $altElement; // continúe usando una etiqueta alternativa en lugar de la principal } |
En este punto, puede dejar que la función continúe porque está utilizando la etiqueta alternativa.
Y la función mixta final
Así es como se verá la función PHP final. Puede usarlo para agregar bloques de contenido después de un cierto número de ocurrencias de etiquetas HTML.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function interBlock($content, $ad=null, $element="<h3>", $altElement='<h3>', $afterElement=1, $minElements=5) { // Configure su bloque para que se inserte aquí if (!$ad) $ad ='<h1>Your block here</h1>'; // contenido dividido $parts = explode($element, $content); // contar ocurrencias de elementos $count = count($parts); // comprobar si se encuentran los elementos mínimos requeridos if(($count-1)<$minElements) { $parts = explode($altElement, $content); //comprobar la etiqueta alternativa $count = count($parts); if(($count-1)<$minElements) return $content; // puede darse por vencido aquí y simplemente devolver el contenido original $element = $altElement; // continúe usando una etiqueta alternativa en lugar de la principal } $output=''; for($i=1; $i<$count; $i++) { // esta es la parte central que reúne todo el contenido //$output .= $parts[$i-1] . $element . (($i==$afterElement) ? $ad : ''); // esto se insertará después de $output .= ($i==1 ? $parts[0]:'') . (($i==$afterElement) ? $ad : '') . $element . $parts[$i]; // esto se insertará antes } return $output; } |
…. y esta es la forma en que lo llama para insertar un bloque antes de la cuarta etiqueta H2. Si no tiene 8 H2, utilizará la etiqueta H3.
1 |
echo interBlock($my_content, $myAd, '<h2>', '<h3>', 4, 8); |
Dado que casi todos los parámetros tienen un valor predeterminado en la definición de la función, puede ajustarlo a sus necesidades y simplemente llamar a la función con la var requerida $ my_content.
1 |
echo interBlock($my_content); |
Nota:
Por supuesto, hay otros escenarios y puede construir una función robusta o incluso una clase para lograr un uso más dinámico. Por ejemplo, puede usar una matriz de elementos para dividir el contenido, puede agregar un si para cambiar entre después y antes según la estructura de la etiqueta, etc.
Siéntete libre de hacerlo, adáptalo a tus necesidades.