wp_back/wp-content/plugins/debloat/inc/admin/admin.php
2024-05-20 15:37:46 +03:00

353 lines
10 KiB
PHP

<?php
namespace Sphere\Debloat;
use Sphere\Debloat\Admin\Cache;
use Sphere\Debloat\Admin\OptionsData;
/**
* Admin initialization.
*
* @author asadkn
* @since 1.0.0
*/
class Admin
{
/**
* @var Sphere\Debloat\Admin\Cache
*/
protected $cache;
/**
* Setup hooks
*/
public function init()
{
$this->cache = new Cache;
$this->cache->init();
add_action('cmb2_admin_init', [$this, 'setup_options']);
// Enqueue at a lower priority to be after CMB2.
add_action('admin_enqueue_scripts', [$this, 'register_assets'], 99);
// Page to delete cache.
add_action('admin_menu', function() {
add_submenu_page(
'',
'Delete Cache',
'Delete Cache',
'manage_options',
'debloat-delete-cache',
[$this, 'delete_cache']
);
});
// Empty cache on save.
add_action('cmb2_save_options-page_fields', [$this, '_delete_cache']);
/**
* Fix: CMB2 doesn't save unchecked making default => true impossible.
*/
add_filter('cmb2_sanitize_checkbox', function($override, $value) {
return is_null($value) ? '0' : $value;
}, 20, 2);
// Custom CMB2 field for manual callback
add_action('cmb2_render_manual', function($field) {
// Add attributes to an empty span for cmb2-conditional
if (!empty($field->args['attributes'])) {
printf('<meta name="%s" %s />',
$field->args('id'),
\CMB2_Utils::concat_attrs($field->args('attributes'))
);
}
if (!empty($field->args['render_html']) && is_callable($field->args['render_html'])) {
call_user_func($field->args['render_html'], $field);
}
if (!empty($field->args['desc'])) {
echo '<p class="cmb2-metabox-description">' . esc_html($field->args['desc']) . '</p>';
}
});
}
/**
* Register admin assets
*/
public function register_assets()
{
// Specific assets for option pages only
if (!empty($_GET['page']) && strpos($_GET['page'], 'debloat_options') !== false) {
wp_enqueue_script(
'debloat-cmb2-conditionals',
Plugin::get_instance()->dir_url . 'js/admin/cmb2-conditionals.js',
['jquery'],
Plugin::VERSION
);
wp_enqueue_script(
'debloat-options',
Plugin::get_instance()->dir_url . 'js/admin/options.js',
['jquery', 'debloat-cmb2-conditionals'],
Plugin::VERSION
);
wp_enqueue_style(
'debloat-admin-cmb2',
Plugin::get_instance()->dir_url . 'css/admin/cmb2.css',
['cmb2-styles'],
Plugin::VERSION
);
}
}
/**
* Delete Cache page.
*/
public function delete_cache()
{
check_admin_referer('debloat_delete_cache');
$this->_delete_cache();
echo '
<h2>Clearing Cache</h2>
<p>Caches cleared. You may also have to clear your cache plugins.</p>
<a href="' . esc_url(admin_url('admin.php?page=debloat_options')) . '">Back to Options</a>';
}
/**
* Callback: Delete the cache.
*
* @access private
*/
public function _delete_cache()
{
$this->cache->empty();
/**
* Hook after deleting cache.
*/
do_action('debloat/after_delete_cache');
}
/**
* Setup admin options with CMB2
*/
public function setup_options()
{
// Configure admin options
$options = new_cmb2_box([
'id' => 'debloat_options',
'title' => esc_html__('Debloat Plugin Settings', 'debloat'),
'object_types' => ['options-page'],
'option_key' => 'debloat_options',
'parent_slug' => 'options-general.php',
'menu_title' => esc_html__('Debloat: Optimize', 'debloat'),
'tab_group' => 'debloat_options',
'tab_title' => esc_html__('Optimize CSS', 'debloat'),
'classes' => 'sphere-cmb2-wrap',
'display_cb' => [$this, 'render_options_page'],
]);
$this->add_options(
OptionsData::get_css(),
$options
);
// Configure admin options
$js_options = new_cmb2_box([
'id' => 'debloat_options_js',
'title' => esc_html__('Optimize JS', 'debloat'),
'object_types' => ['options-page'],
'option_key' => 'debloat_options_js',
'parent_slug' => 'debloat_options',
'menu_title' => esc_html__('Optimize JS', 'debloat'),
'tab_group' => 'debloat_options',
'tab_title' => esc_html__('Optimize JS', 'debloat'),
'classes' => 'sphere-cmb2-wrap',
'display_cb' => [$this, 'render_options_page'],
]);
$this->add_options(
OptionsData::get_js(),
$js_options
);
// Configure admin options
$general_options = new_cmb2_box([
'id' => 'debloat_options_general',
'title' => esc_html__('General Settings', 'debloat'),
'object_types' => ['options-page'],
'option_key' => 'debloat_options_general',
'parent_slug' => 'debloat_options',
'menu_title' => esc_html__('General Settings', 'debloat'),
'tab_group' => 'debloat_options',
'tab_title' => esc_html__('General Settings', 'debloat'),
'display_cb' => [$this, 'render_options_page'],
'classes' => 'sphere-cmb2-wrap'
]);
$this->add_options(
OptionsData::get_general(),
$general_options
);
do_action('debloat/admin/after_options', $options);
}
/**
* Add options to CMB2 array.
*
* @param array $options
* @param \CMB2 $object
* @return void
*/
protected function add_options($options, $object)
{
return array_map(
function($option) use ($object) {
if (isset($option['attributes']['data-conditional-id'])) {
$condition = &$option['attributes']['data-conditional-id'];
if (is_array($condition)) {
$condition = json_encode($condition);
}
}
$field_id = $object->add_field($option);
if ($option['type'] === 'group') {
$this->add_option_group($option, $field_id, $object);
}
},
$options
);
}
protected function add_option_group($option, $group_id, $object)
{
if ($option['id'] === 'allow_conditionals_data') {
$object->add_group_field($group_id, [
'id' => 'type',
'name' => esc_html__('Condition Type', 'debloat'),
'type' => 'radio',
'default' => 'class',
'options' => [
'class' => esc_html__('Class - If a class (in "condition match") exists in HTML, keep classes matching "selector match".', 'debloat'),
'prefix' => esc_html__('Prefix - Condition matches the first class and keeps all the used child classes. Example: .s-dark will keep .s-dark .site-header.', 'debloat'),
],
]);
$object->add_group_field($group_id, [
'id' => 'match',
'name' => esc_html__('Condition Match', 'debloat'),
'desc' => esc_html__('Required. Usually a single class, example:', 'debloat') . '<code>.my-class</code>',
'type' => 'text',
'default' => '',
]);
$object->add_group_field($group_id, [
'id' => 'search',
'name' => esc_html__('Selectors Match', 'debloat'),
'desc' => esc_html__('Enter one per line. See example matchings in "Always Keep Selectors" above.', 'debloat'),
'type' => 'textarea_small',
'default' => '',
'attributes' => [
'data-conditional-id' => json_encode([$group_id, 'type']),
'data-conditional-value' => 'class'
]
]);
}
}
public function render_options_page($hookup)
{
?>
<div class="cmb2-options-page debloat-options option-<?php echo esc_attr( sanitize_html_class( $hookup->option_key ) ); ?>">
<div class="wrap">
<?php if ( $hookup->cmb->prop( 'title' ) ) : ?>
<h2><?php echo wp_kses_post( $hookup->cmb->prop( 'title' ) ); ?></h2>
<?php endif; ?>
</div>
<div class="wrap"><?php $hookup->options_page_tab_nav_output(); ?></div>
<div class="debloat-inner-wrap">
<form class="cmb-form debloat-options-form" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="POST" id="<?php echo esc_attr($hookup->cmb->cmb_id); ?>" enctype="multipart/form-data" encoding="multipart/form-data">
<input type="hidden" name="action" value="<?php echo esc_attr( $hookup->option_key ); ?>">
<div class="sphere-cmb2-wrap debloat-intro-info">
<div class="cmb2-wrap cmb2-metabox">
<div class="cmb-row">
<h3>Important: Debloat Plugin</h3>
<p>
This plugin is for advanced users. The features "Remove Unused CSS" and "Delay JS" are especially for advanced users only.
</p>
<ol>
<li>Use a cache plugin like W3 Total Cache, WP Super Cache, etc. <strong>Required</strong> for Remove Unused CSS feature.</li>
<li>Do <strong>NOT</strong> enable minification, CSS, or JS optimization via another plugin.</li>
<li>If your theme doesn't have it built-in, use a Lazyload plugin for images.</li>
</ol>
</div>
</div>
</div>
<?php $hookup->options_page_metabox(); ?>
<?php submit_button( esc_attr( $hookup->cmb->prop( 'save_button' ) ), 'primary', 'submit-cmb' ); ?>
</form>
<div class="debloat-sidebar">
<?php $this->cache_info(); ?>
</div>
</div>
</div>
<?php
}
public function cache_info()
{
$js_cache = Plugin::file_cache()->get_stats('js');
$css_cache = Plugin::file_cache()->get_stats('css');
// Number of css sheets in cache.
$css_sheets = count($this->cache->get_transients());
?>
<div class="sphere-cmb2-wrap debloat-cache-info">
<div class="cmb2-wrap cmb2-metabox">
<div class="cmb-row cmb-type-title">
<div class="cmb-td">
<h3 class="cmb2-metabox-title">
<?php esc_html_e('Cache Stats', 'debloat'); ?>
</h3>
</div>
</div>
<div class="cmb-row">
<?php if (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG): ?>
<p><strong>Minification Disabled</strong>: SCRIPT_DEBUG is enabled (likely in wp-config.php).</p>
<?php endif; ?>
<div class="cache-stats">
<p><?php printf(esc_html__('Minified CSS files: %d', 'debloat'), $css_cache); ?></p>
<p><?php printf(esc_html__('Minified JS files: %d', 'debloat'), $js_cache); ?></p>
<p><?php printf(esc_html__('Processed CSS Sheets: %d', 'debloat'), $css_sheets); ?></p>
</div>
<a href="<?php echo wp_nonce_url(admin_url('admin.php?page=debloat-delete-cache'), 'debloat_delete_cache'); ?>"
class="button button-secondary" style="margin-top: 10px;">
<?php echo esc_html('Empty All Cache', 'debloat'); ?>
</a>
</p>
</div>
</div>
</div>
<?php
}
}