Primer主题的Bug

网站建立好后,第一件事当然就是开始摸索WordPress的使用方法啦。这个软件由于是图形化的界面,操作很简单点击下就好,而且汉化得还行,比较适合用于简单建立一个网站。把大多数功能都试了一遍后我写了第一篇文章,然后就发现了Primer主题的一个Bug(o(≧口≦)o),在点击作者进入作者页面后,发现作者姓名的HTML代码居然被直接显示出来了 


通过打开网页的源代码,我发现这一行被写成了这样

<h1 class="page-title">作者:&lt;span class="vcard"&gt;yellowko&lt;/span&gt;</h1>

(写成这样不直接显示才怪呢(╯‵□′)╯︵┻━┻)简直忍不了,逼我走上了Debug的道路。

查找相关资料我知道了作者页面如果主题中没有author.php那么就会自动寻找archive.php,通过主机文件管理的功能,我在主题的目录中打开了archive.php

然后。。。。。我跟你港我就这表情

我只学过一点点HTML啊,PHP什么的都看不懂啊啊啊,没办法只能硬着头皮上,通过控制变量法,我找到了问题出在get_header()这个函数上,WordPress官方资料显示,这个函数是调用header.php这个文件的函数。打开header.php用同样的方法发现问题出在了这一行:

do_action( 'primer_after_header' );

看注释写的似乎是对这两个函数的回调

//@hooked primer_add_primary_navigation - 11
//@hooked primer_add_page_title – 12

查找godaddy的文档,找到这两个函数在/inc/hooks.php里,打开文件用同样的方法发现问题出在后面这个函数上,这个函数内部调用了/templates/parts/page-title.php这个文件,打开后发现代码不多,核心就是调用了primer_the_page_title()同样可以在Godaddy查到这个函数位于/inc/template-tags.php,在这里找到这个函数后,我大概看懂了PHP的运作方式,使用PHP的目的就是可以动态地更改网页的内容,通过调用函数和一些参数的改变,PHP通过输出可以自动生成网页的HTML代码,实现了网页的动态改变(还好脚本语言好懂)。回到正题,我在这个函数中的primer_get_the_page_title(),找到了

case is_archive() :
	$title = get_the_archive_title();
	break;

继续往下寻找,发现了这一段判断

elseif ( is_author() ) {
		/* translators: Author archive title. 1: Author name */
		$title = sprintf( __( 'Author: %s' ), '<span class="vcard">' . get_the_author() . '</span>' );
}

没错,想必这就是出问题那一行的代码,但是这个函数是WordPress官方提供的,不在主题的目录里面,其他主题使用时并没用问题,我直接在archive.php里写这一行也没有发现错误,说明问题出在了Primer主题的调用方式上。于是我回到/inc/template-tags.php,在primer_the_page_title()中发现了这一行:

$html =  esc_html($args['title']);

通过查找资料,发现这个函数是用于把字符串中的特殊符号转化成HTML中的转义字符的,所以作者姓名连带着HTML的代码被原样输出了,可能是为了防止标题中带有需要原样输出的HTML代码所以这样写的把,但是就导致了这样的一个Bug。。。。我用了一个很暴力的解决办法,直接不使用这个函数,变成这样:

$html =  $args['title'];

emmmm,期待不会导致以后不会出现什么新Bug吧。


Primer主题1.8.1已经悄悄修复这个Bug(笑),他的解决方案比yellowko更暴力,直接把获取到的文章标题里所有HTML标签给去掉了,修改的是/inc/helper.php中的获取标题函数:

case is_archive() :
	$title = wp_strip_all_tags( get_the_archive_title());
	break;

 

关于 “Primer主题的Bug” 的 2 个意见

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据