Функция укороченной выдержки работает должным образом только для сообщений с выдержкой - PullRequest
0 голосов
/ 08 мая 2020

Я использую следующее, чтобы сократить отрывок, если он превышает определенное количество символов, при этом не сокращая последнее слово.

ob_start();
the_excerpt();
$excerpt = ob_get_clean();
  
	if (strlen($excerpt) < 200) {
      echo $excerpt;
        } else {
            $new = wordwrap($excerpt, 200);
            $new = explode("\n", $new);

            $new = $new[0] . '...';

            echo $new;
        }

Проблема в том, что это работает, только если установлен отрывок, если отрывок не отображает только первую строку или первое предложение - см. Фото. Я понимаю, что the_excerpt вытягивает the_content, если нет выдержки, но не понимаю, почему перенос слов не работает должным образом, когда вместо выдержки используется контент?

The first two images have no excerpt last one has

Ответы [ 2 ]

0 голосов
/ 11 мая 2020

В итоге я использовал несколько другой способ сократить отрывок, и это сработало. Другой код определенно работал, и только в приведенном выше примере он показывал 7 слов, счетчик символов в основном работал только до тех пор, пока не был разрыв строки, а затем он вырезал остальную часть содержимого.

У меня есть дополнительно добавлен «фильтр», чтобы избавиться от тегов строки html, чтобы в отрывке не было разрывов строк, так как буферизация чистого вывода удаляет фильтр wpautop.

<?php ob_start();
		the_excerpt();
		$excerpt = ob_get_clean();
		$excerpt = preg_replace('/<.*?>/', '', $excerpt);;
		?>
		<?php 
		if ( strlen( $excerpt ) > 320 ) {

			$cut = substr( $excerpt, 0, 320 );
	
			$excerpt = substr( $cut, 0, strrpos( $cut, ' ' ) ) . '...';

			echo $excerpt;
		} else {
            echo $excerpt;
        }  
0 голосов
/ 10 мая 2020

Можете ли вы провести этот эксперимент:

ob_start();
the_excerpt();
$excerpt = ob_get_clean();

if (strlen($excerpt) < 200) {
    echo $excerpt;
} else {
    $i = strpos($excerpt, ' ');
    $new = wordwrap($excerpt, 200);
    $new = explode("\n", $new);
    $j = count($new);
    $new = $new[0] . '...';
    echo "<div style=\"border:3px solid red;\">first space at $i<br>count is $j</div>";
    echo $new;
}

Я думаю, ваш код правильный. Похоже, что единственный способ потерпеть неудачу - это wordwrap () не может найти никаких пробелов или wordwrap () не вставляет "\ n" - ни то, ни другое не кажется разумным, но что-то не так. После прочтения комментария Альберто Марина я думаю, что проблема в том, что ваш код либо не работает, либо полностью заменяется закрывающим буфером вывода. В этом случае красный div не появится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...