【问题标题】:Wordpress: Limit Tag Links in Post ContentWordpress:限制帖子内容中的标签链接
【发布时间】:2018-06-22 08:02:04
【问题描述】:

我真的很沮丧,我是 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' );

【问题讨论】:

  • 您发布的代码有什么问题?它与预期输出有何不同?有没有报错?
  • 它没有给出错误,但链接没有添加限制。它仍然与帖子内容中的链接相同

标签: wordpress wordpress-theming


【解决方案1】:

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

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

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

【讨论】:

  • 对不起,我指的不是帖子下的标签。但是要替换文章中的每个标签关键字以链接。并加以限制。我发布的代码效果很好。但不限制文章上的链接数。相反,它用链接替换文章中找到标签关键字的任何地方。我只是想限制它替换的链接。
  • 所以“str_replace”函数替换了所有出现的搜索字符串...php.net/manual/en/function.str-replace.php您只想更改内容文本中的两个标记名,PER标记吗?但是对于每个标签?
【解决方案2】:

您提到您的功能按照您希望的方式工作(链接标签),所以我不会搞砸。如果您查看get_tags() 的文档,您会看到它接受一些参数,包括number,这将限制它。这样你就不会有 $counter 类型的变量来搞乱了。

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

无论是否定义了$tags,您的str_replace 也会发生,如果没有找到可能会导致问题,因此您应该将其移至 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;
}

【讨论】:

  • 您的代码有效,但它只限制单个标签链接,而不是整个帖子标签链接。示例:我在帖子中标记了 3 个关键字,您的代码仅限制整个 3 个关键字的链接,而不是限制特定关键字的链接。我只是想在没有插件的内容中创建标签链接。就像SIMPLE TAG 插件一样。
  • 我已对其进行了更新,因此它在 foreach 循环中执行 str_replace 命令而不使用数组
【解决方案3】:

好吧,我想我现在更了解你想要什么了……

             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) 的限制,并且它位于标签循环内,这会替换每个标签的文本中标签名称的两个实例......这是否符合您的要求?请注意,这不区分大小写,因此如果您的标签是句子中的第一个单词并且大写,它将不匹配。要做这样的事情,也许看看这个线程: PHP preg_replace: Case insensitive match with case sensitive replacement

【讨论】:

  • 所以你的标签被命名为“img”、“a”和“h2”。这可能是个坏主意。您的需求可能超出了常见范围。也许您不应该使用简单的 php 函数进行解析。看看这个线程上的答案以获得一些深入的信息:stackoverflow.com/questions/8193327/…
  • 你可以切换到 preg 替换回调函数,并做一个有点复杂的正则表达式来寻找标签关闭器,同时让它不区分大小写(/e)......我不精通正则表达式。但是你的情况很独特,我不确定我能帮到你更多...php.net/manual/en/function.preg-replace-callback.php
  • 我是 wp 函数编码的新手,你能帮帮我吗?
  • 我编辑了原始答案以包含一个正则表达式,用于查找标签。如果您不关心不区分大小写,我不会打扰,因为多种原因......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 2012-11-26
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多