get_id() ); if ( empty( $addon_id ) ) { return new WP_Error( 'invalid_addon_id', __( 'Addon ID is required.', 'wpthemoon' ) ); } if ( isset( $this->addons[ $addon_id ] ) ) { return new WP_Error( 'duplicate_addon', __( 'Addon is already registered.', 'wpthemoon' ) ); } $this->addons[ $addon_id ] = $addon; return true; } public function boot_available_addons() { foreach ( $this->addons as $addon_id => $addon ) { if ( ! $this->is_addon_available( $addon_id ) ) { continue; } try { $addon->boot(); $this->loaded_addons[ $addon_id ] = true; do_action( 'wpthemoon_addon_loaded', $addon_id, $addon ); } catch ( Throwable $exception ) { $this->errors[ $addon_id ] = $exception->getMessage(); } } } public function get_addons() { return $this->addons; } public function get_addon( $addon_id ) { $addon_id = sanitize_key( $addon_id ); return isset( $this->addons[ $addon_id ] ) ? $this->addons[ $addon_id ] : null; } public function is_addon_loaded( $addon_id ) { $addon_id = sanitize_key( $addon_id ); return ! empty( $this->loaded_addons[ $addon_id ] ); } public function is_addon_available( $addon_id ) { $addon = $this->get_addon( $addon_id ); if ( ! $addon ) { return false; } return (bool) $addon->is_available(); } public function get_addon_error( $addon_id ) { $addon_id = sanitize_key( $addon_id ); return isset( $this->errors[ $addon_id ] ) ? $this->errors[ $addon_id ] : ''; } }