Получение первого абзаца каждой записи в WordPress

20 дек. 2013 г., 13:47:53
Просмотры: 13.9K
Голосов: 3

У меня есть код, который использует 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;
}
0
Все ответы на вопрос 2
0

Вы можете использовать эту функцию:

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(); ?>
29 мая 2014 г. 07:01:30
3

Попробуйте это:

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 дек. 2013 г. 13:57:29
Комментарии

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

tmyie tmyie
20 дек. 2013 г. 14:06:23

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

Nathan Fitzgerald - Fitzgenius Nathan Fitzgerald - Fitzgenius
20 дек. 2013 г. 14:09:19

Привет, Натан, спасибо. Я изменил свою функцию, но похоже, что она работает только для последней записи, а не для всех.

tmyie tmyie
20 дек. 2013 г. 14:12:09