为标题中的每个字母,空格,字符添加一个span标签

时间:2018-07-24 08:49:16

标签: arrays

我尝试将span标签添加到标题中的每个字母,空格,字符。当我使用str_split时,特殊字符将转换为另一种格式。

if ( !function_exists( 'my_title' ) ):
    function my_title( $str = '' ) {
        $output = '';
        $str = empty( $str ) ? wp_strip_all_tags( get_the_title() ) : $str;

        if ( empty( $str ) ) {
            return $output;
        }

        $i = 1;
        foreach( str_split ( $str ) as $letter ) if ( $i++ <= 12 ) {
            if ( !empty( $letter ) ) {
                $output .= '<span>' . $letter . '</span>';
            }
        };

        return wp_kses_post( $output );

    }
endif;

echo my_title('Page title - with dash');

1 个答案:

答案 0 :(得分:1)

问题很可能是由于wptexturize()函数应用于帖子标题,其中某些字符(例如-(破折号)会自动转换为HTML实体例如&#8211;代表“漂亮”破折号。

所以尝试一下,这对我有用:

if ( !function_exists( 'my_title' ) ):
    function my_title( $str = '', $max_chars = 12 ) {
        $output = '';

        remove_filter( 'the_title', 'wptexturize' );
        $str = empty( $str ) ? wp_strip_all_tags( get_the_title() ) : $str;
        add_filter( 'the_title', 'wptexturize' );

        if ( empty( $str ) ) {
            return $output;
        }

        $str = html_entity_decode( $str, ENT_NOQUOTES, 'UTF-8' );
        for ( $i = 0; $i < min( mb_strlen( $str ), $max_chars ); $i++ ) {
            if ( $letter = mb_substr( $str, $i, 1 ) ) {
                $output .= '<span>' . $letter . '</span>';
            }
        }

        return wp_kses_post( $output );

    }
endif;

UPDATE —注释:

对不起,@ michael,我应该提到我还修改了my_title()函数以使用html_entity_decode()mb_strlen()mb_substr()函数,以便HTML实体妥善处理。 (str_split()无法正确处理多字节编码的字符串,例如&#8211;之类的HTML实体)

因此,即使将wptexturize()函数应用于帖子标题,修改后的my_title()函数也应该不会遇到处理&#8211;等问题HTML实体(或类似的特殊字符)。因此,您可以根据需要对此进行更改:

remove_filter( 'the_title', 'wptexturize' );
$str = empty( $str ) ? wp_strip_all_tags( get_the_title() ) : $str;
add_filter( 'the_title', 'wptexturize' );

对此:

$str = empty( $str ) ? wp_strip_all_tags( get_the_title() ) : $str;

即不必删除wptexturize 钩子。万一您想保留由wptexturize()函数转换的“漂亮”破折号和其他特殊字符,以防万一。 =)