我使用add_theme_page()
在我的孩子主题中functions.php
实现了如下内容。。。
// other functions located here that create a custom options page in the Dashboard.
// THIS IS NOT A FILE PATH ISSUE -> THE CUSTOM PAGE IS CREATED IN BOTH CASES.
function my_menu() {
...
if ( \'save\' == $_REQUEST[\'action\'] ) {
echo \'<meta http-equiv="refresh" content="0;url=themes.php?page=functions.php&saved=true">\';
die;
}
add_theme_page(...)
}
add_action(\'admin_menu\', \'my_menu\');
As per the WordPress docs:
注意:如果您正在运行中,您没有足够的权限访问此页面。«中的消息wp_die()
屏幕,那么你已经上钩太早了。你应该用的钩子是admin_menu
.
这正是我在保存选项后遇到的错误。然而,我已经按照建议使用了正确的挂钩。
仅当我将函数移动到新文件并使用require_once
在内部funtions.php
. 我按照this answer.
require_once(\'includes/functions-theme-options.php\');
为什么只需将函数移动到外部文件中,就会出现这种情况?我想这可能与位置有关,但
require_once()
位于原始代码所在的准确位置。
当代码位于functions.php
, 它工作得很好。
当代码移动到外部文件并引用时require_once()
, 它会中断(根据上面引用的文档保存时出现的错误消息)。
显然,目前,我将其控制在function.php
, 但也许有人能解释为什么我移动它时它会断裂。
<小时>
EDIT
This is not a file path issue. 引用的每个文件
require_once()
正在找到并包含。问题似乎是如何执行。
请阅读以下答案:https://wordpress.stackexchange.com/a/1406/11092
<小时>
EDIT 2 - revised 1/16/13
这是一个经过验证的精简版本,可充分演示该问题。这段代码在“外观”下构造了一个子菜单页,称为“主题选项”。单击“保存选项”按钮时,页面将重新加载并显示“您的主题设置已保存”消息。但是,它会显示WordPress错误页面,“您没有足够的权限访问此页面。”只需将最后一个函数移动到
functions.php
清除此权限问题。我想知道为什么以及如何修复它。
在里面functions.php
文件:
<?php
require_once(\'includes/functions-test.php\');
在我的子主题目录中,
includes/functions-test.php
文件:
<?php
$themename = wp_get_theme();
function mytheme_admin() {
global $themename;
if ( $_REQUEST[\'saved\'] ) echo \'<div id="message" class="updated fade"><p><strong>\'.$themename.\' settings saved.</strong></p></div>\';
?>
<div class="wrap">
<h2><?php echo $themename; ?> Options</h2>
<div style="border-bottom: 1px dotted #000; padding-bottom: 10px; margin: 10px;">Options specfic to this theme.</div>
<form method="post">
<p class="submit">
<input name="save" type="submit" class="button button-primary" value="Save Options" />
<input type="hidden" name="action" value="save" />
</p>
</form>
</div>
<?php
}
function wp_initialize_the_theme_load() {
if (!function_exists("wp_initialize_the_theme")) {
wp_initialize_the_theme_message();
die;
}
}
add_action(\'admin_menu\', \'mytheme_add_admin\');
/* move only the following function to \'functions.php\' and the problem is gone
__________________________________________________________________________*/
function mytheme_add_admin() {
global $themename, $shortname;
if ( $_GET[\'page\'] == basename(__FILE__) ) {
if ( \'save\' == $_REQUEST[\'action\'] ) {
echo \'<meta http-equiv="refresh" content="0;url=themes.php?page=functions.php&saved=true">\';
die;
}
}
add_theme_page($themename." Options", "Theme Options", \'edit_theme_options\', basename(__FILE__), \'mytheme_admin\');
}
最合适的回答,由SO网友:Sparky 整理而成
我注意到自定义仪表板页面的URL是。。。
themes.php?page=functions-test.php
注意
page
是中的外部函数的名称
includes/functions-test.php
.
问题就在这一行,在权限错误之前刷新页面的那一行。。。
echo \'<meta http-equiv="refresh" content="0;url=themes.php?page=functions.php&saved=true">\';
现在看来这是显而易见的。看看
page
URL中的参数。。。它是
functions.php
其中应该是我的includes文件的名称,
functions-test.php
.
这是修复。。。
echo \'<meta http-equiv="refresh" content="0;url=themes.php?page=functions-test.php&saved=true">\';
现在我想知道是否有比硬编码文件名更可靠的解决方案。
EDIT:
没有硬编码的文件名。。。换句话说,使用
basename(__FILE__)
相反,我本可以将此代码移动到任何地方,而不会感到头痛。
echo \'<meta http-equiv="refresh" content="0;url=themes.php?page=\' . basename(__FILE__) . \'&saved=true">\';
感谢@ChipBennett提供的故障排除建议。
EDIT 2:
更进一步,我能够完全删除
meta
refresh;
和
die;
, 相反,我使用
action
的
form
按预期的元素。这是相同的表单
action
在默认WordPress外观页面中使用。
<form action="<?php echo esc_url( add_query_arg( \'saved\', true ) ) ?>" method="post">
add_query_arg( \'saved\', true )
意味着当页面重定向回自身时,在表单提交时,它将
&saved=1
追加到其查询字符串中。这是此代码显示
"options saved"
消息非常马虎的
meta refresh; die
及其硬编码URL,这是最初问题的根源,已被彻底根除。
FYI: 这是一个项目,我必须从客户的“自定义”主题中提取客户的原始选项和功能,并将其移动到一个包含二十三个主题的子主题中。使用这些草率编码实践的原始破损主题称为Delicate.