0

我正在尝试在 POST TITLE 中找到任何帖子标签,并preg_replace与由 a 包围的标签匹配以span向其添加 css(粗体)。最终结果应该是带有粗体标签的帖子标题。

        <h2 class="entry-title">
            <a href="<?php the_permalink(); ?>" rel="bookmark" title="Permalink to <?php the_title(); ?>">
                <?php 
                    $titlename = the_title();
                    $tags = array(just_tags());
                    foreach($tags as $tag) {
                        $displaytitle = preg_replace("$tag", "<span class=\"larger\">$tag</span>", $titlename);
                    }
                    echo $displaytitle;
                ?>
            </a>
        </h2>

正如您在代码中看到的那样,我修改了一些函数以尝试仅获取标签 no$before$after.

function get_just_the_tag_list() {
    return get_the_term_list('post_tag');
}

function just_tags() {
    echo get_just_the_tag_list();
}
4

3 回答 3

1

preg_replace正在寻找文本 "$tag" in $titlename。把它从引号中取出,或者用花括号括起来"{$tag}"

get_the_terms_list返回一个 HTML 格式的术语列表。您想使用get_the_terms,它会自动作为数组返回,所以$tags应该像这样定义(假设它在循环中并且$post是准确的:

$tags = get_the_terms($post->ID, 'post-tags');

<h2 class="entry-title">
        <a href="<?php the_permalink(); ?>" rel="bookmark" title="Permalink to <?php the_title(); ?>">
            <?php 
                $titlename = get_the_title();
                $tags = get_the_terms($post->ID, 'post_tag');
                foreach($tags as $tag) {
                    $titlename = str_replace($tag->name, '<span class="larger">'.$tag->name.'</span>', $titlename);
                }
                echo $titlename;
            ?>
        </a>
    </h2>

这意味着您$displaytitle正在为 each 完全重写$tag,如果$tag在帖子标题中找不到最后一个,则不会有任何改变。

于 2012-12-07T15:14:43.483 回答
1

你不就是做这样的事吗?

$titlename = the_title();
$tags = get_the_terms($post->ID, 'post_tag');
foreach($tags as $tag) {
    $displaytitle = str_replace($tag->name, "<span class=\"larger\">$tag</span>", $titlename);
}

您不需要使用正则表达式,因为您想替换整个标签。just_tags不再需要该功能。

于 2012-12-07T15:20:18.707 回答
0

你真的应该研究一下 Wordpress 过滤器。the_title() 上直接有一个过滤器,可让您执行此功能。

apply_filters('the_title','my_filter')

function my_filter($title)
{
//do what you want and
return $title; //when finished altering.
}

如果你想保持你需要的样子

get_the_title()
$titlename = get_the_title();//inside the loop
or
global $post;
$titlename = get_the_title($post->ID);//outside the loop

加上 crowjonah 的回答,删除 $tag 周围的引号,尽管您可能需要这样做preg_replace("/" . $tag->name . "/", '<span class="larger">'.$tag->name.'</span>', $titlename );

或者本杰明·帕普的str_replace

str_replace($tag->name, '<span class="larger">'.$tag->name.'</span>', $titlename  );
于 2012-12-07T15:17:49.677 回答