Bluehostを使用したWordPressのインストールで、uploadsフォルダーwp-content/uploads
が存在しないためにWordPressテーマでエラーが発生したいくつかのケースに遭遇しました。
どうやらお申し込みのcPanelのにWordPressのインストーラは、このフォルダを作成しませんHostgatorのはありません。
そのため、フォルダーをチェックしてそれ以外の場合は作成するコードをテーマに追加する必要があります。
Bluehostを使用したWordPressのインストールで、uploadsフォルダーwp-content/uploads
が存在しないためにWordPressテーマでエラーが発生したいくつかのケースに遭遇しました。
どうやらお申し込みのcPanelのにWordPressのインストーラは、このフォルダを作成しませんHostgatorのはありません。
そのため、フォルダーをチェックしてそれ以外の場合は作成するコードをテーマに追加する必要があります。
回答:
mkdirを使用してこれを試してください:
if (!file_exists('path/to/directory')) {
mkdir('path/to/directory', 0777, true);
}
0777
はすでにディレクトリのデフォルトモードであり、現在のumaskによって引き続き変更される可能性があることに注意してください。
file_exists
—ファイルまたはディレクトリが存在する is_file
かどうかを確認します—ファイル名が通常のファイルであるis_dir
かどうかを確認します —ファイル名がディレクトリであるかどうかを確認します
これはグーグルで登場するので、もう少し普遍的なもの。詳細はより具体的ですが、この質問のタイトルはより普遍的です。
/**
* 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);
}
@
して適切なis_dir
チェックで置き換える場合、私の賛成票はあなたのものです:) is_writable()
防水ヘルパー関数の親ディレクトリかどうかをチェックするボーナスポイント。
フォルダーを作成するより速い方法:
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つの変数を持つディレクトリを作成する必要がありました。$ directoryは、ユーザーライセンス番号を持つ別のサブフォルダーを作成したいメインフォルダーです。
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);
}
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);
}
if (!is_dir('path_directory')) {
@mkdir('path_directory');
}
あなたも試すことができます:
$dirpath = "path/to/dir";
$mode = "0777";
is_dir($dirpath) || mkdir($dirpath, $mode, true);
質問の環境を考慮します。
そして、引用:http : //php.net/manual/en/function.mkdir.php
bool mkdir(string $ pathname [、int $ mode = 0777 [、bool $ recursive = FALSE [、resource $ context]]])
マニュアルでは、必須パラメーターは$pathname
!
したがって、単純にコーディングできます。
<?php
error_reporting(0);
if(!mkdir('wp-content/uploads')){
// todo
}
?>
必要がない限り、パラメーターを渡したり、フォルダーが存在するかどうかを確認したり、モードパラメーターを渡したりする必要はありません。次の理由により:
mode
PHPを実行しているWindowsホスティングでは無視されます。mkdir
フォルダーが存在する場合、コマンドにはすでにチェッカーが組み込まれています。したがって、戻り値のみをチェックする必要がありますTrue | False; エラーではなく、警告のみであり、警告はホスティングサーバーではデフォルトで無効になっています。これは、質問を検討するためのもう1つの方法であり、より良いまたは最適なソリューションを主張するものではありません。
PHP7、本番サーバー、Linuxでテスト済み
$upload = wp_upload_dir();
$upload_dir = $upload['basedir'];
$upload_dir = $upload_dir . '/newfolder';
if (! is_dir($upload_dir)) {
mkdir( $upload_dir, 0700 );
}
私たちは常にコードをモジュール化する必要があり、私は同じチェックを以下に記述しました...最初にディレクトリをチェックします。ディレクトリがない場合は、ディレクトリを作成します。
$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;
}
}
まず、ディレクトリが存在するかどうかを確認する必要があります file_exists('path_to_directory')
次に、を使用mkdir(path_to_directory)
してディレクトリを作成します
mkdir( string $pathname [, int $mode = 0777 [, bool $recursive = FALSE [, resource $context ]]] ) : bool
ここに完全なコード:
$structure = './depth1/depth2/depth3/';
if (!file_exists($structure)) {
mkdir($structure);
}
どうぞ。
if (!is_dir('path/to/directory')) {
if (!mkdir('path/to/directory', 0777, true) && !is_dir('path/to/directory')) {
throw new \RuntimeException(sprintf('Directory "%s" was not created', 'path/to/directory'));
}
}
受け入れられた回答は機能しますが、権限のために適切なソリューションではありません。0777権限により、全員がディレクトリにアクセス/読み取り/書き込みできます。これは、Webサーバーのアップロードディレクトリに必要なものではありません。ここに提案された正しい完全なソリューションがあります。
$path_to_directory = 'path/to/directory';
if (!file_exists($path_to_directory) && !is_dir($path_to_directory)) {
mkdir($path_to_directory, 0644, true);
}
0644は、通常、サーバーにアップロードされてそこで実行されることを望まないため、アップロードディレクトリの適切な権限です。
trueは、再帰プロパティをtrueまたはfalseに設定するための3番目のパラメーターです。パス名で指定されたネストされたディレクトリを作成できます。
if (!file_exists('path/to/directory')) { mkdir('path/to/directory', 0777, true); }