J'ai rencontré quelques cas d'installations WordPress avec Bluehost où j'ai rencontré des erreurs avec mon thème WordPress car le dossier de téléchargement wp-content/uploads
n'était pas présent.
Apparemment, le programme d’installation Bluehost cPanel WP ne crée pas ce dossier, contrairement à HostGator.
J'ai donc besoin d'ajouter du code à mon thème pour vérifier le dossier et le créer autrement.
Essaye ça:
if (!file_exists('path/to/directory')) {
mkdir('path/to/directory', 0777, true);
}
Notez que 0777
est déjà le mode par défaut pour les répertoires et peut toujours être modifié par le umask actuel.
Voici la pièce manquante. Vous devez passer le drapeau 'récursif' en tant que troisième argument (boolean true) dans l'appel mkdir comme ceci:
mkdir('path/to/directory', 0755, true);
Quelque chose d'un peu plus universel depuis que cela arrive sur google. Bien que les détails soient plus précis, le titre de cette question est plus universel.
/**
* 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;
}
Cela prendra un chemin, éventuellement avec une longue chaîne de répertoires incréés, et continuera à monter d’un répertoire jusqu’à ce qu’il atteigne un répertoire existant. Ensuite, il essaiera de créer le répertoire suivant dans ce répertoire et continuera jusqu'à ce qu'il soit créé tous les répertoires. Il retourne vrai en cas de succès.
Pourrait être amélioré en fournissant un niveau d'arrêt afin qu'il échoue si le contenu dépasse le dossier de l'utilisateur ou quelque chose de ce type, et en incluant des autorisations.
Qu'en est-il une fonction d'assistance comme ceci:
function makeDir($path)
{
$ret = mkdir($path); // use @mkdir if you want to suppress warnings/errors
return $ret === true || is_dir($path);
}
Il renverra true
si le répertoire a été créé avec succès ou existe déjà, et false
si le répertoire n'a pas pu être créé.
Une meilleure alternative est la suivante (ne devrait donner aucun avertissement):
function makeDir($path)
{
return is_dir($path) || mkdir($path);
}
Moyen plus rapide de créer un dossier:
if (!is_dir('path/to/directory')) {
mkdir('path/to/directory', 0777, true);
}
Créer récursivement le chemin du répertoire:
function makedirs($dirpath, $mode=0777) {
return is_dir($dirpath) || mkdir($dirpath, $mode, true);
}
Inspiré par os.makedirs()
Dans WordPress, vous trouverez également la fonction très pratique wp_mkdir_p qui créera récursivement une structure de répertoires.
Source pour référence: -
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;
}
J'ai besoin de la même chose pour un site de connexion. Je devais créer un répertoire avec deux variables . Le répertoire $ est le dossier principal dans lequel je voulais créer un autre sous-dossier avec le numéro de licence de l'utilisateur.
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);
}
Il s'agit de la solution la plus récente sans suppression des erreurs:
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 );
}
Considérant l'environnement de la question.
Et en citant: http://php.net/manual/en/function.mkdir.php
bool mkdir (string $ cheminNom [ int $ mode = 0777 [ bool $ récursif = FALSE [ ressource $ contexte]]])
Manuel dit que le seul paramètre requis est le $pathname
!
alors, nous pouvons simplement coder:
<?php
error_reporting(0);
if(!mkdir('wp-content/uploads')){
// todo
}
?>
Nous n'avons pas besoin de transmettre de paramètre ni de vérifier si le dossier existe ou même de passer le paramètre de mode sauf si nécessaire; Pour les raisons suivantes:
mode
est ignoré sur Hébergement Windows sous PHP.mkdir
a été intégrée au vérificateur si le dossier existe; nous devons donc vérifier le retour uniquement Vrai | Faux; et ce n'est pas une erreur, c'est seulement un avertissement et Avertissement est désactivé par défaut dans les serveurs d'hébergement.Ceci est juste une autre façon d’envisager la question et de ne pas prétendre à une solution meilleure ou optimale.
Testé sur PHP7, serveur de production, Linux
Si vous voulez éviter le problème file_exists
VS is_dir
, je vous suggère de regarder ici
J'ai essayé cela et il ne crée le répertoire que si le répertoire n'existe pas . Peu importe, il existe un fichier portant ce nom.
/* 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);
}
Nous devrions toujours modulariser notre code et j'ai écrit les mêmes vérifications ci-dessous ....__ Nous vérifions d'abord le répertoire, si le répertoire est absent, nous le créons.
$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;
}
}
Vous pouvez aussi essayer:
$dirpath = "path/to/dir";
$mode = "0777";
is_dir($dirpath) || mkdir($dirpath, $mode, true);
if (!is_dir('path_directory')) {
@mkdir('path_directory');
}
Vous devez d’abord vérifier si le répertoire existe file_exists('path_to_directory')
Puis utilisez mkdir(path_to_directory)
pour créer un répertoire
mkdir (string $ chemin chemin [ int $ mode = 0777 [ bool $ recursive = FAUX [ resource $ contexte]]]): bool
En savoir plus sur mkdir () here
Code complet ici:
$structure = './depth1/depth2/depth3/';
if (!file_exists($structure)) {
mkdir($structure);
}