Я'столкнулся с несколькими случаями установки WordPress на Bluehost, когда я'столкнулся с ошибками в моей теме WordPress из-за отсутствия папки uploads wp-content/uploads
.
По-видимому, программа установки WP cPanel Bluehost не создает эту папку, хотя 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);
}
Вдохновленный Python'ы ОС.makedirs()
В WordPress есть's также очень удобная функция 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);
}
Вы можете попробовать также:
$dirpath = "path/to/dir";
$mode = "0777";
is_dir($dirpath) || mkdir($dirpath, $mode, true);
Если вы хотите избежать проблемы file_exists
против 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);
}
Рассматривая вопрос'ы окружающей среды.
И цитирую: http://php.net/manual/en/function.mkdir.php
боол функция mkdir ( строка $в Pathname [, инт $режим = 0777 [, bool и $рекурсивный = значение false [, $ресурсов контексте ]]] )
Руководство говорит, что единственный обязательный параметр $путь
!
таким образом, мы можем просто код:
<?php
error_reporting(0);
if(!mkdir('wp-content/uploads')){
// todo
}
?>
Мы не'т иметь, чтобы передать какой-либо параметр или проверить, существует ли папка или даже передать параметр режим, если требуется; по следующим причинам:
режим
игнорируется на Windows хостинг используете PHP.команды mkdir
имеет строение в Проверка существует ли папка; поэтому мы должны проверить возвращаемое только истина|ложь, и не ошибка, а только предупреждение, и предупреждения отключен на серверах по умолчанию.Это просто другой способ взглянуть на этот вопрос и не претендует на лучше или наиболее оптимальное решение.
Проверено на PHP7, производственная сервера Linux
Мы всегда должны modularise наш код и я'вэ написано же проверить его ниже... Мы сначала проверяем каталога, если каталог отсутствует, то создайте каталог.
$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;
}
}
$upload = wp_upload_dir();
$upload_dir = $upload['basedir'];
$upload_dir = $upload_dir . '/newfolder';
if (! is_dir($upload_dir)) {
mkdir( $upload_dir, 0700 );
}
if (!is_dir('path_directory')) {
@mkdir('path_directory');
}
Сначала нужно проверить, если каталог существует. file_exists('путь_к_папке')
Затем использовать команду mkdir(путь_к_папке) для создания каталога
mkdir( string $pathname [, int $mode = 0777 [, bool $recursive = FALSE [, resource $context ]]] ) : bool
Подробнее о функция mkdir() здесь
Вот полный код:
$structure = './depth1/depth2/depth3/';
if (!file_exists($structure)) {
mkdir($structure);
}