从acf-wysiwyg-field生成摘录

时间:2019-01-10 作者:Zeth

我有一个ACF字段,它给出如下输出:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p><img class="alignnone size-large wp-image-48" src="http://example.org/wp-content/uploads/2019/01/foo-bar.jpg" alt="" width="1024" height="640" /></p>
<p>Sed lacinia enim a <strong>est aliquet</strong>, et accumsan ex pellentesque. </p>
<p>Adipiscing elit, lorem ipsum dolor sit amet, consectetur.</p>
。。。图像和文本。

具有wp_html_excerpt 我可以删除所有标签,所以我得到一个长文本简介。

但对于WordPress的本地摘录,它不会删除换行符或粗体文本,我觉得这很好。

我将如何从我的ACF所见即所得领域获得这样的摘录?

理想情况下,我会这样调用我的函数:create_neat_excerpt( $html, 15 ); 并获得如下输出(从上述给定输入):

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>Sed lacinia enim a <strong>est aliquet</strong>, et accumsan...</p>
添加:我当前的尝试
$project_desc = get_field( \'project_description\' );

if( !empty( $project_desc ) ):
  $trimmed_text = wp_html_excerpt( $project_desc, 800 );
  $last_space = strrpos( $trimmed_text, \' \' );
  $modified_trimmed_text = substr( $trimmed_text, 0, $last_space );
  echo $modified_trimmed_text . \'...\';
endif; 

3 个回复
最合适的回答,由SO网友:Ibrahim Mohamed 整理而成

您可以提供自己的实现wp_trim_excerpt 它负责修剪和剥离HTML标记(它使用wp_strip_all_tags),

通过复制函数源代码并应用所需的更改(即保留<p><strong> 标签(或您希望的任何其他标签),它将很好地工作。

我为您复制了函数并应用了允许的更改<p><strong> 在你最后的摘录中。(You should put this code in your functions.php file)

function wp_trim_excerpt_modified($text, $content_length = 55, $remove_breaks = false) {
    if ( \'\' != $text ) {
        $text = strip_shortcodes( $text );
        $text = excerpt_remove_blocks( $text );
        $text = apply_filters( \'the_content\', $text );
        $text = str_replace(\']]>\', \']]&gt;\', $text);
        $num_words = $content_length;
        $more = $excerpt_more ? $excerpt_more : null;
        if ( null === $more ) {
            $more = __( \'&hellip;\' );
        }
        $original_text = $text;
        $text = preg_replace( \'@<(script|style)[^>]*?>.*?</\\\\1>@si\', \'\', $text );

        // Here is our modification
        // Allow <p> and <strong>
        $text = strip_tags($text, \'<p>,<strong>\');

        if ( $remove_breaks )
            $text = preg_replace(\'/[\\r\\n\\t ]+/\', \' \', $text);
        $text = trim( $text );
        if ( strpos( _x( \'words\', \'Word count type. Do not translate!\' ), \'characters\' ) === 0 && preg_match( \'/^utf\\-?8$/i\', get_option( \'blog_charset\' ) ) ) {
            $text = trim( preg_replace( "/[\\n\\r\\t ]+/", \' \', $text ), \' \' );
            preg_match_all( \'/./u\', $text, $words_array );
            $words_array = array_slice( $words_array[0], 0, $num_words + 1 );
            $sep = \'\';
        } else {
            $words_array = preg_split( "/[\\n\\r\\t ]+/", $text, $num_words + 1, PREG_SPLIT_NO_EMPTY );
            $sep = \' \';
        }
        if ( count( $words_array ) > $num_words ) {
            array_pop( $words_array );
            $text = implode( $sep, $words_array );
            $text = $text . $more;
        } else {
            $text = implode( $sep, $words_array );
        }
    }
    return $text;
}
请注意正在执行剥离的行:

Line:22 $text = strip_tags($text, \'<p>,<strong>\');

您的代码应该如下所示:

$project_desc = get_field( \'project_description\' );
if( !empty( $project_desc ) ):
    $trimmed_text = wp_trim_excerpt_modified( $project_desc, 15 );
    $last_space = strrpos( $trimmed_text, \' \' );
    $modified_trimmed_text = substr( $trimmed_text, 0, $last_space );
    echo $modified_trimmed_text . \'...\';
endif; 
有关更多信息,您可以签出this answer 关于stackoverflow,它更为详细。

SO网友:mrben522

使用apply_filters( \'the_excerpt\', get_field( \'project_description\' ) ); 已经很接近了,但它错过了让你达到你想要的目标的关键一步。核心摘录生成器在命中之前运行另一个过滤器the_excerpt. 它是get_the_excerpt 在该筛选器上调用wp_trim_excerpt() 其中运行wp_trim_words(). 如果您查看该函数,您将看到它正在运行wp_strip_all_tags() 在删减内容至55字之前。这是您缺少的一部分,可以让您的内容看起来像没有任何图像的常规摘录。我还没有测试以下内容,但它应该可以正常工作,无需太多修改。

$raw_content = get_field( \'project_description\' );
$trimmed_content = wp_trim_words($raw_content);
$clean_excerpt = apply_filters(\'the_excerpt\', $trimmed_content);

echo $clean_excerpt;
不管你怎么想,我都会把它整理好,以便于阅读。

编辑:wp_trim_excerpt() 只有从帖子内容中提取内容时,才会运行所有有趣的过滤器。替换为wp_trim_words()

SO网友:Peter HvD

使用the_excerpt 过滤器(参见Codex)

apply_filters( \'the_excerpt\', get_field( \'my-wysiwyg-field\' ) );

相关推荐

Strip div From Excerpt

我在特定页面中有\\u extract(),我需要去掉一个div并保留文本,但只保留在该页面的摘录中。我相信我需要创建一个带有自定义摘录的函数,但我不知道该怎么做。测试了我在这里找到的几种解决方案,但没有任何效果。