我在Bluehost上安装WordPress时遇到过一些情况,我的WordPress主题遇到了错误,因为上传文件夹wp-content/uploads不存在。

显然Bluehost cPanel WordPress安装程序不会创建这个文件夹,但HostGator可以。

因此,我需要向我的主题添加代码,以检查文件夹并创建它。


当前回答

我们可以使用mkdir创建文件夹。我们也可以为它设置权限。

价值的许可 0不能读、写或执行 1只能执行 2 .只会写字 3 .可以写入和执行 4 .只能阅读 5 .可以读取和执行 6 .会读会写 7能读、写和执行

<?PHP
  
// Making a directory with the provision
// of all permissions to the owner and 
// the owner's user group
mkdir("/documents/post/", 0770, true)
  
?>

其他回答

这是缺失的部分。你需要在mkdir调用中传递'recursive'标志作为第三个参数(布尔值true),如下所示:

mkdir('path/to/directory', 0755, true);

如果您想避免file_exists vs. is_dir问题,我建议您看一下这里。

我尝试了这一点,它只创建目录,如果目录不存在。它不关心是否有同名的文件。

/* Creates the directory if it does not exist */
$path_to_directory = 'path/to/directory';
if (!file_exists($path_to_directory) && !is_dir($path_to_directory)) {
    mkdir($path_to_directory, 0777, true);
}

你还可以试试:

$dirpath = "path/to/dir";
$mode = "0764";
is_dir($dirpath) || mkdir($dirpath, $mode, true);

如果一个文件夹不存在,则创建该文件夹

考虑到问题的环境。

WordPress。 网络服务器。 假设它是Linux,而不是运行PHP的Windows。

并引用:mkdir

Bool mkdir (string $pathname [, int $mode = 0777 [, Bool $recursive = . [,资源$context]]])

手册说唯一需要的参数是$pathname!

因此,我们可以简单地编码:

<?php
    error_reporting(0); 

    if(!mkdir('wp-content/uploads')){
        // Todo
    }
?>

解释:

除非需要,否则我们不需要传递任何参数或检查文件夹是否存在,甚至不需要传递mode参数;原因如下:

该命令将创建具有0755权限(共享主机文件夹的默认权限)或0777权限(该命令的默认权限)的文件夹。 mode在运行PHP的Windows主机上被忽略。 mkdir命令已经有一个内置的检查器,用于检查文件夹是否存在;所以我们需要检查返回的只有True|False;这不是错误;它只是一个警告,默认情况下,警告在主机服务器上是禁用的。 至于速度,这是更快,如果警告禁用。

这只是研究问题的另一种方式,而不是声称有更好或最优的解决方案。

它在PHP 7、生产服务器和Linux上进行了测试

这里有一些更通用的东西,因为它出现在谷歌上。虽然细节更具体,但这个问题的标题更具有普遍性。

/**
 * recursively create a long directory path
 */
function createPath($path) {
    if (is_dir($path)) 
        return true;
    $prev_path = substr($path, 0, strrpos($path, '/', -2) + 1 );
    $return = createPath($prev_path);
    return ($return && is_writable($prev_path)) ? mkdir($path) : false;
}

这将采用一条路径,可能包含一长串未创建的目录,并继续向上移动一个目录,直到到达一个现有目录。然后,它将尝试在该目录中创建下一个目录,直到创建所有目录为止。如果成功则返回true。

它可以通过提供一个停止级别来改进,这样它就会在超出用户文件夹或其他地方时失败,并包括权限。