WP_Site_Health_Auto_Updates::test_all_files_writable()

Checks if core files are writable by the web user/group.


Return

(array|false) The test results if at least some of WordPress core files are writeable, or if a list of the checksums could not be retrieved from WordPress.org.<br> False if the core files are not writeable.


Source

File: wp-admin/includes/class-wp-site-health-auto-updates.php

	public function test_all_files_writable() {
		global $wp_filesystem;

		require ABSPATH . WPINC . '/version.php'; // $wp_version; // x.y.z

		$skin    = new Automatic_Upgrader_Skin();
		$success = $skin->request_filesystem_credentials( false, ABSPATH );

		if ( ! $success ) {
			return false;
		}

		WP_Filesystem();

		if ( 'direct' !== $wp_filesystem->method ) {
			return false;
		}

		// Make sure the `get_core_checksums()` function is available during our REST API call.
		if ( ! function_exists( 'get_core_checksums' ) ) {
			require_once ABSPATH . 'wp-admin/includes/update.php';
		}

		$checksums = get_core_checksums( classicpress_version_short(), 'en_US' );
		$dev       = classicpress_is_dev_install();

		// There may not be checksums for development releases, so just skip the test if we can't find any.
		if ( ! $checksums && $dev ) {
			return false;
		}

		if ( ! $checksums ) {
			$description = sprintf(
				/* translators: %s: ClassicPress version. */
				__( "Couldn't retrieve a list of the checksums for ClassicPress %s." ),
				$cp_version
			);
			$description .= ' ' . __( 'This could mean that connections are failing to WordPress.org or ClassicPress.net.' );
			return array(
				'description' => $description,
				'severity'    => 'warning',
			);
		}

		$unwritable_files = array();
		foreach ( array_keys( $checksums ) as $file ) {
			if ( str_starts_with( $file, 'wp-content' ) ) {
				continue;
			}
			if ( ! file_exists( ABSPATH . $file ) ) {
				continue;
			}
			if ( ! is_writable( ABSPATH . $file ) ) {
				$unwritable_files[] = $file;
			}
		}

		if ( $unwritable_files ) {
			if ( count( $unwritable_files ) > 20 ) {
				$unwritable_files   = array_slice( $unwritable_files, 0, 20 );
				$unwritable_files[] = '...';
			}
			return array(
				'description' => __( 'Some files are not writable by ClassicPress:' ) . ' <ul><li>' . implode( '</li><li>', $unwritable_files ) . '</li></ul>',
				'severity'    => 'fail',
			);
		} else {
			return array(
				'description' => __( 'All of your ClassicPress files are writable.' ),
				'severity'    => 'pass',
			);
		}
	}

Changelog

Changelog
Version Description
5.2.0 Introduced.