Files
wpa-superstar-plugin/admin/settings/tabs/class-seoprostack-tab-hosting.php

692 lines
28 KiB
PHP

<?php
/**
* The Hosting tab for plugin settings.
*
* @package SEO_Pro_Stack
* @subpackage SEO_Pro_Stack/Admin/Settings/Tabs
*/
// If this file is called directly, abort.
if (!defined('ABSPATH')) {
exit;
}
/**
* The Hosting tab for plugin settings.
* Self-contained class with integrated data and functionality
*/
class SEOProStack_Tab_Hosting {
/**
* Tab identifier
*
* @var string
*/
private $tab_id = 'hosting';
/**
* Initialize the class.
* Register any hooks or actions here.
*/
/**
* Hosting providers data
*
* @var array
*/
private $hosting_providers;
/**
* Server information
*
* @var array
*/
private $server_info;
public function __construct() {
// Initialize the hosting providers data
$this->hosting_providers = $this->get_hosting_providers();
$this->server_info = $this->get_server_info();
}
/**
* Get the tab ID
*
* @return string The tab ID
*/
public function get_tab_id() {
return $this->tab_id;
}
/**
* Get the tab title
*
* @return string The tab title
*/
public function get_title() {
return __('Hosting', 'seoprostack');
}
/**
* Get server information
*
* @return array Server information
*/
private function get_server_info() {
global $wpdb;
$server_info = array();
// PHP Version
$server_info['php_version'] = array(
'label' => __('PHP Version', 'seoprostack'),
'value' => phpversion(),
'recommendation' => __('PHP 8.0 or higher recommended', 'seoprostack')
);
// MySQL Version
$server_info['mysql_version'] = array(
'label' => __('MySQL Version', 'seoprostack'),
'value' => $wpdb->db_version(),
'recommendation' => __('MySQL 8.0 or higher recommended', 'seoprostack')
);
// Server Software
$server_info['server_software'] = array(
'label' => __('Server Software', 'seoprostack'),
'value' => $_SERVER['SERVER_SOFTWARE'] ?? __('Unknown', 'seoprostack'),
'recommendation' => ''
);
// PHP Memory Limit
$memory_limit = ini_get('memory_limit');
$server_info['php_memory_limit'] = array(
'label' => __('PHP Memory Limit', 'seoprostack'),
'value' => $memory_limit,
'recommendation' => __('256M or higher recommended', 'seoprostack')
);
// Max Upload Size
$upload_max_filesize = ini_get('upload_max_filesize');
$server_info['upload_max_filesize'] = array(
'label' => __('Max Upload Size', 'seoprostack'),
'value' => $upload_max_filesize,
'recommendation' => __('64M or higher recommended', 'seoprostack')
);
return $server_info;
}
/**
* Get hosting providers
*
* @return array The hosting providers data
*/
private function get_hosting_providers() {
return array(
'kinsta' => array(
'name' => 'Kinsta',
'description' => 'Premium WordPress hosting with excellent performance, security, and customer support.',
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://kinsta.com/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://kinsta.com/plans/'
)
)
),
'wpengine' => array(
'name' => 'WP Engine',
'description' => 'Managed WordPress hosting provider with solid performance and security features.',
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://wpengine.com/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://wpengine.com/plans/'
)
)
),
'siteground' => array(
'name' => 'SiteGround',
'description' => 'Popular WordPress hosting with good performance and customer support.',
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.siteground.com/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://www.siteground.com/wordpress-hosting.htm'
)
)
),
'hostinger' => array(
'name' => 'Hostinger',
'description' => 'Affordable WordPress hosting with good performance and user-friendly management tools.',
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.hostinger.com/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://www.hostinger.com/wordpress-hosting'
)
)
),
'hetzner' => array(
'name' => 'Hetzner Cloud',
'description' => 'High-performance cloud servers with excellent price-to-performance ratio for self-managed WordPress hosting.',
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.hetzner.com/cloud/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://www.hetzner.com/cloud#pricing'
)
)
),
'simplehost' => array(
'name' => 'SimpleHost',
'description' => 'Streamlined WordPress hosting with a focus on simplicity and performance.',
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://simplehost.so/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://simplehost.so/#pricing'
)
)
),
'cloudflare' => array(
'name' => 'Cloudflare',
'description' => 'Global cloud platform that provides CDN, security, and performance optimization services.',
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.cloudflare.com/en-gb/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://www.cloudflare.com/en-gb/plans/'
)
)
),
'spaceship' => array(
'name' => 'Spaceship',
'description' => 'Modern hosting platform with advanced features for WordPress sites.',
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.spaceship.com/',
'primary' => true
)
)
),
'101domain' => array(
'name' => '101Domain',
'description' => 'Domain registration and management service with support for hundreds of TLDs.',
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.101domain.com/',
'primary' => true
)
)
),
'namecheap' => array(
'name' => 'Namecheap',
'description' => 'Domain registrar and web hosting provider with competitive pricing and good support.',
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.namecheap.com/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://www.namecheap.com/hosting/shared/'
)
)
),
'updownio' => array(
'name' => 'Updown.io',
'description' => 'Simple and affordable website monitoring service with uptime checks and performance metrics.',
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://updown.io/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://updown.io/pricing'
)
)
)
);
}
/**
* Get the tab description
*
* @return string The tab description
*/
public function get_description() {
return __('Details about your current hosting environment and recommendations for improvement.', 'seoprostack');
}
/**
* Get additional hosting providers for specialized cases
*
* @return array Array of additional hosting providers
*/
private function get_additional_hosting_providers() {
return array(
'closte' => array(
'name' => 'Closte',
'description' => 'Managed WordPress hosting with advanced performance optimization and auto-scaling.',
'features' => array(
'Auto-scaling architecture',
'Global CDN included',
'Advanced caching',
'Free SSL certificates'
),
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://closte.com/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://closte.com/pricing'
)
)
),
'cloudron' => array(
'name' => 'Cloudron',
'description' => 'Self-hosted platform that makes it easy to run web applications like WordPress on your server.',
'features' => array(
'One-click installation',
'Automatic updates',
'Built-in backups',
'SSL certificate management'
),
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.cloudron.io/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://www.cloudron.io/pricing.html'
)
)
),
'hostinger' => array(
'name' => 'Hostinger',
'description' => 'Affordable WordPress hosting with good performance and user-friendly management tools.',
'features' => array(
'Free domain name',
'Managed WordPress features',
'LiteSpeed cache',
'Weekly backups'
),
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.hostinger.com/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://www.hostinger.com/wordpress-hosting'
)
)
),
'hetzner' => array(
'name' => 'Hetzner Cloud',
'description' => 'High-performance cloud servers with excellent price-to-performance ratio for self-managed WordPress hosting.',
'features' => array(
'Scalable cloud instances',
'Per-minute billing',
'Snapshots and backups',
'Global data centers'
),
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.hetzner.com/cloud/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://www.hetzner.com/cloud#pricing'
)
)
),
'simplehost' => array(
'name' => 'SimpleHost',
'description' => 'Streamlined WordPress hosting with a focus on simplicity and performance.',
'features' => array(
'Simplified hosting dashboard',
'Pre-optimized WordPress',
'Automated backups',
'Email hosting included'
),
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://simplehost.so/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://simplehost.so/#pricing'
)
)
),
'cloudflare' => array(
'name' => 'Cloudflare',
'description' => 'Global cloud platform that provides CDN, security, and performance optimization services.',
'features' => array(
'Global CDN network',
'DDoS protection',
'Web application firewall',
'Performance optimization'
),
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.cloudflare.com/en-gb/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://www.cloudflare.com/en-gb/plans/'
)
)
),
'spaceship' => array(
'name' => 'Spaceship',
'description' => 'Modern hosting platform with advanced features for WordPress sites.',
'features' => array(
'Advanced WordPress tools',
'Optimized for speed',
'Developer-friendly features',
'Smart caching system'
),
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.spaceship.com/',
'primary' => true
)
)
),
'101domain' => array(
'name' => '101Domain',
'description' => 'Domain registration and management service with support for hundreds of TLDs.',
'features' => array(
'Extensive TLD selection',
'Domain privacy protection',
'Expert domain support',
'Bulk domain management'
),
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.101domain.com/',
'primary' => true
)
)
),
'namecheap' => array(
'name' => 'Namecheap',
'description' => 'Domain registrar and web hosting provider with competitive pricing and good support.',
'features' => array(
'Free WhoisGuard protection',
'Competitive domain pricing',
'Reliable hosting services',
'Excellent support'
),
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://www.namecheap.com/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://www.namecheap.com/hosting/shared/'
)
)
),
'updownio' => array(
'name' => 'Updown.io',
'description' => 'Simple and affordable website monitoring service with uptime checks and performance metrics.',
'features' => array(
'Real-time monitoring',
'Performance metrics',
'Notification alerts',
'Detailed reports'
),
'button_group' => array(
array(
'text' => 'Home Page',
'url' => 'https://updown.io/',
'primary' => true
),
array(
'text' => 'Pricing',
'url' => 'https://updown.io/pricing'
)
)
)
);
}
/**
* Render the tab content.
*/
public function render() {
// Use the self-contained data
$server_info = $this->server_info;
$hosting_providers = $this->hosting_providers;
echo '<div class="tab-content" id="' . esc_attr($this->tab_id) . '">;
if (function_exists('wp_seoprostack_get_hosting_providers') && empty($GLOBALS['_wp_seoprostack_hosting_loaded'])) {
// Optional: merge with any providers from the external function to ensure none are lost
$external_providers = wp_seoprostack_get_hosting_providers();
$hosting_providers = array_merge($external_providers, $hosting_providers);
$GLOBALS['_wp_seoprostack_hosting_loaded'] = true;
}
?>
<div class="seoprostack-settings-content tab-content" id="<?php echo esc_attr($this->get_tab_id()); ?>">
<div class="seoprostack-setting-section">
<h2><?php esc_html_e('Hosting Information', 'seoprostack'); ?></h2>
<p class="description"><?php echo esc_html($this->get_description()); ?></p>
<div class="seoprostack-server-info">
<h3><?php esc_html_e('Server Environment', 'seoprostack'); ?></h3>
<table class="seoprostack-info-table">
<tr>
<th><?php esc_html_e('PHP Version', 'seoprostack'); ?></th>
<td>
<?php echo esc_html($server_info['php_version']); ?>
<?php echo $this->get_status_icon($server_info['php_status']); ?>
</td>
<td class="seoprostack-info-note">
<?php echo esc_html($server_info['php_note']); ?>
</td>
</tr>
<tr>
<th><?php esc_html_e('MySQL Version', 'seoprostack'); ?></th>
<td>
<?php echo esc_html($server_info['mysql_version']); ?>
<?php echo $this->get_status_icon($server_info['mysql_status']); ?>
</td>
<td class="seoprostack-info-note">
<?php echo esc_html($server_info['mysql_note']); ?>
</td>
</tr>
<tr>
<th><?php esc_html_e('WordPress Version', 'seoprostack'); ?></th>
<td>
<?php echo esc_html($server_info['wp_version']); ?>
<?php echo $this->get_status_icon($server_info['wp_status']); ?>
</td>
<td class="seoprostack-info-note">
<?php echo esc_html($server_info['wp_note']); ?>
</td>
</tr>
<tr>
<th><?php esc_html_e('Memory Limit', 'seoprostack'); ?></th>
<td>
<?php echo esc_html($server_info['memory_limit']); ?>
<?php echo $this->get_status_icon($server_info['memory_status']); ?>
</td>
<td class="seoprostack-info-note">
<?php echo esc_html($server_info['memory_note']); ?>
</td>
</tr>
<tr>
<th><?php esc_html_e('Max Execution Time', 'seoprostack'); ?></th>
<td>
<?php echo esc_html($server_info['max_execution_time']); ?> seconds
<?php echo $this->get_status_icon($server_info['execution_status']); ?>
</td>
<td class="seoprostack-info-note">
<?php echo esc_html($server_info['execution_note']); ?>
</td>
</tr>
</table>
</div>
<div class="seoprostack-hosting-recommendations">
<h3><?php esc_html_e('Recommended Hosting Providers', 'seoprostack'); ?></h3>
<p><?php esc_html_e('These hosting providers offer excellent performance for WordPress sites and are recommended for optimal SEO results.', 'seoprostack'); ?></p>
<div class="seoprostack-hosting-grid">
<?php foreach ($hosting_providers as $key => $provider) : ?>
<div class="seoprostack-hosting-card">
<div class="seoprostack-hosting-card-header">
<h4><?php echo esc_html($provider['name']); ?></h4>
</div>
<div class="seoprostack-hosting-card-content">
<p><?php echo esc_html($provider['description']); ?></p>
<?php if (!empty($provider['features'])) : ?>
<ul class="seoprostack-hosting-features">
<?php foreach ($provider['features'] as $feature) : ?>
<li><?php echo esc_html($feature); ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</div>
<div class="seoprostack-hosting-card-footer">
<?php foreach ($provider['button_group'] as $button) : ?>
<a href="<?php echo esc_url($button['url']); ?>" class="seoprostack-button<?php echo ($button['primary']) ? ' primary' : ''; ?>" target="_blank">
<?php echo esc_html($button['text']); ?>
</a>
<?php endforeach; ?>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
<?php
}
/**
* Get server information.
*
* @return array Server information.
*/
private function get_server_info() {
global $wpdb;
// PHP version
$php_version = phpversion();
$php_status = version_compare($php_version, '7.4', '>=') ? 'good' : (version_compare($php_version, '7.0', '>=') ? 'warning' : 'bad');
$php_note = version_compare($php_version, '7.4', '>=') ? __('Your PHP version is up to date.', 'seoprostack') : __('We recommend PHP 7.4 or higher for optimal performance and security.', 'seoprostack');
// MySQL version
$mysql_version = $wpdb->db_version();
$mysql_status = version_compare($mysql_version, '5.6', '>=') ? 'good' : 'warning';
$mysql_note = version_compare($mysql_version, '5.6', '>=') ? __('Your MySQL version is sufficient.', 'seoprostack') : __('We recommend MySQL 5.6 or higher for better performance.', 'seoprostack');
// WordPress version
$wp_version = get_bloginfo('version');
$wp_status = version_compare($wp_version, '5.8', '>=') ? 'good' : (version_compare($wp_version, '5.5', '>=') ? 'warning' : 'bad');
$wp_note = version_compare($wp_version, '5.8', '>=') ? __('Your WordPress version is up to date.', 'seoprostack') : __('We recommend updating to the latest version of WordPress.', 'seoprostack');
// Memory limit
$memory_limit = ini_get('memory_limit');
$memory_limit_bytes = wp_convert_hr_to_bytes($memory_limit);
$memory_status = $memory_limit_bytes >= 256 * 1024 * 1024 ? 'good' : ($memory_limit_bytes >= 128 * 1024 * 1024 ? 'warning' : 'bad');
$memory_note = $memory_limit_bytes >= 256 * 1024 * 1024 ? __('Your memory limit is sufficient.', 'seoprostack') : __('We recommend a memory limit of at least 256MB.', 'seoprostack');
// Max execution time
$max_execution_time = ini_get('max_execution_time');
$execution_status = $max_execution_time >= 180 || $max_execution_time == 0 ? 'good' : ($max_execution_time >= 60 ? 'warning' : 'bad');
$execution_note = $max_execution_time >= 180 || $max_execution_time == 0 ? __('Your max execution time is sufficient.', 'seoprostack') : __('We recommend a max execution time of at least 180 seconds.', 'seoprostack');
return array(
'php_version' => $php_version,
'php_status' => $php_status,
'php_note' => $php_note,
'mysql_version' => $mysql_version,
'mysql_status' => $mysql_status,
'mysql_note' => $mysql_note,
'wp_version' => $wp_version,
'wp_status' => $wp_status,
'wp_note' => $wp_note,
'memory_limit' => $memory_limit,
'memory_status' => $memory_status,
'memory_note' => $memory_note,
'max_execution_time' => $max_execution_time,
'execution_status' => $execution_status,
'execution_note' => $execution_note
);
}
/**
* Get a status icon based on the status.
*
* @param string $status Status (good, warning, or bad).
* @return string Status icon HTML.
*/
private function get_status_icon($status) {
switch ($status) {
case 'good':
return '<span class="seoprostack-status-icon good dashicons dashicons-yes-alt"></span>';
case 'warning':
return '<span class="seoprostack-status-icon warning dashicons dashicons-warning"></span>';
case 'bad':
return '<span class="seoprostack-status-icon bad dashicons dashicons-dismiss"></span>';
default:
return '';
}
}
}