Получение первого абзаца каждой записи в WordPress
У меня есть код, который использует preg_match для извлечения первого абзаца и вывода его в цикле:
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;
}
Однако есть небольшая проблема с этим кодом. Он работает только когда я вручную оборачиваю текст в теги <p> </p>
в редакторе, но не в других случаях. Регулярные выражения - определенно не моя сильная сторона, поэтому любая помощь или дополнительное объяснение будет очень полезно.
А этот вариант работает и также оборачивает изображения/iframe в теги 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;
}

Вы можете использовать эту функцию:
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>';
}
и затем вызвать её в вашем цикле с помощью:
<?php echo get_first_paragraph(); ?>
Ключевой момент здесь - это функция WordPress wpautop, которая преобразует двойные переносы строк в тексте в правильные параграфы.
С помощью wpautop вы можете затем использовать PHP-функцию substr для получения первого параграфа, начиная с первого символа до первого закрывающего тега параграфа, и затем добавить 4 символа, чтобы закрывающий тег не был удалён.
Для дальнейшего расширения функционала, если вам нужно получить всё содержимое кроме первого параграфа, вы можете использовать эту дополнительную функцию, которая начнёт с конца первого закрывающего тега параграфа и возьмёт всё после него:
function get_the_post(){
global $post;
$str = wpautop( get_the_content() );
$str = substr( $str, (strpos( $str, '</p>')));
return $str;
}
и вызвать её в цикле с помощью:
<?php echo get_the_post(); ?>

Попробуйте это:
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];
}

Нет! Это ничего не выводит, даже когда я вручную добавляю <p> в редакторе. Может ли это быть связано с тем, что post_content не форматируется как the_content()?

WordPress автоматически добавляет теги <p>
к вашему контенту, это то, что делает apply_filters('the_content');
и wpautop
. Странно, что это не работает, так как я взял этот код с сайта, над которым недавно работал, и он извлекал первые два абзаца, чтобы я мог разместить их в 2 колонках.. На данном этапе я не уверен - вам нужно предоставить больше кода (например, цикл и т.д., где вы хотите вывести контент).
