Obtener el primer párrafo de cada publicación

20 dic 2013, 13:47:53
Vistas: 13.9K
Votos: 3

Tengo un código que usa preg_match para obtener el primer párrafo y mostrarlo en el loop:

function first_paragraph() {
  global $post, $posts;
  $first_para = '';
  ob_start();
  ob_end_clean();
  $output = preg_match_all('%(<p[^>]*>.*?</p>)%i', $post->post_content, $matches);
  $first_para = $matches [1] [0];
  echo $first_para;
}

Sin embargo, hay un pequeño problema con esto. Solo funciona cuando envuelvo manualmente el texto en etiquetas <p> </p> en el editor, y no en otros casos. Las expresiones regulares ciertamente no son mi fuerte, así que cualquier ayuda o explicación adicional sería genial.

Y esta versión funciona, además envuelve imágenes/iframes en etiquetas p:

function first_paragraph() {
  global $post, $posts;
  $first_para = '';
  ob_start();
  ob_end_clean();
  $post_content = $post->post_content;
  $post_content = apply_filters('the_content', $post_content);
  $output = preg_match_all('%(<p[^>]*>.*?</p>)%i', $post_content, $matches);
  $first_para = $matches [1] [0];
  echo $first_para;
}
0
Todas las respuestas a la pregunta 2
0

Puedes usar esta función:

function get_first_paragraph(){
    global $post;
    $str = wpautop( get_the_content() );
    $str = substr( $str, 0, strpos( $str, '</p>' ) + 4 );
    $str = strip_tags($str, '<a><strong><em>');
    return '<p>' . $str . '</p>';
}

y luego llamarla en tu loop con:

<?php echo get_first_paragraph(); ?>

La parte mágica que buscas es wpautop, una función de WordPress, que convertirá los saltos de línea dobles en el texto a párrafos adecuados.

Con wpautop en su lugar, puedes usar la función PHP substr para obtener el primer párrafo comenzando desde el primer carácter hasta que encuentre el primer cierre de párrafo, y luego agregar 4 caracteres para que la etiqueta de cierre no sea eliminada.


Para expandir esto aún más, si deseas obtener todo excepto el primer párrafo puedes usar esta función complementaria que comenzará al final de la primera etiqueta de cierre de párrafo y obtendrá todo lo que venga después:

function get_the_post(){
    global $post;
    $str = wpautop( get_the_content() );
    $str = substr( $str, (strpos( $str, '</p>')));
    return $str;
}

y llamarla en el loop con:

<?php echo get_the_post(); ?>
29 may 2014 07:01:30
3

Prueba esto:

function first_paragraph() {
    global $post, $posts;
    $post_content = $post->post_content;
    $post_content = apply_filters('the_content', $post_content);
    $post_content = str_replace('</p>', '', $post_content);
    $paras = explode('<p>', $post_content);
    array_shift($paras);

    return $paras[0]; 
}
20 dic 2013 13:57:29
Comentarios

¡No! Eso no produce nada, incluso cuando agrego manualmente <p> en el editor. ¿Tiene algo que ver con que post_content no se formatea como the_content()?

tmyie tmyie
20 dic 2013 14:06:23

WordPress agregará automáticamente etiquetas <p> a tu contenido, eso es lo que hace apply_filters('the_content'); y wpautop, es extraño que esto no funcione ya que lo tomé de un sitio en el que trabajé recientemente, pero tomó los primeros dos párrafos para poder colocarlos en 2 columnas... En este momento no estoy seguro, necesitas proporcionarme más código (en términos del loop, etc. donde deseas mostrar el contenido).

Nathan Fitzgerald - Fitzgenius Nathan Fitzgerald - Fitzgenius
20 dic 2013 14:09:19

Hola Nathan, gracias. He cambiado mi función, pero parece que solo funciona en la publicación más reciente, en lugar de en todas.

tmyie tmyie
20 dic 2013 14:12:09