Argon主题选项的转义控制(修改PHP代码)

前言

Argon主题是一款知名的Wordpress主题,本站点使用的就是它。

此主题在Wordpress管理员面板增加了一个“Argon主题选项”界面,让用户能够可视化的修改主题参数,比如色彩、背景图、侧边栏文本、布局、页尾脚本···

值得注意的时,有很多参数都是文本内容。Argon主题和Wordpress一样使用PHP脚本,为了安全考虑,大部分参数在存入数据库之前都会被“反转义”。比如<会变为&lt;,这就导致你无法在文本中直接使用HTML标签,因为它们会被反转义然后作为纯文本输出。

但是很多时候你希望直接在“Argon主题选项”的设置文本中硬编码HTML内容,而不是通过复杂的JS页尾脚本实现。比如为作者描述中的部分文本添加链接,方便用户点击跳转。

我们可以直接修改Argon主题文件中的相关代码实现这一点。幸运的是Wordpress管理员面板提供了直接修改主题文件的功能,且Argon主题自身提供了辅助函数,我们需要更改的内容非常少!!

本文将为“左侧栏的作者名”添加一个链接,为读者演示如何为指定参数关闭反转义。

直接修改参数

先尝试在 “Argon主题选项” 界面中直接修改 “左侧栏-作者名”,直接改成 <a href="#">Test</a>

点击最下方的保存之后,回到主界面观察。你好发现它显示的就是 <a href="#">Test</a>,而不是一个带链接的 Test 。这是因为你点击保存时,PHP代码将内容进行了反转义,以 &lt;a href=&quot;#@quot;&gt;Test&lt;/a&gt; 的格式存储和输出。

主题文件修改

现在回到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_optionargon_update_option_allow_tagsargon_update_option_checkbox 函数。

argon_update_option_checkbox 函数就是字面意思,专用于处理 checkbox 元素的信息。后两个函数负责文本参数,仔细观察 argon_update_optionargon_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主题选项”,你就能看到正确内容了。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