这是我主页上这篇文章的摘录。我想用一句话来结束这段摘录。在这种情况下,这是“机会”。我知道如何修改长度,但它做不到我想要的。
这里是其他网站的摘录。在这里,你可以看到摘录以一个恰当的句子结尾,而不像上面以下一句的第一个单词“主动”结尾。
After Implementing the solution by G.M. :-

这是我主页上这篇文章的摘录。我想用一句话来结束这段摘录。在这种情况下,这是“机会”。我知道如何修改长度,但它做不到我想要的。
这里是其他网站的摘录。在这里,你可以看到摘录以一个恰当的句子结尾,而不像上面以下一句的第一个单词“主动”结尾。
After Implementing the solution by G.M. :-
这需要PHP 5.3+(WP需要PHP 5.2.4+)
add_filter(\'get_the_excerpt\', \'end_with_sentence\');
function end_with_sentence($excerpt) {
$allowed_end = array(\'.\', \'!\', \'?\', \'...\');
$exc = explode( \' \', $excerpt );
$found = false;
$last = \'\';
while ( ! $found && ! empty($exc) ) {
$last = array_pop($exc);
$end = strrev( $last );
$found = in_array( $end{0}, $allowed_end );
}
return (! empty($exc)) ? $excerpt : rtrim(implode(\' \', $exc) . \' \' .$last);
}
编辑@kaiser评论后,我尝试在保存/更新时运行此操作,以防止页面在显示大量帖子时变慢。应对此进行测试add_filter(\'wp_insert_post_data\', \'end_with_sentence_on_save\', 20, 2);
function end_with_sentence_on_save($data, $postarr) {
if ( ! empty( $data[\'post_content\'] ) && $data[\'post_status\'] != \'inherit\' && $data[\'post_status\'] != \'trash\' ) {
$text = strip_shortcodes( $data[\'post_content\'] );
$text = apply_filters(\'the_content\', $text );
$text = str_replace(\']]>\', \']]>\', $text );
$excerpt_length = apply_filters(\'excerpt_length\', 55);
$data[\'post_excerpt\'] = wp_trim_words($text, $excerpt_length, \'\');
} else {
return $data;
}
$allowed_end = array(\'.\', \'!\', \'?\', \'...\');
$exc = explode(\' \', $data[\'post_excerpt\']);
$found = false;
$last = \'\';
while ( ! $found && ! empty($exc) ) {
$last = array_pop($exc);
$end = strrev( $last );
$found = in_array( $end{0}, $allowed_end );
}
if (! empty($exc)) $data[\'post_excerpt\'] = rtrim(implode(\' \', $exc) . \' \' .$last);
return $data;
}
这是我的版本,保留了所有的html标记,还删减了句子中最后一个单词后的内容
if ( ! function_exists( \'pietergoosen_custom_wp_trim_excerpt\' ) ) :
function pietergoosen_custom_wp_trim_excerpt($pietergoosen_excerpt) {
global $post;
$raw_excerpt = $pietergoosen_excerpt;
if ( \'\' == $pietergoosen_excerpt ) {
$pietergoosen_excerpt = get_the_content(\'\');
$pietergoosen_excerpt = strip_shortcodes( $pietergoosen_excerpt );
$pietergoosen_excerpt = apply_filters(\'the_content\', $pietergoosen_excerpt);
$pietergoosen_excerpt = str_replace(\']]>\', \']]>\', $pietergoosen_excerpt);
//Set the excerpt word count and only break after sentence is complete.
$excerpt_word_count = 75;
$excerpt_length = apply_filters(\'excerpt_length\', $excerpt_word_count);
$tokens = array();
$excerptOutput = \'\';
$count = 0;
// Divide the string into tokens; HTML tags, or words, followed by any whitespace
preg_match_all(\'/(<[^>]+>|[^<>\\s]+)\\s*/u\', $pietergoosen_excerpt, $tokens);
foreach ($tokens[0] as $token) {
if ($count >= $excerpt_word_count && preg_match(\'/[\\?\\.\\!]\\s*$/uS\', $token)) {
// Limit reached, continue until ? . or ! occur at the end
$excerptOutput .= trim($token);
break;
}
// Add words to complete sentence
$count++;
// Append what\'s left of the token
$excerptOutput .= $token;
}
$pietergoosen_excerpt = trim(force_balance_tags($excerptOutput));
$excerpt_end = \' <a href="\'. esc_url( get_permalink() ) . \'">\' . \' » \' . sprintf(__( \'Read more about: %s »\', \'pietergoosen\' ), get_the_title()) . \'</a>\';
$excerpt_more = apply_filters(\'excerpt_more\', \' \' . $excerpt_end);
//$pos = strrpos($pietergoosen_excerpt, \'</\');
//if ($pos !== false)
// Inside last HTML tag
//$pietergoosen_excerpt = substr_replace($pietergoosen_excerpt, $excerpt_end, $pos, 0);
//else
// After the content
$pietergoosen_excerpt .= $excerpt_end;
return $pietergoosen_excerpt;
}
return apply_filters(\'pietergoosen_custom_wp_trim_excerpt\', $pietergoosen_excerpt, $raw_excerpt);
}
endif;
remove_filter(\'get_the_excerpt\', \'wp_trim_excerpt\');
add_filter(\'get_the_excerpt\', \'pietergoosen_custom_wp_trim_excerpt\');
万一有人在使用答案,建议一句:这将破坏高级自定义字段。ACF还调用wp_insert_post_data
创建或更新字段时$data
变量不同,将导致ACF字段名变得不可读,从而导致无法使用该字段。
这里有一个不同的解决方案,它使用Wordpress内置的wp\\u trim\\u words()函数大致确定文本的长度,然后截断该句子末尾的文本(比指定的字数略长)。
用法:echo im_trim_sentences($very_long_text, 90);
一种习俗;strpos\\U阵列();函数也包含在这个答案中,因为PHP的strpos()函数只接受一个字符串作为$指针,但我们希望搜索不同的句子结尾(句号或感叹号等)。
function strpos_array($haystack, $needles, $offset = 0) {
if (is_array($needles)) {
$positions = array();
foreach ($needles as $str) {
$pos = strpos($haystack, $str, $offset);
if ($pos !== false) {
$positions[] = $pos;
}
}
return (count($positions) ? min($positions): false);
} else {
return strpos($haystack, $needles, $offset);
}
}
function im_trim_sentences($text, $number_of_words = 55, $more = null) {
$allowed_end = array(\'.\', \'!\', \'?\', \'...\');
$text_no_html = strip_tags($text);
$trimmed_text = wp_trim_words($text, $number_of_words, $more);
$trimmed_text_length = strlen($trimmed_text);
$sentence_end_position = strpos_array($text_no_html, $allowed_end, $trimmed_text_length);
$text_with_html = (($sentence_end_position !== false) ? substr($text_no_html, 0, ($sentence_end_position + 1)) : $trimmed_text);
return wpautop($text_with_html);
}
我想在滑块中添加两个自定义帖子类型,一个是事件,另一个是核心值,但我想添加所有事件,并随机插入7个核心值中的2或3个。我已经设置了这个查询,它显然只是要插入所有事件和所有核心值。我有点困惑于如何让它的随机部分发生。我不希望使用post-ID来选择随机值,因为post-ID在将来可能会改变。有什么想法吗?? $the_query = new WP_Query( array( \'post_type\' => array( \'core-value\', \'event\' )) );