如何让 HTML 实体在 Buddypress 消息中正确显示

问题描述 投票:0回答:1

在 BuddyPress 消息预览窗口中将消息截断一行(225 个字符),然后附加一个水平省略号。

不幸的是,此 HTML 实体显示为字符串,未被解析为显示为椭圆。

椭圆的HTML代码我们都试过了,都显示为字符串

在 /plugins/bp-core/bp-core-template.php 文件中控制这个的函数(起始行 878)

有人知道如何解决这个问题吗?非常非常感谢。 (下面的代码)

function bp_create_excerpt( $text, $length = 225, $options = array() ) {

    // Backward compatibility. The third argument used to be a boolean $filter_shortcodes.
    $filter_shortcodes_default = is_bool( $options ) ? $options : true;

    $r = bp_parse_args(
        $options,
        array(
            'ending'            => __(  ' [U+02026] '  , 'buddypress' ),
            'exact'             => false,
            'html'              => true,
            'filter_shortcodes' => $filter_shortcodes_default,
            'strip_tags'        => false,
            'remove_links'      => false,
        ),
        'create_excerpt'
    );

    // Save the original text, to be passed along to the filter.
    $original_text = $text;

    /**
     * Filters the excerpt length to trim text to.
     *
     * @since 1.5.0
     *
     * @param int $length Length of returned string, including ellipsis.
     */
    $length = apply_filters( 'bp_excerpt_length',      $length      );

    /**
     * Filters the excerpt appended text value.
     *
     * @since 1.5.0
     *
     * @param string $value Text to append to the end of the excerpt.
     */
    $ending = apply_filters( 'bp_excerpt_append_text', $r['ending'] );

    // Remove shortcodes if necessary.
    if ( ! empty( $r['filter_shortcodes'] ) ) {
        $text = strip_shortcodes( $text );
    }

    // When $html is true, the excerpt should be created without including HTML tags in the
    // excerpt length.
    if ( ! empty( $r['html'] ) ) {

        // The text is short enough. No need to truncate.
        if ( mb_strlen( preg_replace( '/<.*?>/', '', $text ) ) <= $length ) {
            return $text;
        }

        $totalLength = mb_strlen( strip_tags( $ending ) );
        $openTags    = array();
        $truncate    = '';

        // Find all the tags and HTML comments and put them in a stack for later use.
        preg_match_all( '/(<\/?([\w+!]+)[^>]*>)?([^<>]*)/', $text, $tags, PREG_SET_ORDER );

        foreach ( $tags as $tag ) {
            // Process tags that need to be closed.
            if ( !preg_match( '/img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param/s',  $tag[2] ) ) {
                if ( preg_match( '/<[\w]+[^>]*>/s', $tag[0] ) ) {
                    array_unshift( $openTags, $tag[2] );
                } elseif ( preg_match('/<\/([\w]+)[^>]*>/s', $tag[0], $closeTag ) ) {
                    $pos = array_search( $closeTag[1], $openTags );
                    if ( $pos !== false ) {
                        array_splice( $openTags, $pos, 1 );
                    }
                }
            }

            $truncate     .= $tag[1];
            $contentLength = mb_strlen( preg_replace( '/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', ' ', $tag[3] ) );

            if ( $contentLength + $totalLength > $length ) {
                $left = $length - $totalLength;
                $entitiesLength = 0;
                if ( preg_match_all( '/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', $tag[3], $entities, PREG_OFFSET_CAPTURE ) ) {
                    foreach ( $entities[0] as $entity ) {
                        if ( $entity[1] + 1 - $entitiesLength <= $left ) {
                            $left--;
                            $entitiesLength += mb_strlen( $entity[0] );
                        } else {
                            break;
                        }
                    }
                }

                $truncate .= mb_substr( $tag[3], 0 , $left + $entitiesLength );
                break;
            } else {
                $truncate .= $tag[3];
                $totalLength += $contentLength;
            }
            if ( $totalLength >= $length ) {
                break;
            }
        }
    } else {
        // Strip HTML tags if necessary.
        if ( ! empty( $r['strip_tags'] ) ) {
            $text = strip_tags( $text );
        }

        // Remove links if necessary.
        if ( ! empty( $r['remove_links'] ) ) {
            $text = preg_replace( '#^\s*(https?://[^\s"]+)\s*$#im', '', $text );
        }

        if ( mb_strlen( $text ) <= $length ) {
            /**
             * Filters the final generated excerpt.
             *
             * @since 1.1.0
             *
             * @param string $text          Generated excerpt.
             * @param string $original_text Original text provided.
             * @param int    $length        Length of returned string, including ellipsis.
             * @param array  $options       Array of HTML attributes and options.
             */
            return apply_filters( 'bp_create_excerpt', $text, $original_text, $length, $options );
        } else {
            $truncate = mb_substr( $text, 0, $length - mb_strlen( $ending ) );
        }
    }

    // If $exact is false, we can't break on words.
    if ( empty( $r['exact'] ) ) {
        // Find the position of the last space character not part of a tag.
        preg_match_all( '/<[a-z\!\/][^>]*>/', $truncate, $_truncate_tags, PREG_OFFSET_CAPTURE );

        // Rekey tags by the string index of their last character.
        $truncate_tags = array();
        if ( ! empty( $_truncate_tags[0] ) ) {
            foreach ( $_truncate_tags[0] as $_tt ) {
                $_tt['start'] = $_tt[1];
                $_tt['end']   = $_tt[1] + strlen( $_tt[0] );
                $truncate_tags[ $_tt['end'] ] = $_tt;
            }
        }

        $truncate_length = mb_strlen( $truncate );
        $spacepos = $truncate_length + 1;
        for ( $pos = $truncate_length - 1; $pos >= 0; $pos-- ) {
            // Word boundaries are spaces and the close of HTML tags, when the tag is preceded by a space.
            $is_word_boundary = ' ' === $truncate[ $pos ];
            if ( ! $is_word_boundary && isset( $truncate_tags[ $pos - 1 ] ) ) {
                $preceding_tag    = $truncate_tags[ $pos - 1 ];
                if ( ' ' === $truncate[ $preceding_tag['start'] - 1 ] ) {
                    $is_word_boundary = true;
                    break;
                }
            }

            if ( ! $is_word_boundary ) {
                continue;
            }

            // If there are no tags in the string, the first space found is the right one.
            if ( empty( $truncate_tags ) ) {
                $spacepos = $pos;
                break;
            }

            // Look at each tag to see if the space is inside of it.
            $intag = false;
            foreach ( $truncate_tags as $tt ) {
                if ( $pos > $tt['start'] && $pos < $tt['end'] ) {
                    $intag = true;
                    break;
                }
            }

            if ( ! $intag ) {
                $spacepos = $pos;
                break;
            }
        }

        if ( $r['html'] ) {
            $bits = mb_substr( $truncate, $spacepos );
            preg_match_all( '/<\/([a-z]+)>/', $bits, $droppedTags, PREG_SET_ORDER );
            if ( !empty( $droppedTags ) ) {
                foreach ( $droppedTags as $closingTag ) {
                    if ( !in_array( $closingTag[1], $openTags ) ) {
                        array_unshift( $openTags, $closingTag[1] );
                    }
                }
            }
        }

        $truncate = rtrim( mb_substr( $truncate, 0, $spacepos ) );
    }
    $truncate .= $ending;

    if ( !empty( $r['html'] ) ) {
        foreach ( $openTags as $tag ) {
            $truncate .= '</' . $tag . '>';
        }
    }

    /** This filter is documented in /bp-core/bp-core-template.php */
    return apply_filters( 'bp_create_excerpt', $truncate, $original_text, $length, $options );
}
add_filter( 'bp_create_excerpt', 'stripslashes_deep'  );
add_filter( 'bp_create_excerpt', 'force_balance_tags' );

试图让消息预览窗口正确显示 HTML 实体,而不是实际的字符串。

html wordpress entities buddypress
1个回答
0
投票

要在 BuddyPress 的消息预览窗口中显示水平省略号而不是 HTML 实体字符串,您可以同样使用省略号的实际 Unicode 字符替换实体字符串

你可以这样写

'ending' => __( '…' , 'buddypress' )
省略号字符“...”由 Unicode 字符 U+2026 表示,它是单个字符。进行更改后,保存文件并刷新 BuddyPress 站点以查看更新后的预览窗口。我希望这对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.