Divida la cadena HTML en una matriz basada en elementos de nivel principal

3 minutos de lectura

Necesito convertir la cadena HTML devuelta por the_content(); en WordPress a una matriz de cada elemento de nivel principal. Por ejemplo:

<h3>My subtitle</h3>
<p>Some content here</p>
<blockquote><p>A blockquote goes here</p></blockquote>

Se convertiría:

array['<h3>My subtitle</h3>', '<p>Some content here</p>', '<blockquote> <p>A blockquote goes here</p></blockquote>']

La razón por la que queremos hacer esto es para insertar un anuncio en el contenido, después del primer párrafo si el primer párrafo o bloque de contenido tiene más de 670 caracteres, o después del segundo párrafo si el contenido es más corto. El desafío es si alguno de esos párrafos está envuelto por otro elemento, o si hay otro elemento involucrado.

Este es el código que tengo actualmente:

$content = apply_filters('the_content', get_the_content());
$content = explode("</p>", $content);
$firstParagraphLength = strlen($content[0]);

if($firstParagraphLength > 670) {
    $paragraphAdAfter = 1;
} else {
    $paragraphAdAfter = 2;
}

// If this is after the target paragraph, insert ad code first
for ($i = 0; $i <count($content); $i++) {
    if ($i == $paragraphAdAfter) { ?>
        <!-- AD CODE -->
        My ad code goes here, great!
    <?php
    }
        echo $content[$i] . "</p>";
} ?>

Esto realmente funciona, pero si hay una cita en bloque en el primer párrafo o en el segundo, el anuncio se inserta en el elemento de cita en bloque. Los datos son bastante dinámicos, por lo que necesito encontrar una forma de dividirlos según los elementos del nivel principal, ya sean citas en bloque, párrafos, titulares, etc.

  • Utilice domdocument: seguro.php.net/manual/en/class.domdocument.php

    – Venkat.R

    31 dic. 15 a las 17:55

  • ¿Has considerado la API de código abreviado para que los autores de contenido puedan decidir dónde se coloca el anuncio?

    – Volomike

    31 dic. 15 a las 17:59

  • Además, no podemos proporcionar una respuesta aquí si no especifica si se trata de un complemento o un tema. Es posible que también desee investigar wordpress.stackexchange.com que es bastante rico con cosas geniales.

    – Volomike

    31 dic. 15 a las 18:02

  • @Volomike, es posible con Core PHP Code. mira esto !

    – Venkat.R

    31 dic. 15 a las 18:04

  • @Venkatraman gracias, ¡échale un vistazo! Un poco confundido pero lo intentaré

    –Romina Barrett

    31 dic. 15 a las 18:05

Pruebe el siguiente fragmento de código usando DOMDocument

$string = '
<h3>My subtitle</h3>
<p>Some content here</p>
<blockquote><p>A blockquote goes here</p></blockquote>
';

$dom = new DOMDocument;
$dom->loadHTML($string);

foreach($dom->getElementsByTagName('*') as $node)
{
    $array[] = $dom->saveHTML($node);
}

print_r($array);

URL de demostración:
http://sandbox.onlinephpfunctions.com/code/e382a845f121f8c4a56595f075a9b1d9fee2d2de

  • Esto funciona si paso un parámetro a getElementsByTagName como ‘p’, pero con un asterisco por alguna razón, trata todo el contenido HTML como una sola etiqueta como el primer elemento de la matriz, y luego se comporta correctamente. No estoy seguro de por qué, pero si solo excluyo el primer pase, funciona correctamente. ¡Gracias!

    –Romina Barrett

    31 dic. 15 a las 18:52

  • @volomike, Espero que estés de acuerdo con esto, avísame si tienes alguna pregunta.

    – Venkat.R

    31 dic. 15 a las 18:54


.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad