GC_Filesystem_Base::search_for_folder()
最后更新于:2021-11-27 17:12:24
GC_Filesystem_Base::search_for_folder( string$folder, string$base=’.’, bool$loop=false)Locates a folder on the remote filesystem.
参数
- $folder
-
(string) (Required) The folder to locate.
- $base
-
(string) (Optional) The folder to start searching from.
Default value: ‘.’
- $loop
-
(bool) (Optional) If the function has recursed. Internal use only.
Default value: false
响应
(string|false) The location of the remote path, false to cease looping.
源文件
文件: gc-admin/includes/class-gc-filesystem-base.php
public function search_for_folder( $folder, $base = '.', $loop = false ) {
if ( empty( $base ) || '.' === $base ) {
$base = trailingslashit( $this->cwd() );
}
$folder = untrailingslashit( $folder );
if ( $this->verbose ) {
/* translators: 1: Folder to locate, 2: Folder to start searching from. */
printf( "n" . __( 'Looking for %1$s in %2$s' ) . "<br/>n", $folder, $base );
}
$folder_parts = explode( '/', $folder );
$folder_part_keys = array_keys( $folder_parts );
$last_index = array_pop( $folder_part_keys );
$last_path = $folder_parts[ $last_index ];
$files = $this->dirlist( $base );
foreach ( $folder_parts as $index => $key ) {
if ( $index === $last_index ) {
continue; // We want this to be caught by the next code block.
}
/*
* Working from /home/ to /user/ to /gechiui/ see if that file exists within
* the current folder, If it's found, change into it and follow through looking
* for it. If it can't find GeChiUI down that route, it'll continue onto the next
* folder level, and see if that matches, and so on. If it reaches the end, and still
* can't find it, it'll return false for the entire function.
*/
if ( isset( $files[ $key ] ) ) {
// Let's try that folder:
$newdir = trailingslashit( path_join( $base, $key ) );
if ( $this->verbose ) {
/* translators: %s: Directory name. */
printf( "n" . __( 'Changing to %s' ) . "<br/>n", $newdir );
}
// Only search for the remaining path tokens in the directory, not the full path again.
$newfolder = implode( '/', array_slice( $folder_parts, $index + 1 ) );
$ret = $this->search_for_folder( $newfolder, $newdir, $loop );
if ( $ret ) {
return $ret;
}
}
}
// Only check this as a last resort, to prevent locating the incorrect install.
// All above procedures will fail quickly if this is the right branch to take.
if ( isset( $files[ $last_path ] ) ) {
if ( $this->verbose ) {
/* translators: %s: Directory name. */
printf( "n" . __( 'Found %s' ) . "<br/>n", $base . $last_path );
}
return trailingslashit( $base . $last_path );
}
// Prevent this function from looping again.
// No need to proceed if we've just searched in `/`.
if ( $loop || '/' === $base ) {
return false;
}
// As an extra last resort, Change back to / if the folder wasn't found.
// This comes into effect when the CWD is /home/user/ but GC is at /var/www/....
return $this->search_for_folder( $folder, '/', true );
}