Создайте папку, если она еще не существует

я столкнулся с несколькими случаями установки WordPress с Bluehost, где я столкнулся с ошибками с моей темой WordPress, потому что папка Загрузки wp-content/uploads не присутствовал.

по-видимому, установщик Bluehost cPanel WP не создает эту папку, хотя HostGator делает это.

поэтому мне нужно добавить код в мою тему, которая проверяет папку и создает ее в противном случае.

13 ответов


попробуйте это:

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

отметим, что 0777 уже является режимом по умолчанию для каталогов и может быть изменен текущей umask.


вот недостающая часть. Вам нужно передать "рекурсивный" флаг в качестве третьего аргумента (boolean 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 Если каталог не может быть создан.

A лучше альтернативой является это (не должно давать никаких предупреждений):

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

рекурсивно создать путь к каталогу:

function makedirs($dirpath, $mode=0777) {
    return is_dir($dirpath) || mkdir($dirpath, $mode, true);
}

вдохновленный 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);
}

Это самое современное решение без подавления ошибки:

if (!is_dir('path/to/directory')) {
    mkdir('path/to/directory');
}

вы также можете попробовать:

$dirpath = "path/to/dir";
$mode = "0777";
is_dir($dirpath) || mkdir($dirpath, $mode, true);

создать папку, если она еще не существует

учитывая окружающую среду вопроса.

  • WordPress.
  • Веб-Сервер.
  • предполагая, что его Linux не Windows работает PHP.

и цитата из:http://php.net/manual/en/function.mkdir.php

bool команды mkdir ( строка $в Pathname [, инт $режим = 0777 [, bool и $рекурсивный = FALSE [, ресурс $context ]]])

руководство говорит, что единственным требуемым параметром является $pathname!

таким образом, мы можем просто код:

<?php
error_reporting(0); 
if(!mkdir('wp-content/uploads')){
   // todo
}
?>

объяснение:

нам не нужно передавать какой-либо параметр или проверять, существует ли папка, или даже передавать параметр режима, если это не необходимо; по следующим причинам:

  • команда создаст папку с разрешением 0755 (разрешение по умолчанию для общей папки хостинга) или 0777 команды по умолчанию.
  • mode игнорируется на хостинг Windows под управлением PHP.
  • уже mkdir команда имеет build in checker, если папка существует; поэтому нам нужно проверить возврат только True / False ; и это не ошибка, это только предупреждение, и предупреждение отключено на серверах хостинга по умолчанию.
  • согласно скорости, это быстрее, если предупреждение отключено.

это просто еще один способ взглянуть на вопрос и не претендуя на лучшее или самое оптимальное решение.

протестировано на PHP7, производственном сервере, Linux


$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');
}