Wordpress:限制帖子内容中的标签链接

时间:2018-06-22 08:02:04

标签: wordpress wordpress-theming

我真的很沮丧,我是wordpress的新手,我试图限制在帖子内容文章中出现的最大标签链接数。下面是我的代码。我不知道如何解决它。

function link_words( $text ) {

    $replace = array();
    $tags = get_tags();
$count=0;
    if ( $tags ) {
        foreach ( $tags as $tag ) {
            $count++;
            $replace[ $tag->name ] = sprintf( '<a href="%s">%s</a>', esc_url( get_term_link( $tag ) ), esc_html( $tag->name ) );
              if( $count > 2 ) break;
        }
    }

    $text = str_replace( array_keys($replace), $replace, $text );
    return $text;
}
add_filter( 'the_content', 'link_words' );

3 个答案:

答案 0 :(得分:0)

如果您的标签用逗号分隔,则可能对您有用:

            function limit_tags($tags) {
            $tags = substr($tags, 0, strpos($tags, ',', strpos($tags, ',')+1));
            return $tags;
            }
            add_filter('the_tags','limit_tags');

$ tags变量实际上是一个字符串...

答案 1 :(得分:0)

您提到您的函数以您希望的方式工作(链接标签),因此我不会对此感到困惑。如果您查看get_tags()的文档,将会看到它接受了一些参数,其中包括number,这将限制它。这样,您就不会有$counter类型的变量了。

您还可以只检查$tags变量是否设置为真实值,而无需先定义它。

无论是否定义了str_replace,您的$tags也会出现,如果找不到则可能导致问题,因此应将其移至if语句中。

为清晰起见,由于您使用的是$text过滤器,因此我也将$content变量更改为the_content

add_filter( 'the_content', 'link_tags_in_content' );
function link_tags_in_content( $content ){
    if( $tags = get_tags( array( 'number' => 2 ) ) ){
        foreach( $tags as $tag ){
            $tag_link = sprintf( '<a href="%s">%s</a>', esc_url( get_term_link( $tag ) ), esc_html( $tag->name ) );
            $content  = str_replace( $tag->name, $tag_link, $content );
        }
    }

    return $content;
}

答案 2 :(得分:0)

好,所以我想我知道你现在想要更好的...

             function link_words( $text ) {
            $tags = get_tags();
            if ( $tags ) {
                foreach ( $tags as $tag ) {
                    $from = '!<h2>[^<>]*<\/h2>(*SKIP)(*F)|<b>[^<>]*<\/b>(*SKIP)(*F)|<a\b[^>]*>.*?</a>(*SKIP)(*F)|(\b'.$tag->name.'\b)(?=[^>]*(?:<|$))!';
                    $to = sprintf( ' <a href="%s">%s</a> ', esc_url( get_term_link( $tag ) ), esc_html( $tag->name ) );
                    $text = preg_replace($from, $to , $text, 2);
                }
            }
            return $text;
        }
        add_filter( 'the_content', 'link_words' );

由于preg_replace(2)的限制,并且它位于tag循环内,因此将每个标签的文本替换为标签名称的两个实例...这是否符合您的要求?请注意,这不是大小写敏感的,因此如果您的标签是句子中的第一个单词并且大写,则它将不匹配。为此,也许看看这个线程: PHP preg_replace: Case insensitive match with case sensitive replacement