前言
Argon主题是一款知名的Wordpress主题,本站点使用的就是它。
此主题在Wordpress管理员面板增加了一个“Argon主题选项”界面,让用户能够可视化的修改主题参数,比如色彩、背景图、侧边栏文本、布局、页尾脚本···
值得注意的时,有很多参数都是文本内容。Argon主题和Wordpress一样使用PHP脚本,为了安全考虑,大部分参数在存入数据库之前都会被“反转义”。比如<
会变为<
,这就导致你无法在文本中直接使用HTML标签,因为它们会被反转义然后作为纯文本输出。
但是很多时候你希望直接在“Argon主题选项”的设置文本中硬编码HTML内容,而不是通过复杂的JS页尾脚本实现。比如为作者描述中的部分文本添加链接,方便用户点击跳转。
我们可以直接修改Argon主题文件中的相关代码实现这一点。幸运的是Wordpress管理员面板提供了直接修改主题文件的功能,且Argon主题自身提供了辅助函数,我们需要更改的内容非常少!!
本文将为“左侧栏的作者名”添加一个链接,为读者演示如何为指定参数关闭反转义。
直接修改参数
先尝试在 “Argon主题选项” 界面中直接修改 “左侧栏-作者名”,直接改成 <a href="#">Test</a>
。
点击最下方的保存之后,回到主界面观察。你好发现它显示的就是 <a href="#">Test</a>
,而不是一个带链接的 Test 。这是因为你点击保存时,PHP代码将内容进行了反转义,以 <a href="#@quot;>Test</a>
的格式存储和输出。
主题文件修改
现在回到Wordpress管理员面板,使用左侧的“外观-主题文件编辑器”功能修改Argon主题文件。
注意右边的主题文件目录,文件很多,但我们这里只关心 settings.php
文件,它就是“Argon主题选项”界面的代码。此文件内部有很多中文硬编码,你可以参考“Argon主题选项”界面的内容了解各个参数的作用。我们需要的是“左侧栏的作者名”,大致在550行的位置可以看到如下代码:
<tr>
<th><label><?php _e('左侧栏作者名称', 'argon');?></label></th>
<td>
<input type="text" class="regular-text" name="argon_sidebar_auther_name" value="<?php echo get_option('argon_sidebar_auther_name'); ?>"/>
<p class="description"><?php _e('留空则显示博客名', 'argon');?></p>
</td>
</tr>
显然你可以知道 argon_sidebar_auther_name
参数就代表了“左侧栏的作者名”。
这里并没有涉及转义和反转义,我们应该在哪里修改呢?想一想“Argon主题选项”界面的使用,我们修改完参数之后需要在页面最下方点击“保存更改”按钮。同样的,此PHP代码的最下方有保存和转义相关代码:
<?php
}
add_action('admin_menu', 'themeoptions_admin_menu');
function argon_update_option($name){
update_option($name, htmlspecialchars(stripslashes($_POST[$name])));
}
function argon_update_option_allow_tags($name){
update_option($name, stripslashes($_POST[$name]));
}
function argon_update_option_checkbox($name){
if (isset($_POST[$name]) && $_POST[$name] == 'true'){
update_option($name, 'true');
}else{
update_option($name, 'false');
}
}
function argon_update_themeoptions(){
if (!isset($_POST['update_themeoptions'])){
return;
}
if ($_POST['update_themeoptions'] == 'true'){
if (!isset($_POST['argon_update_themeoptions_nonce'])){
return;
}
$nonce = $_POST['argon_update_themeoptions_nonce'];
if (!wp_verify_nonce($nonce, 'argon_update_themeoptions')){
return;
}
//配置项
argon_update_option('argon_toolbar_icon');
argon_update_option('argon_toolbar_icon_link');
// ...............................
// 中间内容此处省略
// ...............................
//页头页尾脚本
argon_update_option_allow_tags('argon_custom_html_head');
argon_update_option_allow_tags('argon_custom_html_foot');
//公告
argon_update_option_allow_tags('argon_sidebar_announcement');
}
}
argon_update_themeoptions();
?>
注意到这段脚本执行了 argon_update_themeoptions
函数,此函数负责更新所有参数。而对于单个参数,分别使用了 argon_update_option
、argon_update_option_allow_tags
和 argon_update_option_checkbox
函数。
argon_update_option_checkbox
函数就是字面意思,专用于处理 checkbox
元素的信息。后两个函数负责文本参数,仔细观察 argon_update_option
和 argon_update_option_allow_tags
函数体,你会发现前者使用 htmlspecialchars
进行了反转义,而后者没有。
找到我们需要的 argon_sidebar_auther_name
参数的更新语句,它使用的就是 argon_update_option
,所以无法硬编码HTML标签。我们需要修改它:
argon_update_option_allow_tags('argon_sidebar_auther_name'); // 允许硬编码HTML
然后点击下方的“更新文件”按钮。
重新设置作者名
这里的代码修改完并不能立即生效,数据库中存放的还是反转义后的文本,你需要回到“Argon主题选项”中重新点击一遍“保存更改”选项。
保存更改后回到主页,你应该就能看到它显示的是带链接的 Test 了。
处理主题选项的显示错误
现在回到“Argon主题选项”,查看“侧边栏-作者名”,你会发现它的显示可能错乱了!!
这是因为我们在数据库中直接存放原文,在“Argon主题选项”界面中读取了原文并加载,此时没有反转义,导致排版错误!(主页中应该直接读取并显示带链接的文字,但主题选项中应该反转义并显示原文本。)现在回到主题文件,修改 settings.php
中的相关代码:
<tr>
<th><label><?php _e('左侧栏作者名称', 'argon');?></label></th>
<td>
<input type="text" class="regular-text" name="argon_sidebar_auther_name" value="<?php echo esc_attr(get_option('argon_sidebar_auther_name')); ?>"/>
<p class="description"><?php _e('留空则显示博客名', 'argon');?></p>
</td>
</tr>
我们使用了 esc_attr
包裹了 get_option
,反转义了特殊符号,现在点击下面的“更新文件”保存修改。
再回到”Argon主题选项”,你就能看到正确内容了。