MAJOR REFACTORING - 830 lines:
WordPress cron → system cron conversion tool. Converts wp-cron.php to real
system cron jobs with intelligent load distribution. Most complex refactoring
in the entire multi-panel project due to extensive WordPress discovery logic.
KEY CHANGES:
1. WordPress Discovery (3 locations - lines 166-181, 469-484, 844-859):
- Multi-panel wp-config.php finding
- cPanel: /home/*/public_html/wp-config.php
- InterWorx: /home/*/*/html/wp-config.php
- Plesk: /var/www/vhosts/*/httpdocs/wp-config.php
- Standalone: /var/www/html/wp-config.php
2. User/Domain Extraction (lines 193-219):
- Added multi-panel path parsing in Scanner (option 1)
- cPanel: Extract user from /home/$user, lookup domain from userdata
- InterWorx: Extract both user and domain from path structure
- Plesk: Extract domain from path, lookup user via plesk bin
- Standalone: Defaults to www-data/localhost
3. Domain→User→Path Lookup (lines 251-313):
- Complete rewrite for "Disable wp-cron for specific domain" (option 2)
- cPanel: Dual-method userdata search (main_domain + servername)
- InterWorx: V host config → SuexecUserGroup → /home/$user/$domain/html
- Plesk: Direct path /var/www/vhosts/$domain/httpdocs
- Most complex section - handles all edge cases
4. Helper Function (lines 48-73):
- Created extract_user_from_path() for multi-panel user extraction
- Used in 5 locations throughout script
- Handles cPanel/InterWorx (field 3) vs Plesk (domain→user lookup)
- Graceful fallbacks for standalone (www-data)
5. Cron Job Management:
- All cron operations now use extracted user from helper function
- Works with user-specific crontabs on all panels
- Staggered timing still works across all panels
REPLACED PATTERNS:
- find /home/*/public_html → case statement (3 occurrences)
- /var/cpanel/userdata lookups → multi-panel domain→user (2 major sections)
- user=$(echo "$site_path" | cut -d'/' -f3) → extract_user_from_path() (5 occurrences)
IMPACT:
- WordPress cron management now works on cPanel, InterWorx, Plesk, standalone
- Properly discovers WordPress across all docroot patterns
- Correctly maps domains→users→paths on all panels
- Most complex multi-panel refactoring complete!
COMPLIANCE: Class C ✅
- ✅ Uses system-detect.sh (SYS_CONTROL_PANEL)
- ✅ Multi-panel case statements for all discovery
- ✅ Helper function for user extraction
- ✅ No hardcoded paths outside panel-specific cases
- ✅ Syntax verified with bash -n
REFACTORING COMPLETE: 38/38 modules = 100%! 🎉🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The domain lookup was failing because it only searched for 'servername:' in /var/cpanel/userdata/*/main files, but cPanel stores domain information differently:
- main files use 'main_domain: domain.com' (YAML format)
- domain-specific files use 'servername: domain.com' (YAML format)
Changes:
• Added two-step domain lookup process
• Method 1: Check main_domain in /var/cpanel/userdata/*/main files
• Method 2: Fallback to search all domain files for servername
• Skip cache files (.cache, cache, cache.json) during search
• Applied fix to all three domain lookup locations (options 2, 5, 6)
This fixes the "WordPress installation not found for domain" error that occurred when domains weren't configured as main_domain.
Tested with pickledperil.com - lookup now works correctly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Changes:
- Modified disable_wpcron_in_config() to place DISABLE_WP_CRON before "stop editing" comment
- This follows WordPress convention for custom constants
- Removes any existing DISABLE_WP_CRON lines first (clean placement)
- Falls back to after <?php if "stop editing" not found
Placement Logic:
1. Remove any existing DISABLE_WP_CRON (anywhere in file)
2. Add before "/* That's all, stop editing! */" comment (line ~93)
3. Fallback: Add after <?php if no "stop editing" found
Example Placement:
```
if ( ! defined( 'WP_DEBUG' ) ) {
define( 'WP_DEBUG', false );
}
define('DISABLE_WP_CRON', true); ← Added here
/* That's all, stop editing! Happy publishing. */
```
Benefits:
- Follows WordPress conventions
- Placed with other custom constants
- Clean, predictable location
- Easy to find for manual edits
🤖 Generated with Claude Code
https://claude.com/claude-code
Co-Authored-By: Claude <noreply@anthropic.com>
Changes:
- Added "0) Cancel" option to all menu prompts
- Added "(or 0 to cancel)" to all text input prompts
- Ensures users can back out of any operation at any time
- Scripts affected:
- website-error-analyzer.sh (scope selection, time range)
- 500-error-tracker.sh (time range selection)
- wordpress-cron-manager.sh (all domain/user input prompts, status checks)
User Experience Improvements:
- No more being trapped in prompts
- Clear cancel instructions on every input
- Consistent "Operation cancelled" messaging
- Proper exit codes (0 for user cancellation)
Tested:
✓ website-error-analyzer.sh - cancel on scope selection
✓ 500-error-tracker.sh - cancel on time selection
✓ wordpress-cron-manager.sh - cancel on domain/user input
✓ All cancellations return cleanly to menu
🤖 Generated with Claude Code
https://claude.com/claude-code
Co-Authored-By: Claude <noreply@anthropic.com>
Changes:
- Created modules/website/wordpress/ subdirectory for CMS-specific tools
- Moved wordpress-cron-manager.sh to new subdirectory
- Created wordpress-menu.sh submenu for WordPress tools
- Updated launcher.sh Website Management menu:
- Simplified to show general tools and CMS submenu options
- WordPress Management is now a submenu (option 3)
- Prepared structure for Joomla/Drupal/other CMS support
- Fixed script paths in wordpress-cron-manager.sh for new location
- Tested complete navigation: Main → Website → WordPress → Cron Manager
Menu Structure Now:
Website Management
├── Website Error Analyzer
├── 500 Error Tracker
└── WordPress Management (submenu)
└── WordPress Cron Manager
└── (All cron management options working)
🤖 Generated with Claude Code
https://claude.com/claude-code
Co-Authored-By: Claude <noreply@anthropic.com>