フォルダが存在しない場合は、フォルダを作成します。

BluehostでWordPressをインストールした際に、アップロード用のフォルダwp-content/uploadsが存在しないためにWordPressテーマでエラーが発生するというケースに何度か遭遇しました。

どうやらBluehostのcPanel WPインストーラーではこのフォルダが作成されないようですが、HostGatorでは作成されます。

そのため、私のテーマに、このフォルダをチェックし、そうでなければ作成するコードを追加する必要があります。

ソリューション

これを試してみてください。

if (!file_exists('path/to/directory')) {
    mkdir('path/to/directory', 0777, true);
}

なお、0777はすでにディレクトリのデフォルトモードであり、現在のumaskによっても変更される可能性があります。

解説 (10)

googleでこれが出てくるので、もう少し普遍的なものを。 詳細はより具体的ですが、この質問のタイトルはより普遍的です。

/** 
 * 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;
}

これは、未作成のディレクトリが長く連なっている可能性のあるパスを受け取り、既存のディレクトリに到達するまで1つのディレクトリをさかのぼり続けます。 そして、そのディレクトリの次のディレクトリの作成を試み、すべてのディレクトリを作成するまで続けます。 成功すれば真を返します。

ユーザーフォルダを超えた場合に失敗するように停止レベルを設定したり、パーミッションを含めることで改善されるでしょう。

解説 (3)

次のようなヘルパー機能はどうでしょうか。

function makeDir($path)
{
     $ret = mkdir($path); // use @mkdir if you want to suppress warnings/errors
     return $ret === true || is_dir($path);
}

この関数は、ディレクトリの作成に成功したか、すでに存在している場合には true を、ディレクトリの作成ができなかった場合には false を返します。

もっと良い**代替案はこれです(警告は出ないはずです)。

function makeDir($path)
{
     return is_dir($path) || mkdir($path);
}
解説 (5)