仅在函数.php中使用REQUIRED_ONCE()时出现问题

时间:2014-01-15 作者:Sparky

我使用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\');
}

1 个回复
最合适的回答,由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;, 相反,我使用actionform 按预期的元素。这是相同的表单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.

结束

相关推荐

Wp-Content/Themes/文件夹中的index.php文件

今晚,当我注意到一个索引时,我正在手动将我正在处理的主题上传到我的wordpress安装中。我的主题文件夹中的php文件。我打开了文件,其中只包含以下三行代码:<?php //silence is golden ?> 这让我很担心,起初我想可能是我不小心把文件上传到了主题目录,但文件的内容并不是我想放的任何东西。所以我的意思是,应该有一个索引。我的wp内容/主题/目录中的php文件?还是有人把它放在那里了。或现在我想起来了,可能是我无意中上传了这个文件,然后一个“黑