Я столкнулся с несколькими случаями с установками WordPress с Bluehost, где я столкнулся с ошибками в моей теме WordPress, потому что папка uploads wp-content/uploads
отсутствовала.
По-видимому, установщик Bluehost cPanel WP не создает эту папку, хотя HostGator делает.
Поэтому мне нужно добавить код к моей теме, который проверяет папку и создает ее в противном случае.
Попробуй это:
if (!file_exists('path/to/directory')) { mkdir('path/to/directory', 0777, true); }
Обратите внимание, что 0777
уже является режимом по умолчанию для каталогов и все еще может быть изменен текущей umask.
Вот недостающая часть. Вы должны передать флаг «рекурсивный» в качестве третьего аргумента (логическое значение true) в mkdir, например:
mkdir('path/to/directory', 0755, true);
Что-то более универсальное, так как это появляется на 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; }
Это займет путь, возможно, с длинной цепочкой несозданных каталогов и продолжит движение вверх по одному каталогу до тех пор, пока он не попадет в существующий каталог. Затем он попытается создать следующий каталог в этом каталоге и продолжить, пока не будет создан все каталоги. Он возвращает 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); }
Рекурсивно создать путь к каталогу:
function makedirs($dirpath, $mode=0777) { return is_dir($dirpath) || mkdir($dirpath, $mode, true); }
Вдохновленный os.makedirs()
Python os.makedirs()
Более быстрый способ создания папки:
if (!is_dir('path/to/directory')) { mkdir('path/to/directory', 0777, true); }
В 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; }
Мне нужно то же самое для сайта входа. Мне нужно было создать каталог с двумя переменными. Каталог $ – это основная папка, в которой я хотел создать другую подпапку с номером лицензии пользователей.
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); }
в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'); }
if (!is_dir('path_directory')) { @mkdir('path_directory'); }
Вы также можете попробовать:
$dirpath = "path/to/dir"; $mode = "0777"; is_dir($dirpath) || mkdir($dirpath, $mode, true);
Я закончил
//if(!is_dir($path) || !is_file($path) || !file_exists($path)){ // still erroring??? try{ mkdir($path); } catch (\ErrorException $e){ }
после того, как прокомментированная часть не сработала