WP_Filesystem_Base::search_for_folder() WordPress Method
The WP_Filesystem_Base::search_for_folder() method is used to search for a given folder within a specified directory. This is useful for finding a specific folder within a large directory structure.
WP_Filesystem_Base::search_for_folder( string $folder, string $base = '.', bool $loop = false ) #
Locates a folder on the remote filesystem.
Description
Expects Windows sanitized path.
Parameters
- $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
Return
(string|false) The location of the remote path, false to cease looping.
Source
File: wp-admin/includes/class-wp-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 /wordpress/ 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 WordPress 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 WP is at /var/www/.... return $this->search_for_folder( $folder, '/', true ); }
Expand full source codeCollapse full source codeView on TracView on GitHub
Changelog
Version | Description |
---|---|
2.7.0 | Introduced. |