diff --git a/code/wp-content/mu-plugins/hostforge-systems/src/Modules/CoreUpdates/Disable_Core_Updates.php b/code/wp-content/mu-plugins/hostforge-systems/src/Modules/CoreUpdates/Disable_Core_Updates.php index 9ceac78954..2a3aa515a8 100644 --- a/code/wp-content/mu-plugins/hostforge-systems/src/Modules/CoreUpdates/Disable_Core_Updates.php +++ b/code/wp-content/mu-plugins/hostforge-systems/src/Modules/CoreUpdates/Disable_Core_Updates.php @@ -4,7 +4,6 @@ namespace HostForgeSystems\Modules\CoreUpdates; use HostForgeSystems\Core\Module_Interface; use HostForgeSystems\Core\Notice; -use stdClass; if (! defined('ABSPATH')) { exit; @@ -29,57 +28,14 @@ class Disable_Core_Updates implements Module_Interface add_filter('allow_minor_auto_core_updates', '__return_false'); add_filter('allow_major_auto_core_updates', '__return_false'); - add_filter('pre_option__site_transient_update_core', [$this, 'force_empty_core_updates']); - add_filter('pre_site_transient_update_core', [$this, 'force_empty_core_updates'], 999); - add_filter('site_transient_update_core', [$this, 'force_empty_core_updates'], 999); - add_filter('pre_set_site_transient_update_core', [$this, 'force_empty_core_updates'], 999); - - add_action('admin_init', [$this, 'clear_core_update_transient'], 1); add_action('admin_init', [$this, 'remove_core_update_nag'], 1); + add_action('admin_init', [$this, 'block_manual_core_upgrade'], 1); add_action('admin_init', [$this, 'maybe_redirect_updates_screen'], 1); - add_action('init', [$this, 'disable_core_version_check'], 1); - add_filter('schedule_event', [$this, 'block_core_version_check_schedule'], 1); - add_action('admin_menu', [$this, 'remove_updates_submenu'], 999); add_action('admin_notices', [$this, 'render_admin_notice']); } - /** - * Return a clean empty core update object. - * - * @return \stdClass - */ - public function force_empty_core_updates(): stdClass - { - $clean = new stdClass(); - $clean->updates = []; - $clean->version_checked = get_bloginfo('version'); - $clean->last_checked = time(); - $clean->translations = []; - - return $clean; - } - - /** - * Clear cached core update transient during admin requests. - * - * @return void - */ - public function clear_core_update_transient(): void - { - if (! is_admin()) { - return; - } - - delete_site_transient('update_core'); - - wp_cache_delete('update_core', 'site-transient'); - wp_cache_delete('update_core', 'site-options'); - wp_cache_delete('_site_transient_update_core', 'options'); - wp_cache_delete('update_core', 'options'); - } - /** * Remove the default WordPress update nag. * @@ -91,7 +47,34 @@ class Disable_Core_Updates implements Module_Interface } /** - * Redirect users away from the native Updates screen. + * Block manual WordPress core upgrade attempts. + * + * @return void + */ + public function block_manual_core_upgrade(): void + { + if (! is_admin()) { + return; + } + + $action = isset($_GET['action']) ? sanitize_text_field(wp_unslash($_GET['action'])) : ''; + + if ($action !== 'do-core-upgrade') { + return; + } + + wp_die( + esc_html__( + 'WordPress core updates are disabled in wp-admin. Please use the HostForge Dashboard to manage core updates.', + 'hostforge-systems' + ), + esc_html__('Core Updates Managed by HostForge', 'hostforge-systems'), + ['response' => 403] + ); + } + + /** + * Redirect users away from the native WordPress Updates screen. * * @return void */ @@ -112,46 +95,20 @@ class Disable_Core_Updates implements Module_Interface } /** - * Disable WordPress core version checking hooks. - * - * @return void - */ - public function disable_core_version_check(): void - { - remove_action('init', 'wp_version_check'); - remove_action('admin_init', '_maybe_update_core'); - remove_action('wp_version_check', 'wp_version_check'); - } - - /** - * Block scheduling of core version checks. - * - * @param object|false $event Scheduled event object. - * @return object|false - */ - public function block_core_version_check_schedule($event) - { - if (is_object($event) && isset($event->hook) && $event->hook === 'wp_version_check') { - return false; - } - - return $event; - } - - /** - * Remove Updates submenu entries. + * Remove native Updates submenu entries. * * @return void */ public function remove_updates_submenu(): void { remove_submenu_page('index.php', 'update-core.php'); + remove_submenu_page('index.php', 'update-core'); remove_submenu_page('options-general.php', 'update-core.php'); remove_submenu_page('tools.php', 'update-core.php'); } /** - * Render HostForge notice on selected admin screens. + * Render HostForge admin notice showing the available WordPress version. * * @return void */ @@ -171,16 +128,55 @@ class Disable_Core_Updates implements Module_Interface 'dashboard', 'plugins', 'themes', - 'update-core', + 'index', ]; if (! in_array($screen->id, $allowed_screens, true)) { return; } + $available_version = $this->get_available_core_version(); + + if (! $available_version) { + return; + } + Notice::render( - 'HostForge Notice: WordPress core updates are managed through the HostForge Dashboard.', + sprintf( + 'HostForge Notice: WordPress %s is available. Please update from the HostForge Dashboard.', + esc_html($available_version) + ), 'info' ); } + + /** + * Get the available WordPress core version from the update transient. + * + * @return string|null + */ + protected function get_available_core_version(): ?string + { + $update_core = get_site_transient('update_core'); + + if (! is_object($update_core) || empty($update_core->updates) || ! is_array($update_core->updates)) { + return null; + } + + foreach ($update_core->updates as $update) { + if (! is_object($update)) { + continue; + } + + if (empty($update->response) || $update->response !== 'upgrade') { + continue; + } + + if (! empty($update->current) && is_string($update->current)) { + return $update->current; + } + } + + return null; + } } \ No newline at end of file