私は、アップロードフォルダwp-content/uploads
が存在していなかったために私のWordPressテーマでエラーが発生した、BluehostでのWordPressインストールでいくつかのケースに遭遇しました。
明らかにBluehost cPanel WPインストーラはこのフォルダを作成しませんが、HostGatorは作成します。
そのため、フォルダをチェックし、それ以外の場合は作成するコードをテーマに追加する必要があります。
これを試して:
if (!file_exists('path/to/directory')) {
mkdir('path/to/directory', 0777, true);
}
0777
はすでにディレクトリのデフォルトモードであり、現在のumaskによって変更される可能性があることに注意してください。
これが足りない部分です。次のようにmkdir呼び出しで3番目の引数として「recursive」フラグを渡す必要があります(ブール値true)。
mkdir('path/to/directory', 0755, true);
これはグーグルに登場するので、もう少し普遍的な何か。詳細はより具体的ですが、この質問のタイトルはより普遍的です。
/**
* 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つのディレクトリを上り続けます。それから、そのディレクトリの次のディレクトリを作成しようとし、それがすべてのディレクトリを作成するまで続けます。成功すればtrueを返します。
停止レベルを設定することで改善できます。ユーザーフォルダなどを超えた場合やアクセス許可を含めることで失敗します。
このようなヘルパー関数はどうでしょうか。
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);
}
フォルダを作成するためのより速い方法:
if (!is_dir('path/to/directory')) {
mkdir('path/to/directory', 0777, true);
}
再帰的にディレクトリパスを作成します。
function makedirs($dirpath, $mode=0777) {
return is_dir($dirpath) || mkdir($dirpath, $mode, true);
}
Pythonの os.makedirs()
に触発された
WordPress内には非常に便利な関数 wp_mkdir_p もあり、これは再帰的にディレクトリ構造を作成します。
参照元: -
function wp_mkdir_p( $target ) {
$wrapper = null;
// strip the protocol
if( wp_is_stream( $target ) ) {
list( $wrapper, $target ) = explode( '://', $target, 2 );
}
// from php.net/mkdir user contributed notes
$target = str_replace( '//', '/', $target );
// put the wrapper back on the target
if( $wrapper !== null ) {
$target = $wrapper . '://' . $target;
}
// safe mode fails with a trailing slash under certain PHP versions.
$target = rtrim($target, '/'); // Use rtrim() instead of untrailingslashit to avoid formatting.php dependency.
if ( empty($target) )
$target = '/';
if ( file_exists( $target ) )
return @is_dir( $target );
// We need to find the permissions of the parent folder that exists and inherit that.
$target_parent = dirname( $target );
while ( '.' != $target_parent && ! is_dir( $target_parent ) ) {
$target_parent = dirname( $target_parent );
}
// Get the permission bits.
if ( $stat = @stat( $target_parent ) ) {
$dir_perms = $stat['mode'] & 0007777;
} else {
$dir_perms = 0777;
}
if ( @mkdir( $target, $dir_perms, true ) ) {
// If a umask is set that modifies $dir_perms, we'll have to re-set the $dir_perms correctly with chmod()
if ( $dir_perms != ( $dir_perms & ~umask() ) ) {
$folder_parts = explode( '/', substr( $target, strlen( $target_parent ) + 1 ) );
for ( $i = 1; $i <= count( $folder_parts ); $i++ ) {
@chmod( $target_parent . '/' . implode( '/', array_slice( $folder_parts, 0, $i ) ), $dir_perms );
}
}
return true;
}
return false;
}
ログインサイトにも同じことが必要です。私は2つの変数でディレクトリを作成する必要がありました。 $ディレクトリは、ユーザーのライセンス番号を使用して別のサブフォルダーを作成したいメインフォルダーです。
include_once("../include/session.php");
$lnum = $session->lnum; //Users license number from sessions
$directory = uploaded_labels; // Name of directory that folder is being created in
if (!file_exists($directory."/".$lnum)) {
mkdir($directory."/".$lnum, 0777, true);
}
これは、エラーを抑制しない最新の解決策です。
if (!is_dir('path/to/directory')) {
mkdir('path/to/directory');
}
$upload = wp_upload_dir();
$upload_dir = $upload['basedir'];
$upload_dir = $upload_dir . '/newfolder';
if (! is_dir($upload_dir)) {
mkdir( $upload_dir, 0700 );
}
質問の環境を考える。
そして引用元: http://php.net/manual/en/function.mkdir.php
ブール mkdir(文字列$パス名[、int $モード= 0777 [、ブール$再帰= FALSE [、リソース$コンテキスト]]])
Manualによると、必須のパラメータは$pathname
だけです。
だから、私たちは単にコーディングすることができます:
<?php
error_reporting(0);
if(!mkdir('wp-content/uploads')){
// todo
}
?>
パラメータを渡したり、フォルダが存在するかどうかをチェックしたり、必要でなければモードパラメータを渡したりする必要はありません。以下の理由による。
mode
は、 PHP を実行しているWindowsホスティングでは無視されます。mkdir
コマンドはすでにチェッカーに組み込まれています。したがって、戻り値のみをチェックする必要がありますTrue | False。それはエラーではなく、警告のみであり、警告はホスティングサーバーではデフォルトで無効になっています。これは、問題を検討するための単なる別の方法であり、より優れた、または最適な解決策を主張することではありません。
PHP 7、運用サーバー、Linux上でテスト済み
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);
}
私たちは常にコードをモジュール化しなければなりません、そして私は以下で同じチェックを書きました...ディレクトリが存在しない場合、最初にディレクトリをチェックします、ディレクトリを作成します。
$boolDirPresents = $this->CheckDir($DirectoryName);
if (!$boolDirPresents) {
$boolCreateDirectory = $this->CreateDirectory($DirectoryName);
if ($boolCreateDirectory) {
echo "Created successfully";
}
}
function CheckDir($DirName) {
if (file_exists($DirName)) {
echo "Dir Exists<br>";
return true;
} else {
echo "Dir Not Absent<br>";
return false;
}
}
function CreateDirectory($DirName) {
if (mkdir($DirName, 0777)) {
return true;
} else {
return false;
}
}
あなたも試すことができます:
$dirpath = "path/to/dir";
$mode = "0777";
is_dir($dirpath) || mkdir($dirpath, $mode, true);
if (!is_dir('path_directory')) {
@mkdir('path_directory');
}
最初に、ディレクトリが存在するかどうかを確認する必要がありますfile_exists('path_to_directory')
次に、mkdir(path_to_directory)
を使用してディレクトリを作成します
mkdir(string $ pathname [、int $ mode = 0777 [、bool $ recursive = FALSE [、resource $ context]]]):bool
mkdir()here の詳細
完全なコードはこちら:
$structure = './depth1/depth2/depth3/';
if (!file_exists($structure)) {
mkdir($structure);
}