class-fl-builder-debug.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. <?php
  2. final class FL_Debug {
  3. static private $tests = array();
  4. public static function init() {
  5. if ( isset( $_GET['fldebug'] ) && get_option( 'fl_debug_mode', false ) === $_GET['fldebug'] ) {
  6. add_action( 'init', array( 'FL_Debug', 'display_tests' ) );
  7. }
  8. if ( get_option( 'fl_debug_mode', false ) ) {
  9. self::enable_logging();
  10. }
  11. }
  12. public static function enable_logging() {
  13. @ini_set( 'display_errors', 1 ); // @codingStandardsIgnoreLine
  14. @ini_set( 'display_startup_errors', 1 ); // @codingStandardsIgnoreLine
  15. @error_reporting( E_ALL ); // @codingStandardsIgnoreLine
  16. }
  17. public static function display_tests() {
  18. self::prepare_tests();
  19. header( 'Content-Type:text/plain' );
  20. foreach ( (array) self::$tests as $test ) {
  21. echo self::display( $test );
  22. }
  23. die();
  24. }
  25. private static function display( $test ) {
  26. if ( is_array( $test['data'] ) ) {
  27. $test['data'] = implode( "\n", $test['data'] );
  28. }
  29. return sprintf( "%s\n%s\n\n", $test['name'], $test['data'] );
  30. }
  31. private static function register( $slug, $args ) {
  32. self::$tests[ $slug ] = $args;
  33. }
  34. private static function formatbytes( $size, $precision = 2 ) {
  35. $base = log( $size, 1024 );
  36. $suffixes = array( '', 'K', 'M', 'G', 'T' );
  37. return round( pow( 1024, $base - floor( $base ) ), $precision ) . $suffixes[ floor( $base ) ];
  38. }
  39. private static function get_plugins() {
  40. $plugins = array();
  41. require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
  42. require_once( ABSPATH . 'wp-admin/includes/update.php' );
  43. $plugins_data = get_plugins();
  44. foreach ( $plugins_data as $plugin_path => $plugin ) {
  45. if ( is_plugin_active( $plugin_path ) ) {
  46. $plugins['active'][] = sprintf( '%s - version %s by %s.', $plugin['Name'], $plugin['Version'], $plugin['Author'] );
  47. } else {
  48. $plugins['deactive'][] = sprintf( '%s - version %s by %s.', $plugin['Name'], $plugin['Version'], $plugin['Author'] );
  49. }
  50. }
  51. return $plugins;
  52. }
  53. private static function get_mu_plugins() {
  54. $plugins_data = get_mu_plugins();
  55. $plugins = array();
  56. foreach ( $plugins_data as $plugin_path => $plugin ) {
  57. $plugins[] = sprintf( '%s version %s by %s', $plugin['Name'], $plugin['Version'], $plugin['Author'] );
  58. }
  59. return $plugins;
  60. }
  61. private static function safe_ini_get( $ini ) {
  62. return @ini_get( $ini ); // @codingStandardsIgnoreLine
  63. }
  64. private static function divider() {
  65. return '----------------------------------------------';
  66. }
  67. private static function prepare_tests() {
  68. global $wpdb, $wp_version;
  69. $args = array(
  70. 'name' => 'WordPress',
  71. 'data' => self::divider(),
  72. );
  73. self::register( 'wp', $args );
  74. $args = array(
  75. 'name' => 'WordPress Address',
  76. 'data' => get_option( 'siteurl' ),
  77. );
  78. self::register( 'wp_url', $args );
  79. $args = array(
  80. 'name' => 'Site Address',
  81. 'data' => get_option( 'home' ),
  82. );
  83. self::register( 'site_url', $args );
  84. $args = array(
  85. 'name' => 'WP Version',
  86. 'data' => $wp_version,
  87. );
  88. self::register( 'wp_version', $args );
  89. $args = array(
  90. 'name' => 'WP Debug',
  91. 'data' => defined( 'WP_DEBUG' ) && WP_DEBUG ? 'Yes' : 'No',
  92. );
  93. self::register( 'wp_debug', $args );
  94. $args = array(
  95. 'name' => 'FL Debug',
  96. 'data' => FLBuilder::is_debug() ? 'Yes' : 'No',
  97. );
  98. self::register( 'fl_debug', $args );
  99. $args = array(
  100. 'name' => 'SSL Enabled',
  101. 'data' => is_ssl() ? 'Yes' : 'No',
  102. );
  103. self::register( 'wp_ssl', $args );
  104. $args = array(
  105. 'name' => 'Language',
  106. 'data' => get_locale(),
  107. );
  108. self::register( 'lang', $args );
  109. $args = array(
  110. 'name' => 'Multisite',
  111. 'data' => is_multisite() ? 'Yes' : 'No',
  112. );
  113. self::register( 'is_multi', $args );
  114. $args = array(
  115. 'name' => 'WordPress memory limit',
  116. 'data' => WP_MAX_MEMORY_LIMIT,
  117. );
  118. self::register( 'wp_max_mem', $args );
  119. $args = array(
  120. 'name' => 'Themes',
  121. 'data' => self::divider(),
  122. );
  123. self::register( 'themes', $args );
  124. $theme = wp_get_theme();
  125. $args = array(
  126. 'name' => 'Active Theme',
  127. 'data' => array(
  128. sprintf( '%s - v%s', $theme->get( 'Name' ), $theme->get( 'Version' ) ),
  129. sprintf( 'Parent Theme: %s', ( $theme->get( 'Template' ) ) ? $theme->get( 'Template' ) : 'Not a child theme' ),
  130. ),
  131. );
  132. self::register( 'active_theme', $args );
  133. $args = array(
  134. 'name' => 'Plugins',
  135. 'data' => self::divider(),
  136. );
  137. self::register( 'plugins', $args );
  138. $args = array(
  139. 'name' => 'Plugins',
  140. 'data' => self::divider(),
  141. );
  142. self::register( 'wp_plugins', $args );
  143. $defaults = array(
  144. 'active' => array(),
  145. 'deactive' => array(),
  146. );
  147. $plugins = wp_parse_args( self::get_plugins(), $defaults );
  148. $args = array(
  149. 'name' => 'Active Plugins',
  150. 'data' => $plugins['active'],
  151. );
  152. self::register( 'wp_plugins', $args );
  153. $args = array(
  154. 'name' => 'Unactive Plugins',
  155. 'data' => $plugins['deactive'],
  156. );
  157. self::register( 'wp_plugins_deactive', $args );
  158. $args = array(
  159. 'name' => 'Must-Use Plugins',
  160. 'data' => self::get_mu_plugins(),
  161. );
  162. self::register( 'mu_plugins', $args );
  163. $args = array(
  164. 'name' => 'PHP',
  165. 'data' => self::divider(),
  166. );
  167. self::register( 'php', $args );
  168. $args = array(
  169. 'name' => 'PHP SAPI',
  170. 'data' => php_sapi_name(),
  171. );
  172. self::register( 'php_sapi', $args );
  173. $args = array(
  174. 'name' => 'PHP Memory Limit',
  175. 'data' => self::safe_ini_get( 'memory_limit' ),
  176. );
  177. self::register( 'php_mem_limit', $args );
  178. $args = array(
  179. 'name' => 'PHP Version',
  180. 'data' => phpversion(),
  181. );
  182. self::register( 'php_ver', $args );
  183. $args = array(
  184. 'name' => 'Post Max Size',
  185. 'data' => self::safe_ini_get( 'post_max_size' ),
  186. );
  187. self::register( 'post_max', $args );
  188. $args = array(
  189. 'name' => 'PHP Max Input Vars',
  190. 'data' => self::safe_ini_get( 'max_input_vars' ),
  191. );
  192. self::register( 'post_max_input', $args );
  193. $args = array(
  194. 'name' => 'PHP Max Execution Time',
  195. 'data' => self::safe_ini_get( 'max_execution_time' ),
  196. );
  197. self::register( 'post_max_time', $args );
  198. $args = array(
  199. 'name' => 'Max Upload Size',
  200. 'data' => self::formatbytes( wp_max_upload_size() ),
  201. );
  202. self::register( 'post_max_upload', $args );
  203. $curl = ( function_exists( 'curl_version' ) ) ? curl_version() : false;
  204. $args = array(
  205. 'name' => 'Curl',
  206. 'data' => ( $curl ) ? sprintf( '%s - %s', $curl['version'], $curl['ssl_version'] ) : 'Not Enabled.',
  207. );
  208. self::register( 'curl', $args );
  209. $args = array(
  210. 'name' => 'PCRE Backtrack Limit ( default 1000000 )',
  211. 'data' => self::safe_ini_get( 'pcre.backtrack_limit' ),
  212. );
  213. self::register( 'backtrack', $args );
  214. $args = array(
  215. 'name' => 'PCRE Recursion Limit ( default 100000 )',
  216. 'data' => self::safe_ini_get( 'pcre.recursion_limit' ),
  217. );
  218. self::register( 'recursion', $args );
  219. $args = array(
  220. 'name' => 'BB Products',
  221. 'data' => self::divider(),
  222. );
  223. self::register( 'bb', $args );
  224. $args = array(
  225. 'name' => 'Beaver Builder',
  226. 'data' => FL_BUILDER_VERSION,
  227. );
  228. self::register( 'bb_version', $args );
  229. $args = array(
  230. 'name' => 'Beaver Themer',
  231. 'data' => ( defined( 'FL_THEME_BUILDER_VERSION' ) ) ? FL_THEME_BUILDER_VERSION : 'Not active/installed.',
  232. );
  233. self::register( 'themer_version', $args );
  234. $args = array(
  235. 'name' => 'Beaver Theme',
  236. 'data' => ( defined( 'FL_THEME_VERSION' ) ) ? FL_THEME_VERSION : 'Not active/installed.',
  237. );
  238. self::register( 'theme_version', $args );
  239. $args = array(
  240. 'name' => 'Cache Folders',
  241. 'data' => self::divider(),
  242. );
  243. self::register( 'cache_folders', $args );
  244. $cache = FLBuilderModel::get_cache_dir();
  245. $args = array(
  246. 'name' => 'Beaver Builder Path',
  247. 'data' => $cache['path'],
  248. );
  249. self::register( 'bb_cache_path', $args );
  250. $args = array(
  251. 'name' => 'Beaver Builder Path writable',
  252. 'data' => ( fl_builder_filesystem()->is_writable( $cache['path'] ) ) ? 'Yes' : 'No',
  253. );
  254. self::register( 'bb_cache_path_writable', $args );
  255. if ( class_exists( 'FLCustomizer' ) ) {
  256. $cache = FLCustomizer::get_cache_dir();
  257. $args = array(
  258. 'name' => 'Beaver Theme Path',
  259. 'data' => $cache['path'],
  260. );
  261. self::register( 'bb_theme_cache_path', $args );
  262. $args = array(
  263. 'name' => 'Beaver Theme Path writable',
  264. 'data' => ( fl_builder_filesystem()->is_writable( $cache['path'] ) ) ? 'Yes' : 'No',
  265. );
  266. self::register( 'bb_theme_cache_path_writable', $args );
  267. }
  268. $args = array(
  269. 'name' => 'License',
  270. 'data' => self::divider(),
  271. );
  272. self::register( 'license', $args );
  273. if ( true === FL_BUILDER_LITE ) {
  274. $args = array(
  275. 'name' => 'Beaver Builder License',
  276. 'data' => 'Lite version detected',
  277. );
  278. self::register( 'bb_sub_lite', $args );
  279. } elseif ( class_exists( 'FLUpdater' ) ) {
  280. $subscription = FLUpdater::get_subscription_info();
  281. $args = array(
  282. 'name' => 'Beaver Builder License',
  283. 'data' => ( $subscription->active ) ? 'Active' : 'Not Active',
  284. );
  285. self::register( 'bb_sub', $args );
  286. if ( isset( $subscription->error ) ) {
  287. $args = array(
  288. 'name' => 'License Error',
  289. 'data' => $subscription->error,
  290. );
  291. self::register( 'bb_sub_err', $args );
  292. }
  293. if ( isset( $subscription->domain ) ) {
  294. $args = array(
  295. 'name' => 'Domain Active',
  296. 'data' => ( '1' == $subscription->domain->active ) ? 'Yes' : 'No',
  297. );
  298. self::register( 'bb_sub_domain', $args );
  299. }
  300. }
  301. $args = array(
  302. 'name' => 'Server',
  303. 'data' => self::divider(),
  304. );
  305. self::register( 'serv', $args );
  306. $args = array(
  307. 'name' => 'MySQL Version',
  308. 'data' => ( ! empty( $wpdb->is_mysql ) ? $wpdb->db_version() : 'Unknown' ),
  309. );
  310. self::register( 'mysql_version', $args );
  311. $args = array(
  312. 'name' => 'Server Info',
  313. 'data' => $_SERVER['SERVER_SOFTWARE'],
  314. );
  315. self::register( 'server', $args );
  316. $args = array(
  317. 'name' => 'htaccess files',
  318. 'data' => self::divider(),
  319. );
  320. self::register( 'up_htaccess', $args );
  321. // detect uploads folder .htaccess file and display it if found.
  322. $uploads = wp_upload_dir( null, false );
  323. $uploads_htaccess = trailingslashit( $uploads['basedir'] ) . '.htaccess';
  324. $root_htaccess = trailingslashit( ABSPATH ) . '.htaccess';
  325. if ( file_exists( $root_htaccess ) ) {
  326. ob_start();
  327. readfile( $root_htaccess );
  328. $htaccess = ob_get_clean();
  329. $args = array(
  330. 'name' => $root_htaccess . "\n",
  331. 'data' => $htaccess,
  332. );
  333. self::register( 'up_htaccess_root', $args );
  334. }
  335. if ( file_exists( $uploads_htaccess ) ) {
  336. ob_start();
  337. readfile( $uploads_htaccess );
  338. $htaccess = ob_get_clean();
  339. $args = array(
  340. 'name' => $uploads_htaccess . "\n",
  341. 'data' => $htaccess,
  342. );
  343. self::register( 'up_htaccess_uploads', $args );
  344. }
  345. }
  346. }
  347. add_action( 'plugins_loaded', array( 'FL_Debug', 'init' ) );