#php #wordpress
Вопрос:
Я пытаюсь закончить выдержки предложением для определенного типа сообщений на моем веб-сайте, но по какой-то причине это также влияет на выдержки из страниц, и я не могу понять, почему.
function vhr_variable_length_excerpt($text, $w_length, $finish_sentence){
global $post;
if ( $post->post_type == 'poi' ) {
//Word length of the excerpt. This is exact or NOT depending on your '$finish_sentence' variable.
$w_length = 20; /* Change the Length of the excerpt. The Length is in words. */
//1 if you want to finish the sentence of the excerpt (No weird cuts).
$finish_sentence = 1; // Put 0 if you do NOT want to finish the sentence.
$tokens = array();
$out = '';
$word = 0;
//Divide the string into tokens; HTML tags, or words, followed by any whitespace.
$regex = '/(<[^>] >|[^<>s] )s*/u';
preg_match_all($regex, $text, $tokens);
foreach ($tokens[0] as $t){
//Parse each token
if ($word >= $w_length amp;amp; !$finish_sentence){
//Limit reached
break;
}
if ($t[0] != '<'){
//Token is not a tag.
//Regular expression that checks for the end of the sentence: '.', '?' or '!'
$regex1 = '/[?.!]s*$/uS';
if ($word >= $w_length amp;amp; $finish_sentence amp;amp; preg_match($regex1, $t) == 1){
//Limit reached, continue until ? . or ! occur to reach the end of the sentence.
$out .= trim($t);
break;
}
$word ;
}
//Append what's left of the token.
$out .= $t;
}
return trim(force_balance_tags($out));
}
}
function vhr_excerpt_filter($text){
global $post;
if ( $post->post_type == 'poi' ) {
//Get the full content and filter it.
$text = get_the_content('');
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]amp;>', $text);
//If you want to Allow SOME tags:
$allowed_tags = '<p>,<a>,<strong>,<b>'; /* Here I am allowing p, a, strong tags. Separate tags by comma. */
$text = strip_tags($text, $allowed_tags);
//Create the excerpt.
$text = vhr_variable_length_excerpt($text, $w_length, $finish_sentence);
return $text;
}
}
//Hooks the 'vhr_excerpt_filter' function to a specific (get_the_excerpt) filter action.
add_filter('get_the_excerpt', 'vhr_excerpt_filter', 5);
Это не влияет ни на один из моих других пользовательских типов сообщений, только на тот, который я указываю в функции, а затем на все страницы на веб-сайте. Это по-прежнему влияет на мои страницы, даже если я изменю логику на что-то вроде = poi amp;amp; != страница. Есть идеи, почему это также влияет на страницы? Есть ли более простой способ сделать так, чтобы это произошло?
Спасибо!
Комментарии:
1. К сожалению, сейчас у меня нет времени помогать, но я могу сказать вам, что отрывки в WordPress иногда обладают очень неприятной магией. В частности, были времена, когда я думал, что
$post
это одно, но WordPress использовал другой объект.2. На всякий случай я отредактировал ответ, включив в него отрывок, основанный на подсчете слов, и один из предложений.
3. Я отредактировал ответ, он должен решить вашу проблему, о которой вы заявили в комментариях.
Ответ №1:
Существует множество способов, которыми мы можем подойти к этому. Одним из них является то, что вы тратите время на написание собственного отрывка вместо того, чтобы полагаться на WordPress…
Мы можем подсчитывать предложения, ориентируясь на период окончания срока.
function get_sentence_tally_excerpt( $content = '', $tally = 2, $stitches = '' ) {
$buffer = array_slice( explode( '.', sanitize_text_field( $content ) ), 0, $tally );
$filter = array_filter( array_map( 'trim', $buffer ), 'strlen' );
$excerpt = join( '. ', $filter ) . '.';
return esc_attr( $excerpt . $stitches );
};
Вы можете указать, какой тип контента должен быть «усечен» и на сколько предложений. На интерфейсе мы можем вызвать нашу функцию get_tally_excerpt()
следующим образом:
<?= get_sentence_tally_excerpt( get_the_content() ); ?> //... 2 sentences by DEFAULT
<?= get_sentence_tally_excerpt( get_the_content(), 1 ); ?> //... 1 sentences ONLY
<?= get_sentence_tally_excerpt( get_the_content(), 5, '[...]' ); ?> //... 5 sentences ONLY with stitches at the end.
Комментарии:
1. Будет ли вызов всего содержимого каждого поста немного замедлять процесс? Код, который у меня есть, на самом деле хорошо работает для завершения автоматических выдержек в предложении. Основная проблема с моим кодом заключается в том, что я не могу понять, почему он не ограничивается типом записи, который я указываю. Например, у меня есть пользовательские выдержки для моих страниц, но они не извлекаются. Вместо этого он просто тянет последнее предложение на странице, и я не могу понять, почему. Удаление моих функций, относящихся к завершению определенного типа сообщения в предложении, устраняет проблему. Так что что-то там заставляет мои страницы сходить с ума.
2. Нет. Отрывок по умолчанию делает точно то же самое. Он извлекает (запрашивает) содержимое, а затем форматирует его. Все, что вы делаете, — это запрос. То, что вы этого не видите, не означает, что вы не выполняете никаких запросов. Ваш метод ничем не отличается». Запросы не влияют на скорость, если они не являются неконтролируемыми или непропорциональными. Но отображение заголовка, отрывка, содержимого или выполнение регулярного выражения — это буквально одно и то же. Мы говорим о различиях между наносекундами и пикосекундами (ns/ps).
3. …WordPress имеет функцию, прикрепленную к фильтру
get_the_excerpt
, которая являетсяwp_trim_excerpt()
.wp_trim_excerpt()
проверяет, является ли переданный текст пустым (обычно это так, поскольку немногие люди компилируют поле выдержки сообщения), и если это так, вызываетget_the_content()
, которое выполняет все короткие коды (это может быть опасная часть, см. Ниже)… Источник 1 @ satollo.net/how-the_excerpt-function-works-in-wordpress … Источник 2 @ developer.wordpress.org/reference/functions/wp_trim_excerpt в котором говоритсяGenerates an excerpt from the content, if needed.
.4. Думать о том, что несколько запросов на странице сильно повлияют на скорость, — это все равно, что думать о существовании маленьких зубастых фей. Если бы это было так, я могу заверить вас, что люди убежали бы от wordpress, как от чумы, и именно поэтому PHP по-прежнему актуален в наши дни.
5. Спасибо! Это работает до тех пор, пока сообщение содержит по крайней мере два предложения. Если есть только одно предложение, то есть сиротский период.