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

Wordpress 限制帖子内容中的标签链接,wordpress,wordpress-theming,Wordpress,Wordpress Theming,我真的很沮丧,我是wordpress的新手,我试图限制在文章内容中出现的标签链接的最大数量。下面是我的代码。我不知道如何修理它 function link_words( $text ) { $replace = array(); $tags = get_tags(); $count=0; if ( $tags ) { foreach ( $tags as $tag ) { $count++; $replac

我真的很沮丧,我是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' );
函数链接\u单词($text){
$replace=array();
$tags=get_tags();
$count=0;
如果($tags){
foreach($tags作为$tag){
$count++;
$replace[$tag->name]=sprintf(“”,esc_url(get_term_link($tag)),esc_html($tag->name));
如果($count>2)中断;
}
}
$text=str_replace(数组_键($replace),$replace,$text);
返回$text;
}
添加过滤器(“内容”、“链接词”);

如果您的标记是逗号分隔的,这可能适用于您:

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

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

您提到了您的函数按照您希望的方式工作(链接标记),所以我不会弄乱它。如果您查看文档,您将看到它接受一些参数,包括
number
,这将限制它。这样,您就不会有要处理的
$counter
类型变量

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

无论是否定义了
$tags
,都会发生
str\u replace
,如果没有找到,则可能会导致问题,因此您应该将其移到if语句中

为了语义清晰,我还将
$text
变量更改为
$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;
}
add_filter('the_content'、'link_tags_in_content');
功能链接\u内容中的标签\u($content){
如果($tags=get_标记(数组('number'=>2))){
foreach($tags作为$tag){
$tag_link=sprintf(“”,esc_url(get_term_link($tag)),esc_html($tag->name));
$content=str\u replace($tag->name,$tag\u link,$content);
}
}
返回$content;
}

好的,我想我现在更明白你想要什么了

             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' );
函数链接\u单词($text){
$tags=get_tags();
如果($tags){
foreach($tags作为$tag){
$from='![^]*(*SKIP)(*F)|[^]*(*SKIP)(*F)|'、esc_url(获取术语链接($tag))、esc_html($tag->name));
$text=preg_replace($from,$to,$text,2);
}
}
返回$text;
}
添加过滤器(“内容”、“链接词”);
由于preg_replace(2)的限制,并且它位于标记循环内,因此这将替换文本中每个标记的两个标记名实例。。。这是你想要的吗?请注意,这不是不区分大小写的,因此如果您的标记是句子中的第一个单词并且大写,则它将不匹配。要执行类似操作,请查看以下线程:

您发布的代码有什么问题?它与预期的输出有什么不同?它给出了任何错误吗?它没有给出错误,但是链接没有增加限制。这和帖子内容中的链接一样抱歉,但我指的不是帖子下的标签。但是要替换文章中要链接的每个标记关键字。并限制它。我发布的代码运行良好。但并不限制文章的链接数量。相反,它用link替换文章中找到的任何标记关键字。我只是想限制它所替换的链接。所以“str_replace”函数会替换所有出现的搜索字符串。。。是否只想更改内容文本中每个标记的两个标记名?但是对于每个标签,你的代码都是有效的,但是它只限制了单个标签链接,而不是整个post标签链接。示例:我将3个关键字标记到一篇文章中,您的代码仅限制整个3个关键字的链接,而不是限制特定关键字的链接。我只是想在没有插件的内容中创建一个标签链接。就像插件一样。我已经对它进行了更新,这样它就可以在
foreach
循环中执行
str\u replace
命令,而不使用数组库。它可以工作很多,但是标记链接会影响html文本,比如有没有办法让标记链接忽略特定的html标记?包括标记。因此,您的标记被命名为“img”、“a”和“h2”。那可能是个坏主意。你的需求可能会超出一般需求。也许您不应该使用简单的php函数进行解析。看看这个线程上的答案,了解一些深入的信息:您可以切换到preg replace回调函数,并执行一个稍微复杂的正则表达式来查找标记闭合器,同时使其不区分大小写(/e)。。。我不太熟悉正则表达式。但是你的情况很独特,我不确定我能帮你更多。。。我是wp函数编码的新手,你能帮我吗?我编辑了原始答案,加入了一个用于标记的正则表达式。如果你不关心案件的敏感性,我不会打扰你,因为多种原因。。。