WP_Filesystem_Base::search_for_folder() – Locates a folder on the remote filesystem.

You appear to be a bot. Output may be restricted

Description

Locates a folder on the remote filesystem.

Expects Windows sanitized path.

Usage

$string|false = WP_Filesystem_Base::search_for_folder( $folder, $base, $loop );

Parameters

$folder
( string ) required – The folder to locate.
$base
( string ) optional default: . – The folder to start searching from.
$loop
( bool ) optional – If the function has recursed. Internal use only.

Returns

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

Source

File name: wordpress/wp-admin/includes/class-wp-filesystem-base.php


Lines:

1 to 74 of 74
  public function search_for_folder( $folder, $base = '.', $loop = false ) {
    if ( empty( $base ) || '.' === $base ) {
      $base = trailingslashit( $this->WP_Filesystem_Base::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->WP_Filesystem_Base::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->WP_Filesystem_Base::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->WP_Filesystem_Base::search_for_folder( $folder, '/', true );

  }
 

 View on GitHub View on Trac