diff --git a/database-admin-css.css b/database-admin-css.css new file mode 100644 index 0000000..e8de93f --- /dev/null +++ b/database-admin-css.css @@ -0,0 +1,55 @@ +.text-ok { + color: green; +} + +/* ------------------------------------------------------------- + DBManager Check Groups + ------------------------------------------------------------- */ +.dbmanager-check-group { + margin: 1em 0; +} + +.dbmanager-check-group h3 { + margin: 0 0 .3em; + font-size: 1.2em; +} + +/* Toggle button - Override WordPress defaults */ +.dbmanager-check-group .dbmanager-toggle { + background: none; + border: none; + text-decoration: none; + outline: none; + padding: 0; + margin: 0; + cursor: pointer; + color: inherit; + font-size: inherit; + font-weight: normal; + line-height: 1.4; + width: auto; + display: inline; +} + +/* Status colors */ +.dbmanager-check-group .dbmanager-toggle.dbmanager-ok { color: green; } +.dbmanager-check-group .dbmanager-toggle.dbmanager-err { color: red; } + +/* Content area */ +.dbmanager-check-group .dbmanager-content { + margin-left: 0; + padding: 0; + display: none; /* Initially hidden */ +} + +.dbmanager-check-group .dbmanager-content p { + margin: .2em 0; + line-height: 1.4; +} + +/* Details styling */ +.dbmanager-details { + color: #666; + font-size: 0.9em; + margin-left: .4em; +} diff --git a/database-backup.php b/database-backup.php index c9621fa..cdfa701 100644 --- a/database-backup.php +++ b/database-backup.php @@ -8,6 +8,8 @@ ### Variables Variables Variables $base_name = plugin_basename('wp-dbmanager/database-manager.php'); $base_page = 'admin.php?page='.$base_name; +$return_page = 'admin.php?page=wp-dbmanager/database-manage.php'; + $current_date = mysql2date(sprintf(__('%s @ %s', 'wp-dbmanager'), get_option('date_format'), get_option('time_format')), gmdate('Y-m-d H:i:s', current_time('timestamp'))); $backup = array(); $backup_options = get_option('dbmanager_options'); @@ -50,6 +52,7 @@ $backup['command'] = $brace . escapeshellcmd( $backup['mysqldumppath'] ) . $brace . ' --force --host=' . escapeshellarg( $backup['host'] ) . ' --user=' . escapeshellarg( DB_USER ) . ' --password=' . escapeshellarg( DB_PASSWORD ) . $backup['port'] . $backup['sock'] . $backup['charset'] . ' --add-drop-table --skip-lock-tables ' . DB_NAME . ' > ' . $brace . escapeshellcmd( $backup['filepath'] ) . $brace; } $error = execute_backup( $backup['command'] ); + if ( ! is_writable( $backup['path'] ) ) { $text = '

'.sprintf(__('Database Failed To Backup On \'%s\'. Backup Folder Not Writable.', 'wp-dbmanager'), $current_date).'

'; } elseif ( is_file( $backup['filepath'] ) && filesize( $backup['filepath'] ) === 0 ) { @@ -59,9 +62,14 @@ } elseif ( $error ) { $text = '

'.sprintf(__('Database Failed To Backup On \'%s\'.', 'wp-dbmanager'), $current_date).'

'; } else { - rename( $backup['filepath'], $backup['path'] . '/' . md5_file( $backup['filepath'] ) . '_-_' . $backup['filename'] ); + $new_filepath = $backup['path'] . '/' . md5_file( $backup['filepath'] ) . '_-_' . $backup['filename']; + rename( $backup['filepath'], $new_filepath ); + if (!empty($_POST['comment'])) { + file_put_contents("{$new_filepath}.txt",$_POST['comment']); + } $text = '

'.sprintf(__('Database Backed Up Successfully On \'%s\'.', 'wp-dbmanager'), $current_date).'

'; } + header("Location: $return_page&info=" . base64_encode($text)); break; } } @@ -73,18 +81,51 @@ ### MYSQL Base Dir $has_error = false; $disabled_function = false; + +### Detailed check status flags +$security_has_error = false; +$backup_has_error = false; +$phpfn_has_error = false; + +/** + * Generate a collapsible check group header button + * + * @param string $title Group title (already translated) + * @param bool $hasError Whether group has errors + * @return string HTML for button + * + */ +function dbmanager_check_button($title, $hasError = false) { + $status = $hasError ? _e('Some tests failed', 'wp-dbmanager') : __('All OK', 'wp-dbmanager'); + $class = $hasError ? 'dbmanager-err' : 'dbmanager-ok'; + $expanded = $hasError ? 'true' : 'false'; + + // Exactly match your original inline structure + return ''; +} ?> '.$text.''; } ?>

-

-

+

+ + + + +

+ +
@@ -245,7 +353,11 @@ -         +         + + + +    diff --git a/database-manage.php b/database-manage.php index ce31d2c..e4bf785 100644 --- a/database-manage.php +++ b/database-manage.php @@ -15,7 +15,7 @@ $backup['mysqlpath'] = $backup_options['mysqlpath']; $backup['path'] = $backup_options['path']; $backup['charset'] = ' --default-character-set="utf8mb4"'; - +$text = !empty($_GET['info']) ? stripslashes(base64_decode($_GET['info'])) : ""; ### Form Processing if( !empty( $_POST['do'] ) ) { @@ -91,6 +91,7 @@ $text .= '

' . sprintf( __( 'Unable To Delete Database Backup File On \'%s\'', 'wp-dbmanager' ), $file['formatted_date'] ) . '

'; } else { $text .= '

