web-dev-qa-db-fra.com

Prenez le premier paragraphe de chaque message

J'ai du code qui utilise preg_match pour saisir le premier paragraphe, puis le cracher dans la boucle:

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;
}

Cependant, cela pose un petit problème. Cela ne fonctionne que lorsque j'emballe manuellement le texte dans les balises <p> </p> dans l'éditeur, et non autrement. Les expressions régulières ne sont certainement pas mon forté, donc toute aide ou compréhension serait formidable.

Et cela fonctionne, enveloppe également les images/iframes dans les balises 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;
}
2
tmyie

Vous pouvez utiliser cette fonction:

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

puis appelez-le dans votre boucle avec:

<?php echo get_first_paragraph(); ?>

La partie magique que vous recherchez est wpautop , une fonction Wordpress, qui convertira les doubles sauts de ligne dans le texte en paragraphes appropriés.

Avec wpautop en place, vous pouvez ensuite utiliser PHP function substr pour obtenir le premier paragraphe à partir du premier caractère jusqu'à ce qu'il atteigne le premier paragraphe de clôture, puis ajouter 4 caractères de sorte que la balise de fermeture n'est pas dépouillée.


Pour approfondir ceci, si vous voulez tout obtenir, à l'exception du premier paragraphe, vous pouvez utiliser cette fonction complémentaire qui commencera à la fin de la première balise de paragraphe de fermeture et contiendra tout après:

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

et appelez-le dans la boucle avec:

<?php echo get_the_post(); ?>
2
davidcondrey

Essaye ça:

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]; 
}