| @@ -1070,9 +1070,11 @@ | ||
| 1070 | 1070 | 'kb_url' => ( isset( $self_connect['code'] ) && 'unexpected_body' === $self_connect['code'] ) ? '' : 'https://docs.mainwp.com/troubleshooting/potential-issues/', |
| 1071 | 1071 | ); |
| 1072 | 1072 | } |
| 1073 | 1073 | |
| 1074 | - return $issues; | |
| 1074 | + $db_issues = MainWP_Database_Schema_Checker::get_detected_db_issues(); | |
| 1075 | + | |
| 1076 | + return array_merge( $issues, is_array( $db_issues ) ? $db_issues : array() ); | |
| 1075 | 1077 | } |
| 1076 | 1078 | |
| 1077 | 1079 | /** |
| 1078 | 1080 | * Add English export labels to localized report rows. |
| @@ -1377,9 +1379,9 @@ | ||
| 1377 | 1379 | if ( ! in_array( $frequency_auto_update, array( 'daily', 'weekly', 'monthly' ), true ) ) { |
| 1378 | 1380 | $frequency_auto_update = 'daily'; |
| 1379 | 1381 | } |
| 1380 | 1382 | |
| 1381 | - $show_widgets = get_user_option( 'mainwp_settings_show_widgets', array() ); | |
| 1383 | + $show_widgets = get_user_option( 'mainwp_settings_show_widgets' ); | |
| 1382 | 1384 | if ( ! is_array( $show_widgets ) ) { |
| 1383 | 1385 | $show_widgets = array(); |
| 1384 | 1386 | } |
| 1385 | 1387 | |
| @@ -2138,9 +2140,9 @@ | ||
| 2138 | 2140 | * |
| 2139 | 2141 | * @return array<int,array<string,mixed>> |
| 2140 | 2142 | */ |
| 2141 | 2143 | public static function get_conflict_signal_report_rows() { |
| 2142 | - $caching_plugins = static::get_active_plugins_by_keyword_group( | |
| 2144 | + $caching_plugins = static::get_active_plugins_by_keyword_group( | |
| 2143 | 2145 | array( |
| 2144 | 2146 | 'cache', |
| 2145 | 2147 | 'rocket', |
| 2146 | 2148 | 'litespeed', |
| @@ -2153,9 +2155,9 @@ | ||
| 2153 | 2155 | 'nitropack', |
| 2154 | 2156 | 'hummingbird', |
| 2155 | 2157 | ) |
| 2156 | 2158 | ); |
| 2157 | - $security_plugins = static::get_active_plugins_by_keyword_group( | |
| 2159 | + $security_plugins = static::get_active_plugins_by_keyword_group( | |
| 2158 | 2160 | array( |
| 2159 | 2161 | 'wordfence', |
| 2160 | 2162 | 'sucuri', |
| 2161 | 2163 | 'solid security', |
| @@ -2168,19 +2170,12 @@ | ||
| 2168 | 2170 | 'cloudflare', |
| 2169 | 2171 | 'limit login', |
| 2170 | 2172 | ) |
| 2171 | 2173 | ); |
| 2172 | - $maintenance_plugins = static::get_active_plugins_by_keyword_group( | |
| 2173 | - array( | |
| 2174 | - 'maintenance', | |
| 2175 | - 'coming soon', | |
| 2176 | - 'seedprod', | |
| 2177 | - 'lightstart', | |
| 2178 | - ) | |
| 2179 | - ); | |
| 2180 | - $maintenance_mode = static::get_maintenance_mode_indicators(); | |
| 2181 | - $dropins = static::get_dropin_conflict_indicators(); | |
| 2182 | 2174 | |
| 2175 | + $maintenance_mode = static::get_maintenance_mode_indicators(); | |
| 2176 | + $dropins = static::get_dropin_conflict_indicators(); | |
| 2177 | + | |
| 2183 | 2178 | return self::add_export_labels_to_rows( |
| 2184 | 2179 | array( |
| 2185 | 2180 | array( |
| 2186 | 2181 | 'label' => esc_html__( 'Caching / performance plugins', 'mainwp' ), |
| @@ -2208,9 +2203,192 @@ | ||
| 2208 | 2203 | ) |
| 2209 | 2204 | ); |
| 2210 | 2205 | } |
| 2211 | 2206 | |
| 2207 | + | |
| 2212 | 2208 | /** |
| 2209 | + * Get database rows. | |
| 2210 | + * | |
| 2211 | + * @return array<int,array<string,mixed>> | |
| 2212 | + */ | |
| 2213 | + public static function get_database_report_rows() { // phpcs:ignore -- NOSONAR - complex function. | |
| 2214 | + | |
| 2215 | + $db_info = MainWP_Database_Schema_Checker::get_database_info(); | |
| 2216 | + | |
| 2217 | + $database_size = isset( $db_info['database_size'] ) ? $db_info['database_size'] : array(); | |
| 2218 | + | |
| 2219 | + $data_size = isset( $database_size['data'] ) ? $database_size['data'] : 0; | |
| 2220 | + $index_size = isset( $database_size['index'] ) ? $database_size['index'] : 0; | |
| 2221 | + | |
| 2222 | + $db_privileges_info = MainWP_Database_Schema_Checker::get_database_privileges(); | |
| 2223 | + | |
| 2224 | + $db_privileges = ! empty( $db_privileges_info['database_grants'] ) && is_array( $db_privileges_info['database_grants'] ) ? implode( ', ', $db_privileges_info['database_grants'] ) . '.' : ''; | |
| 2225 | + | |
| 2226 | + $db_privileges_status = 'pass'; | |
| 2227 | + if ( ! empty( $db_privileges_info['database_missing_privileges'] ) && is_array( $db_privileges_info['database_missing_privileges'] ) ) { | |
| 2228 | + $db_privileges .= ' ' . esc_html__( 'Missing database privileges:', 'mainwp' ) . ' ' . implode( ', ', $db_privileges_info['database_missing_privileges'] ); | |
| 2229 | + $db_privileges_status = 'error'; | |
| 2230 | + } | |
| 2231 | + | |
| 2232 | + $db_rows_info = array( | |
| 2233 | + array( | |
| 2234 | + 'label' => esc_html__( 'MainWP database version', 'mainwp' ), | |
| 2235 | + 'value' => $db_info['mainwp_database_version'], | |
| 2236 | + ), | |
| 2237 | + array( | |
| 2238 | + 'label' => esc_html__( 'Database prefix', 'mainwp' ), | |
| 2239 | + 'value' => $db_info['database_prefix'], | |
| 2240 | + ), | |
| 2241 | + array( | |
| 2242 | + 'label' => esc_html__( 'Total Database Size', 'mainwp' ), | |
| 2243 | + 'value' => esc_html( sprintf( __( '%sMB', 'mainwp' ), $data_size + $index_size ) ), | |
| 2244 | + ), | |
| 2245 | + array( | |
| 2246 | + 'label' => esc_html__( 'Database Data Size', 'mainwp' ), | |
| 2247 | + 'value' => esc_html( sprintf( __( '%sMB', 'mainwp' ), $data_size ) ), | |
| 2248 | + ), | |
| 2249 | + array( | |
| 2250 | + 'label' => esc_html__( 'Database Index Size', 'mainwp' ), | |
| 2251 | + 'value' => esc_html( sprintf( __( '%sMB', 'mainwp' ), $index_size ) ), | |
| 2252 | + ), | |
| 2253 | + array( | |
| 2254 | + 'status' => $db_privileges_status, | |
| 2255 | + 'label' => esc_html__( 'Database privileges', 'mainwp' ), | |
| 2256 | + 'value' => $db_privileges, | |
| 2257 | + ), | |
| 2258 | + ); | |
| 2259 | + | |
| 2260 | + $db_rows = array(); | |
| 2261 | + $db_rows_missing = array(); | |
| 2262 | + | |
| 2263 | + if ( isset( $db_info['database_tables'] ) && is_array( $db_info['database_tables'] ) ) { | |
| 2264 | + | |
| 2265 | + $missing_db_tables = MainWP_Database_Schema_Checker::detect_missing_tables( $db_info['database_tables'] ); | |
| 2266 | + | |
| 2267 | + if ( is_array( $missing_db_tables ) ) { | |
| 2268 | + foreach ( array( 'core', 'extensions' ) as $type ) { | |
| 2269 | + $miss_tables = isset( $missing_db_tables[ $type ] ) ? $missing_db_tables[ $type ] : array(); | |
| 2270 | + if ( ! empty( $miss_tables ) && is_array( $miss_tables ) ) { | |
| 2271 | + if ( 'core' === $type ) { | |
| 2272 | + foreach ( $miss_tables as $tb_name ) { | |
| 2273 | + $db_rows_missing[] = array( | |
| 2274 | + 'label' => $tb_name, | |
| 2275 | + 'value' => esc_html__( 'Missing core table', 'mainwp' ), | |
| 2276 | + 'status' => 'error', | |
| 2277 | + ); | |
| 2278 | + } | |
| 2279 | + } else { | |
| 2280 | + foreach ( $miss_tables as $ext_slug => $miss_ext_tables ) { | |
| 2281 | + $title = MainWP_Database_Schema_Checker::get_loaded_extension_title( $ext_slug ); | |
| 2282 | + foreach ( $miss_ext_tables as $tb_name ) { | |
| 2283 | + $db_rows_missing[] = array( | |
| 2284 | + 'label' => $tb_name, | |
| 2285 | + 'value' => sprintf( esc_html__( 'Missing extension table: %1s', 'mainwp' ), $title ), | |
| 2286 | + 'status' => 'error', | |
| 2287 | + ); | |
| 2288 | + } | |
| 2289 | + } | |
| 2290 | + } | |
| 2291 | + } | |
| 2292 | + } | |
| 2293 | + } | |
| 2294 | + | |
| 2295 | + foreach ( array( 'core', 'other' ) as $type ) { | |
| 2296 | + $type_tables = isset( $db_info['database_tables'][ $type ] ) ? $db_info['database_tables'][ $type ] : array(); | |
| 2297 | + if ( is_array( $type_tables ) ) { | |
| 2298 | + foreach ( $type_tables as $tb_name => $info ) { | |
| 2299 | + | |
| 2300 | + if ( empty( $info ) ) { | |
| 2301 | + continue; // Missing table, so skip column detection. | |
| 2302 | + } | |
| 2303 | + | |
| 2304 | + $status = 'pass'; | |
| 2305 | + | |
| 2306 | + $detect_cols_issues = array(); | |
| 2307 | + | |
| 2308 | + /** | |
| 2309 | + * Filter to disable detection of missing table columns. Useful for slow hosts. | |
| 2310 | + * | |
| 2311 | + * @since 6.1.3. | |
| 2312 | + */ | |
| 2313 | + if ( apply_filters( 'mainwp_detect_table_column_issues', true ) ) { | |
| 2314 | + $detect_cols_issues = MainWP_Database_Schema_Checker::detect_table_columns_issues( $tb_name, $type ); | |
| 2315 | + } | |
| 2316 | + | |
| 2317 | + $missing_cols = is_array( $detect_cols_issues ) && isset( $detect_cols_issues['missing_columns'] ) ? $detect_cols_issues['missing_columns'] : array(); | |
| 2318 | + $invalid_cols = is_array( $detect_cols_issues ) && isset( $detect_cols_issues['invalid_columns'] ) ? $detect_cols_issues['invalid_columns'] : array(); | |
| 2319 | + | |
| 2320 | + $issues_cols_info = array(); | |
| 2321 | + | |
| 2322 | + if ( ! empty( $missing_cols ) && is_array( $missing_cols ) ) { | |
| 2323 | + $issues_cols_info[] = sprintf( esc_html__( 'Missing columns: %1s;', 'mainwp' ), implode( ', ', $missing_cols ) ); | |
| 2324 | + $status = 'error'; | |
| 2325 | + } | |
| 2326 | + | |
| 2327 | + if ( ! empty( $invalid_cols ) && is_array( $invalid_cols ) && isset( $invalid_cols[0]['column'] ) ) { | |
| 2328 | + | |
| 2329 | + $issues_string = implode( | |
| 2330 | + '; ', | |
| 2331 | + array_map( | |
| 2332 | + static function ( $issue ) { | |
| 2333 | + return sprintf( | |
| 2334 | + 'column: "%s" - expected: "%s" - actual: "%s"', | |
| 2335 | + $issue['column'], | |
| 2336 | + $issue['expected'], | |
| 2337 | + $issue['actual'] | |
| 2338 | + ); | |
| 2339 | + }, | |
| 2340 | + $invalid_cols | |
| 2341 | + ) | |
| 2342 | + ); | |
| 2343 | + | |
| 2344 | + $issues_cols_info[] = sprintf( | |
| 2345 | + esc_html__( 'Incorrect column definitions found: %s;', 'mainwp' ), | |
| 2346 | + $issues_string | |
| 2347 | + ); | |
| 2348 | + | |
| 2349 | + if ( 'pass' === $status ) { | |
| 2350 | + $status = 'error'; // warning - incorrect column definition. | |
| 2351 | + } | |
| 2352 | + } | |
| 2353 | + | |
| 2354 | + $tbl_info = ''; | |
| 2355 | + if ( is_array( $info ) && isset( $info['data'] ) ) { | |
| 2356 | + $tbl_info = sprintf( __( 'Data: %sMB + Index: %sMB + Engine %s', 'mainwp' ), $info['data'], $info['index'], $info['engine'] ); | |
| 2357 | + } | |
| 2358 | + | |
| 2359 | + $db_rows[] = array( | |
| 2360 | + 'label' => esc_html( $tb_name ), | |
| 2361 | + 'value' => esc_html( | |
| 2362 | + $tbl_info . ( ! empty( $issues_cols_info ) ? ' (' . implode( '; ', $issues_cols_info ) . ') ' : '' ), | |
| 2363 | + ), | |
| 2364 | + 'status' => $status, | |
| 2365 | + ); | |
| 2366 | + | |
| 2367 | + } | |
| 2368 | + } | |
| 2369 | + } | |
| 2370 | + | |
| 2371 | + MainWP_Database_Schema_Checker::prepare_db_and_tables_issues( $missing_db_tables ); | |
| 2372 | + } | |
| 2373 | + | |
| 2374 | + return self::add_export_labels_to_rows( | |
| 2375 | + array_merge( $db_rows_info, $db_rows_missing, $db_rows ), | |
| 2376 | + array( | |
| 2377 | + 'Database', | |
| 2378 | + 'Database privileges', | |
| 2379 | + 'MainWP database version', | |
| 2380 | + 'Database prefix', | |
| 2381 | + 'Total Database Size', | |
| 2382 | + 'Database Data Size', | |
| 2383 | + 'Database Index Size', | |
| 2384 | + 'Missing core table', | |
| 2385 | + ) | |
| 2386 | + ); | |
| 2387 | + } | |
| 2388 | + | |
| 2389 | + | |
| 2390 | + /** | |
| 2213 | 2391 | * Format boolean label. |
| 2214 | 2392 | * |
| 2215 | 2393 | * @param mixed $value True-ish value. |
| 2216 | 2394 | * |
| @@ -2665,20 +2843,12 @@ | ||
| 2665 | 2843 | if ( null !== $cached_data ) { |
| 2666 | 2844 | return $cached_data; |
| 2667 | 2845 | } |
| 2668 | 2846 | |
| 2669 | - $url = site_url( 'wp-cron.php' ); | |
| 2670 | - $query_args = array( 'mainwp_run' => 'test' ); | |
| 2671 | - $url = esc_url_raw( add_query_arg( $query_args, $url ) ); | |
| 2672 | - $response = wp_remote_post( | |
| 2673 | - $url, | |
| 2674 | - array( | |
| 2675 | - 'blocking' => true, | |
| 2676 | - 'sslverify' => apply_filters( 'https_local_ssl_verify', true ), | |
| 2677 | - 'timeout' => 15, | |
| 2678 | - ) | |
| 2679 | - ); | |
| 2847 | + $url = admin_url( 'admin-ajax.php' ); | |
| 2680 | 2848 | |
| 2849 | + $response = MainWP_System_Utility::test_self_connect( $url ); | |
| 2850 | + | |
| 2681 | 2851 | if ( is_wp_error( $response ) ) { |
| 2682 | 2852 | $cached_data = array( |
| 2683 | 2853 | 'value' => sprintf( |
| 2684 | 2854 | /* translators: %s: error message */ |
| @@ -2720,9 +2890,9 @@ | ||
| 2720 | 2890 | return $cached_data; |
| 2721 | 2891 | } |
| 2722 | 2892 | |
| 2723 | 2893 | $response_body = wp_remote_retrieve_body( $response ); |
| 2724 | - if ( false === strstr( $response_body, 'MainWP Test' ) ) { | |
| 2894 | + if ( 'MainWP Self Connect OK' !== trim( $response_body ) ) { | |
| 2725 | 2895 | $cached_data = array( |
| 2726 | 2896 | 'value' => esc_html__( 'Unexpected response body. Note: This is common and usually not a problem unless WP-Cron or loopback requests are failing.', 'mainwp' ), |
| 2727 | 2897 | 'status' => 'warning', |
| 2728 | 2898 | 'code' => 'unexpected_body', |