' . sprintf( __( 'Database Backup File On \'%s\' Deleted Successfully', 'wp-dbmanager' ), $file['formatted_date'] ) . '

'; + if (file_exists($backup['path'].'/'.$database_file . ".txt")) unlink($backup['path'].'/'.$database_file . ".txt"); } } else { $text = '

' . sprintf( __( 'Invalid Database Backup File On \'%s\'', 'wp-dbmanager' ), $file['formatted_date'] ) . '

'; @@ -109,6 +110,7 @@

+ @@ -139,6 +141,8 @@ $style = ' class="alternate"'; } $no++; + $checked = ($no==1) ? 'checked="checked" ' : ''; + $comment = file_exists($backup['path'].'/'. $database_file . ".txt") ? file_get_contents($backup['path'].'/'. $database_file . ".txt") : ""; $file = dbmanager_parse_file( $backup['path'] . '/'. $database_file ); echo ''; echo ''; @@ -146,8 +150,13 @@ echo ''; echo ''; echo ''; - echo ''; + echo ''; $totalsize += $file['size']; + if (!empty($comment)) { + echo ''; + echo ''; + } } } else { echo ''; @@ -159,10 +168,17 @@
' . number_format_i18n( $no ) . '' . $file['database'] . '' . $file['formatted_date'] . '' . $file['formatted_size'] . '
 '; + echo '' . __("Comment", 'wp-dbmanager') . ': ' . $comment . ' 
'.__('There Are No Database Backup Files Available.', 'wp-dbmanager').'
 
- + + + + +
+ +
  
   @@ -171,5 +187,4 @@
-
- + diff --git a/wp-dbmanager.php b/wp-dbmanager.php index 50ca52a..ec464b7 100644 --- a/wp-dbmanager.php +++ b/wp-dbmanager.php @@ -35,6 +35,20 @@ function dbmanager_textdomain() { load_plugin_textdomain( 'wp-dbmanager', false, dirname( plugin_basename( __FILE__ ) ) ); } +### Check for and activate optional stylesheet for the admin panel +function wp_dbmanager_admin_style($hook) { + // Only load on wp-dbmanager admin pages + if (strpos($hook, 'wp-dbmanager') === false) { + return; + } + + // Load optional custom stylesheet if available + $css_file = plugin_dir_path(__FILE__) . 'database-admin-css.css'; + if (file_exists($css_file)) { + wp_enqueue_style('wp_dbmanager_admin_css', plugins_url('database-admin-css.css', __FILE__) ); + } +} +add_action( 'admin_enqueue_scripts', 'wp_dbmanager_admin_style' ); ### Function: Database Manager Menu add_action('admin_menu', 'dbmanager_menu'); @@ -43,6 +57,7 @@ function dbmanager_menu() { add_menu_page(__('Database', 'wp-dbmanager'), __('Database', 'wp-dbmanager'), 'install_plugins', 'wp-dbmanager/database-manager.php', '', 'dashicons-archive'); } if (function_exists('add_submenu_page')) { + add_submenu_page('wp-dbmanager/database-manager.php', __('Database Info', 'wp-dbmanager'), __('Database Info', 'wp-dbmanager'), 'install_plugins', 'wp-dbmanager/database-manager.php'); add_submenu_page('wp-dbmanager/database-manager.php', __('Backup DB', 'wp-dbmanager'), __('Backup DB', 'wp-dbmanager'), 'install_plugins', 'wp-dbmanager/database-backup.php'); add_submenu_page('wp-dbmanager/database-manager.php', __('Manage Backup DB', 'wp-dbmanager'), __('Manage Backup DB', 'wp-dbmanager'), 'install_plugins', 'wp-dbmanager/database-manage.php'); add_submenu_page('wp-dbmanager/database-manager.php', __('Optimize DB', 'wp-dbmanager'), __('Optimize DB', 'wp-dbmanager'), 'install_plugins', 'wp-dbmanager/database-optimize.php'); @@ -109,6 +124,8 @@ function cron_dbmanager_backup() { execute_backup( $backup['command'] ); $new_filepath = $backup['path'] . '/' . md5_file( $backup['filepath'] ) . '_-_' . $backup['filename']; rename( $backup['filepath'], $new_filepath ); + $comment = "Cron backup at " . gmdate('Y-m-d H:i:s', $backup['date']); + file_put_contents("{$new_filepath}.txt",$comment); $backup_email = stripslashes( $backup_options['backup_email'] ); if ( ! empty( $backup_email ) ) { dbmanager_email_backup( $backup_email, $new_filepath ); @@ -350,8 +367,14 @@ function dbmanager_email_backup( $to, $backup_file_path ) { ) , $subject ); + + $comment = file_exists("{$backup_file_path}.txt") ? + __( 'Backup Comment:', 'wp-dbmanager' ) . ' ' . + file_get_contents("{$backup_file_path}.txt") . "\n" : ""; + $message = __( 'Website Name:', 'wp-dbmanager' ) . ' ' . wp_specialchars_decode( get_bloginfo( 'name' ), ENT_QUOTES ) . "\n" . - __( 'Website URL:', 'wp-dbmanager' ) . ' '. get_bloginfo( 'url' ) . "\n\n" . + __( 'Website URL:', 'wp-dbmanager' ) . ' '. get_bloginfo( 'url' ) . "\n" . + $comment . "\n" . __( 'Backup File Name:', 'wp-dbmanager' ) . ' ' . $file['name'] . "\n" . __( 'Backup File MD5 Checksum:', 'wp-dbmanager' ) . ' ' . $file['checksum'] . "\n" . __( 'Backup File Date:', 'wp-dbmanager' ) . ' ' . $file['formatted_date'] . "\n" .