如何用一句话而不是一个词来结束这段摘录?

时间:2013-08-03 作者:Mohit

这是我主页上这篇文章的摘录。我想用一句话来结束这段摘录。在这种情况下,这是“机会”。我知道如何修改长度,但它做不到我想要的。

enter image description here

这里是其他网站的摘录。在这里,你可以看到摘录以一个恰当的句子结尾,而不像上面以下一句的第一个单词“主动”结尾。

enter image description here

After Implementing the solution by G.M. :-

enter image description here

4 个回复
最合适的回答,由SO网友:gmazzap 整理而成

这需要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; 
}

SO网友:Pieter Goosen

这是我的版本,保留了所有的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() ) . \'">\' . \'&nbsp;&raquo;&nbsp;\' . sprintf(__( \'Read more about: %s &nbsp;&raquo;\', \'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\'); 

SO网友:Eetu Purtonen

万一有人在使用答案,建议一句:这将破坏高级自定义字段。ACF还调用wp_insert_post_data 创建或更新字段时$data 变量不同,将导致ACF字段名变得不可读,从而导致无法使用该字段。

SO网友:Gavin G

这里有一个不同的解决方案,它使用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);
}

结束

相关推荐

Inserting random posts

我想在滑块中添加两个自定义帖子类型,一个是事件,另一个是核心值,但我想添加所有事件,并随机插入7个核心值中的2或3个。我已经设置了这个查询,它显然只是要插入所有事件和所有核心值。我有点困惑于如何让它的随机部分发生。我不希望使用post-ID来选择随机值,因为post-ID在将来可能会改变。有什么想法吗?? $the_query = new WP_Query( array( \'post_type\' => array( \'core-value\', \'event\' )) );