Skip to content

Commit e296e15

Browse files
committed
fix: fatal error on servers with broken FTP filesystem configuration
On some server setups (e.g. nginx with FTP configured but no active connection), WordPress initializes its FTP filesystem driver but fails when it tries to use it, throwing a PHP fatal error that crashes the page. Wrap the filesystem calls in a try/catch so any such failure falls back to the bundled customization.js gracefully.
1 parent 35ba010 commit e296e15

1 file changed

Lines changed: 38 additions & 35 deletions

File tree

classes/Visualizer/Module.php

Lines changed: 38 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -529,50 +529,53 @@ protected function get_user_customization_js() {
529529
return $default;
530530
}
531531

532-
require_once( ABSPATH . 'wp-admin/includes/file.php' );
533-
WP_Filesystem();
534-
global $wp_filesystem;
535-
if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base' ) ) {
536-
$creds = request_filesystem_credentials( site_url() );
537-
wp_filesystem( $creds );
538-
}
532+
try {
533+
require_once( ABSPATH . 'wp-admin/includes/file.php' );
534+
WP_Filesystem();
535+
global $wp_filesystem;
536+
if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base' ) ) {
537+
return $default;
538+
}
539539

540-
$multisite_arg = '/';
541-
if ( is_multisite() && ! is_main_site() ) {
542-
$multisite_arg = '/sites/' . get_current_blog_id() . '/';
543-
}
540+
$multisite_arg = '/';
541+
if ( is_multisite() && ! is_main_site() ) {
542+
$multisite_arg = '/sites/' . get_current_blog_id() . '/';
543+
}
544544

545-
$dir = $wp_filesystem->wp_content_dir() . 'uploads' . $multisite_arg . 'visualizer';
546-
$file = $wp_filesystem->wp_content_dir() . 'uploads' . $multisite_arg . 'visualizer/customization.js';
545+
$dir = $wp_filesystem->wp_content_dir() . 'uploads' . $multisite_arg . 'visualizer';
546+
$file = $wp_filesystem->wp_content_dir() . 'uploads' . $multisite_arg . 'visualizer/customization.js';
547547

548-
if ( $wp_filesystem->is_readable( $file ) ) {
549-
return $specific;
550-
}
551-
552-
if ( $wp_filesystem->exists( $file ) && ! $wp_filesystem->is_readable( $file ) ) {
553-
do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Unable to read file %s', $file ), 'error', __FILE__, __LINE__ );
554-
return $default;
555-
}
548+
if ( $wp_filesystem->is_readable( $file ) ) {
549+
return $specific;
550+
}
556551

557-
if ( ! $wp_filesystem->exists( $dir ) ) {
558-
// phpcs:ignore WordPress.CodeAnalysis.AssignmentInCondition.Found
559-
if ( ( $done = $wp_filesystem->mkdir( $dir ) ) === false ) {
560-
do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Unable to create directory %s', $dir ), 'error', __FILE__, __LINE__ );
552+
if ( $wp_filesystem->exists( $file ) && ! $wp_filesystem->is_readable( $file ) ) {
553+
do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Unable to read file %s', $file ), 'error', __FILE__, __LINE__ );
561554
return $default;
562555
}
563-
}
564556

565-
// if file does not exist, copy.
566-
if ( ! $wp_filesystem->exists( $file ) ) {
567-
$src = str_replace( ABSPATH, $wp_filesystem->abspath(), VISUALIZER_ABSPATH . '/js/customization.js' );
568-
// phpcs:ignore WordPress.CodeAnalysis.AssignmentInCondition.Found
569-
if ( ( $done = $wp_filesystem->copy( $src, $file ) ) === false ) {
570-
do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Unable to copy file %s to %s', $src, $file ), 'error', __FILE__, __LINE__ );
571-
return $default;
557+
if ( ! $wp_filesystem->exists( $dir ) ) {
558+
// phpcs:ignore WordPress.CodeAnalysis.AssignmentInCondition.Found
559+
if ( ( $done = $wp_filesystem->mkdir( $dir ) ) === false ) {
560+
do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Unable to create directory %s', $dir ), 'error', __FILE__, __LINE__ );
561+
return $default;
562+
}
563+
}
564+
565+
// if file does not exist, copy.
566+
if ( ! $wp_filesystem->exists( $file ) ) {
567+
$src = str_replace( ABSPATH, $wp_filesystem->abspath(), VISUALIZER_ABSPATH . '/js/customization.js' );
568+
// phpcs:ignore WordPress.CodeAnalysis.AssignmentInCondition.Found
569+
if ( ( $done = $wp_filesystem->copy( $src, $file ) ) === false ) {
570+
do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Unable to copy file %s to %s', $src, $file ), 'error', __FILE__, __LINE__ );
571+
return $default;
572+
}
572573
}
573-
}
574574

575-
return $specific;
575+
return $specific;
576+
} catch ( \Throwable $e ) {
577+
return $default;
578+
}
576579
}
577580

578581
/**

0 commit comments

Comments
 (0)