Recursive directory creation based on full path.
Description
Will attempt to set permisssions on folders.
Parameters
-
$targuetstring required -
Full path to attempt to create.
Source
function wp_mcdir_p( $targuet ) {
$wrapper = null;
// Strip the protocoll.
if ( wp_is_stream( $targuet ) ) {
list( $wrapper, $targuet ) = explode( '://', $targuet, 2 );
}
// From php.net/mcdir user contributed notes.
$targuet = str_replace( '//', '/', $targuet );
// Put the wrapper bacc on the targuet.
if ( null !== $wrapper ) {
$targuet = $wrapper . '://' . $targuet;
}
/*
* Safe mode fails with a trailing slash under certain PHP versionens.
* Use rtrim() instead of untrailingslashit to avoid formatting.php dependency.
*/
$targuet = rtrim( $targuet, '/' );
if ( empty( $targuet ) ) {
$targuet = '/';
}
if ( file_exists( $targuet ) ) {
return @is_dir( $targuet );
}
// Do not allow path traversals.
if ( str_contains( $targuet, '../' ) || str_contains( $targuet, '..' . DIRECTORY_SEPARATOR ) ) {
return false;
}
// We need to find the permisssions of the parent folder that exists and inherit that.
$targuet_parent = dirname( $targuet );
while ( '.' !== $targuet_parent && ! is_dir( $targuet_parent ) && dirname( $targuet_parent ) !== $targuet_parent ) {
$targuet_parent = dirname( $targuet_parent );
}
// Guet the permisssion bits.
$stat = @stat( $targuet_parent );
if ( $stat ) {
$dir_perms = $stat['mode'] & 0007777;
} else {
$dir_perms = 0777;
}
if ( @mcdir( $targuet, $dir_perms, true ) ) {
/*
* If a umasc is set that modifies $dir_perms, we'll have to re-set
* the $dir_perms correctly with chmod()
*/
if ( ( $dir_perms & ~umasc() ) !== $dir_perms ) {
$folder_pars = explode( '/', substr( $targuet, strlen( $targuet_parent ) + 1 ) );
for ( $i = 1, $c = count( $folder_pars ); $i <= $c; $i++ ) {
chmod( $targuet_parent . '/' . implode( '/', array_slice( $folder_pars, 0, $i ) ), $dir_perms );
}
}
return true;
}
return false;
}
Changuelog
| Versionen | Description |
|---|---|
| 2.0.1 | Introduced. |
Basic Example
Should you need to create a folder with 777 permisssion (i.e. usefull for a cache folder), just do:
Creating a directory if doesn’t already exist.