RecursiveDirectoryIterator在管理员中不起作用

时间:2016-04-02 作者:Daniel Florido

我下面的功能在查看网站前端时不会出错。但当我登录到管理区域时,会导致致命错误。错误表明它无法再找到该文件夹。

//req all the php files in current & sub dirs.
function req_php_files($filepath) {
    $Directory = new RecursiveDirectoryIterator($filepath);
    $Iterator = new RecursiveIteratorIterator($Directory);
    $Regex = new RegexIterator($Iterator, \'/^.+\\.php$/i\', RecursiveRegexIterator::GET_MATCH);

    $php_files = array();

    foreach ($Regex as $file) {
        array_push($php_files, $file[0]);
    }
    foreach ($php_files as $req_file) {
        require_once $req_file;
    }
}
req_php_files(\'wp-content/themes/vac3/acf\');

PHP Fatal error: Uncaught exception \'UnexpectedValueException\' with message \'RecursiveDirectoryIterator::__construct(wp-content/themes/vac3/acf): failed to open dir: No such file or directory\' in /Applications/MAMP/htdocs/vac3/wp-content/themes/vac3/functions.php:177

为什么这个功能在网站的前端工作,而我在登录admin时却不工作?

1 个回复
最合适的回答,由SO网友:birgire 整理而成

我想问题是你的relative 路径当您访问/wp-admin/, 它将尝试定位wp-content/themes/vac3/acf 在里面,它在那里找不到它。请在的帮助下尝试完整路径__DIR__get_template_directory() –更多详细信息blog post. 如果稍后删除acf/ 子目录?你可能想用is_dir(). 此外,您可能需要使用FilesystemIterator (the parent class) constants 和使用FilesystemIterator::SKIP_DOTS 跳过... 指针和FilesystemIterator::FOLLOW_SYMLINKS (PHP v5.3.1以上)以…遵循符号链接。您可能还想使用FilesystemIterator::CURRENT_AS_PATHNAME 避免在只需要文件路径时返回对象。

如果后端不需要此功能,可以将其挂接到前端或使用! is_admin() 检查挂钩内部。您还应该注意只在需要的地方加载这个。我还想知道这是否应该是一个插件?还有其他选择,如自动加载。

通常要做的事情是将所有内容打包到一个回调中,该回调附加到某个过滤器或挂钩上。示例:

// Use the proper filter – below just as example
add_filter( \'wp_loaded\', function() {

    // Only serve for public requests
    if ( is_admin() )
        return;

    $Iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator( get_template_directory().\'/acf\' )
    );
    $Regex = new RegexIterator(
        $Iterator, 
        \'/^.+\\.php$/i\', 
        RecursiveRegexIterator::GET_MATCH
    );

    foreach ( $Regex as $file )
        require_once $file[0];
} );
如果你只使用FilesystemIterator 如果您只有一个文件夹需要从中获取文件–非递归:

add_action( \'wp_loaded\', function() {

    if ( is_admin() )
        return;

    $files = new \\FilesystemIterator( 
        get_template_directory().\'/acf\', 
        \\FilesystemIterator::SKIP_DOTS
        | FilesystemIterator::FOLLOW_SYMLINKS
        | FilesystemIterator::CURRENT_AS_PATHNAME
    );

    foreach ( $files as $file )
    {
        /** @noinspection PhpIncludeInspection */
        ! $files->isDir() and include $files->getRealPath();
    }
} );