WP_Filesystem_Base::search_for_folder()publicWP 2.7.0

Locates a folder on the remote filesystem.

Expects Windows sanitized path.

Method of the class: WP_Filesystem_Base{}

No Hooks.

Return

String|false. The location of the remote path, false to cease looping.

Usage

$WP_Filesystem_Base = new WP_Filesystem_Base();
$WP_Filesystem_Base->search_for_folder( $folder, $base, $loop );
$folder(string) (required)
The folder to locate.
$base(string)
The folder to start searching from.
Default: '.'
$loop(true|false)
If the function has recursed. Internal use only.
Default: false

Changelog

Since 2.7.0 Introduced.

WP_Filesystem_Base::search_for_folder() code WP 6.6.2

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