tweaks_options = $tweaks_options; $this->bloat_options = $bloat_options; } /** * Add settings link to plugins page * * @param array $links Plugin links * @return array */ public function add_settings_link($links) { $settings_link = '' . __('Settings', 'abovewp-tweaks-optimizer') . ''; array_unshift($links, $settings_link); return $links; } /** * Register admin menu */ public function register_admin_menu() { add_submenu_page( 'abovewp', __('Tweaks Optimizer', 'abovewp-tweaks-optimizer'), __('Tweaks Optimizer', 'abovewp-tweaks-optimizer'), 'manage_options', 'abovewp-tweaks-optimizer', array($this, 'display_settings_page') ); // Add body class for CSS styling add_filter('admin_body_class', array($this, 'add_admin_body_class')); } /** * Add body class for styling * * @param string $classes Admin body classes * @return string */ public function add_admin_body_class($classes) { $screen = get_current_screen(); // Add classes for all AboveWP pages if (strpos($screen->id, 'abovewp') !== false) { // General class for all AboveWP pages $classes .= ' abovewp-admin-page-wrapper'; // Specific page classes if (strpos($screen->id, 'abovewp-tweaks-optimizer') !== false) { $classes .= ' abovewp_page_abovewp-tweaks-optimizer'; } else if ($screen->id === 'toplevel_page_abovewp') { $classes .= ' toplevel_page_abovewp'; } } return $classes; } /** * Register plugin settings */ public function register_settings() { // Tweaks settings register_setting( 'abovewp_tweaks_options_group', 'abovewp_tweaks_options', array($this, 'sanitize_tweaks_options') ); // Bloat removal settings register_setting( 'abovewp_bloat_options_group', 'abovewp_bloat_options', array($this, 'sanitize_bloat_options') ); // WooCommerce settings - only register if WooCommerce is active if ($this->is_woocommerce_active()) { register_setting( 'abovewp_woocommerce_options_group', 'abovewp_woocommerce_options', array($this, 'sanitize_woocommerce_options') ); } // Tweaks section add_settings_section( 'abovewp_tweaks_section', __('WordPress Functionality Tweaks', 'abovewp-tweaks-optimizer'), array($this, 'tweaks_section_callback'), 'abovewp-tweaks-optimizer-tweaks' ); // Add tweaks fields add_settings_field( 'limit_post_revisions', __('Post Revisions', 'abovewp-tweaks-optimizer'), array($this, 'number_field_callback'), 'abovewp-tweaks-optimizer-tweaks', 'abovewp_tweaks_section', array( 'name' => 'limit_post_revisions', 'option_name' => 'abovewp_tweaks_options', 'description' => __('Number of post revisions to keep (0 to disable completely, -1 for unlimited).', 'abovewp-tweaks-optimizer'), 'default' => '-1', 'min' => -1, 'max' => 100 ) ); add_settings_field( 'autosave_interval', __('Autosave Interval', 'abovewp-tweaks-optimizer'), array($this, 'number_field_callback'), 'abovewp-tweaks-optimizer-tweaks', 'abovewp_tweaks_section', array( 'name' => 'autosave_interval', 'option_name' => 'abovewp_tweaks_options', 'description' => __('Time between automatic saves in seconds (Default: 60, 0 to disable).', 'abovewp-tweaks-optimizer'), 'default' => '60', 'min' => 0, 'max' => 300 ) ); add_settings_field( 'admin_heartbeat', __('Admin Heartbeat', 'abovewp-tweaks-optimizer'), array($this, 'select_field_callback'), 'abovewp-tweaks-optimizer-tweaks', 'abovewp_tweaks_section', array( 'name' => 'admin_heartbeat', 'option_name' => 'abovewp_tweaks_options', 'label' => __('WordPress Admin Heartbeat API', 'abovewp-tweaks-optimizer'), 'description' => __('The Heartbeat API allows for regular communication between the browser and server. Can heavily impact admin performance.', 'abovewp-tweaks-optimizer'), 'default' => 'enable', 'options' => array( 'enable' => __('Enable (Default)', 'abovewp-tweaks-optimizer'), 'disable_admin' => __('Disable on Dashboard', 'abovewp-tweaks-optimizer'), 'disable_editor' => __('Keep only in Post Editor', 'abovewp-tweaks-optimizer'), 'disable_everywhere' => __('Disable Completely', 'abovewp-tweaks-optimizer') ) ) ); add_settings_field( 'heartbeat_frequency', __('Heartbeat Frequency', 'abovewp-tweaks-optimizer'), array($this, 'select_field_callback'), 'abovewp-tweaks-optimizer-tweaks', 'abovewp_tweaks_section', array( 'name' => 'heartbeat_frequency', 'option_name' => 'abovewp_tweaks_options', 'label' => __('Admin Heartbeat Frequency', 'abovewp-tweaks-optimizer'), 'description' => __('Adjust the frequency of WordPress admin heartbeat. Default is 15 seconds.', 'abovewp-tweaks-optimizer'), 'default' => '15', 'options' => array( '15' => __('15 seconds (Default)', 'abovewp-tweaks-optimizer'), '30' => __('30 seconds', 'abovewp-tweaks-optimizer'), '60' => __('60 seconds', 'abovewp-tweaks-optimizer'), '120' => __('120 seconds', 'abovewp-tweaks-optimizer') ) ) ); add_settings_field( 'disable_wp_cron', __('WordPress Cron', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-tweaks', 'abovewp_tweaks_section', array( 'name' => 'disable_wp_cron', 'option_name' => 'abovewp_tweaks_options', 'label' => __('Disable WordPress Cron', 'abovewp-tweaks-optimizer'), 'description' => __('Disable default WordPress cron and use server cron instead for better performance and reliability.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'admin_cleanup', __('Admin UI Cleanup', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-tweaks', 'abovewp_tweaks_section', array( 'name' => 'admin_cleanup', 'option_name' => 'abovewp_tweaks_options', 'label' => __('Clean Up Admin Interface', 'abovewp-tweaks-optimizer'), 'description' => __('Remove unnecessary widgets and metaboxes from the WordPress admin dashboard.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_admin_notices', __('Admin Notices', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-tweaks', 'abovewp_tweaks_section', array( 'name' => 'disable_admin_notices', 'option_name' => 'abovewp_tweaks_options', 'label' => __('Disable Non-Essential Admin Notices', 'abovewp-tweaks-optimizer'), 'description' => __('Hide non-essential admin notices to clean up the admin interface. Critical notices will still be shown.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'limit_login_attempts', __('Login Security', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-tweaks', 'abovewp_tweaks_section', array( 'name' => 'limit_login_attempts', 'option_name' => 'abovewp_tweaks_options', 'label' => __('Limit Login Attempts', 'abovewp-tweaks-optimizer'), 'description' => __('Improve security by limiting the number of login attempts to protect against brute force attacks.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'login_attempts_limit', __('Login Attempts Limit', 'abovewp-tweaks-optimizer'), array($this, 'number_field_callback'), 'abovewp-tweaks-optimizer-tweaks', 'abovewp_tweaks_section', array( 'name' => 'login_attempts_limit', 'option_name' => 'abovewp_tweaks_options', 'description' => __('Number of failed login attempts before lockout.', 'abovewp-tweaks-optimizer'), 'default' => '5', 'min' => 1, 'max' => 20 ) ); add_settings_field( 'login_lockout_time', __('Login Lockout Time', 'abovewp-tweaks-optimizer'), array($this, 'number_field_callback'), 'abovewp-tweaks-optimizer-tweaks', 'abovewp_tweaks_section', array( 'name' => 'login_lockout_time', 'option_name' => 'abovewp_tweaks_options', 'description' => __('Lockout time in minutes after exceeding login attempts limit.', 'abovewp-tweaks-optimizer'), 'default' => '60', 'min' => 5, 'max' => 1440 ) ); add_settings_field( 'enable_media_trash', __('Media Trash', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-tweaks', 'abovewp_tweaks_section', array( 'name' => 'enable_media_trash', 'option_name' => 'abovewp_tweaks_options', 'label' => __('Enable Media Trash', 'abovewp-tweaks-optimizer'), 'description' => __('Enable WordPress media trash functionality, allowing you to recover deleted media instead of permanently deleting them. This will automatically add MEDIA_TRASH constant to your wp-config.php file.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => false ) ); // Bloat section add_settings_section( 'abovewp_bloat_section', __('WordPress Bloat Removal', 'abovewp-tweaks-optimizer'), array($this, 'bloat_section_callback'), 'abovewp-tweaks-optimizer-bloat' ); // Add bloat fields add_settings_field( 'disable_gutenberg', __('Gutenberg Editor', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_gutenberg', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable Gutenberg Editor', 'abovewp-tweaks-optimizer'), 'description' => __('Use the classic editor instead of Gutenberg.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_comments', __('Comments', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_comments', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable Comments', 'abovewp-tweaks-optimizer'), 'description' => __('Completely disable the WordPress commenting system site-wide.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_embeds', __('WordPress Embeds', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_embeds', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable WordPress Embeds', 'abovewp-tweaks-optimizer'), 'description' => __('Removes the ability to embed external content directly into posts.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_rest_api', __('REST API', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_rest_api', 'option_name' => 'abovewp_bloat_options', 'label' => __('Restrict REST API to logged-in users', 'abovewp-tweaks-optimizer'), 'description' => __('Only allow logged-in users to access the WordPress REST API.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_feed_links', __('Feed Links', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_feed_links', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable Feed Links', 'abovewp-tweaks-optimizer'), 'description' => __('Remove RSS feed links from the website.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_all_feeds', __('All RSS/Atom Feeds', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_all_feeds', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable All RSS and Atom Feeds', 'abovewp-tweaks-optimizer'), 'description' => __('Completely disable and redirect all RSS and Atom feeds to the homepage.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_author_archives', __('Author Archives', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_author_archives', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable Author Archive Pages', 'abovewp-tweaks-optimizer'), 'description' => __('Disable author archives and redirect them to the homepage for improved security.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_dashicons', __('Dashicons', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_dashicons', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable Dashicons on Front-end', 'abovewp-tweaks-optimizer'), 'description' => __('Remove WordPress Dashicons from the front-end for non-logged in users.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_shortlinks', __('Shortlinks', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_shortlinks', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable WordPress Shortlinks', 'abovewp-tweaks-optimizer'), 'description' => __('Removes shortlink metadata tags from your site head section.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_wlwmanifest', __('WLW Manifest', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_wlwmanifest', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable WLW Manifest', 'abovewp-tweaks-optimizer'), 'description' => __('Removes Windows Live Writer manifest link from your site head.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_rsd', __('RSD Link', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_rsd', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable RSD Link', 'abovewp-tweaks-optimizer'), 'description' => __('Removes RSD (Really Simple Discovery) link in the header used by some external editors.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_wp_version', __('WordPress Version', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_wp_version', 'option_name' => 'abovewp_bloat_options', 'label' => __('Remove WordPress Version', 'abovewp-tweaks-optimizer'), 'description' => __('Removes WordPress version number from head and RSS feeds for security.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_admin_bar', __('Admin Bar', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_admin_bar', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable Admin Bar on Frontend', 'abovewp-tweaks-optimizer'), 'description' => __('Removes the WordPress admin bar from the frontend for all users.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_wp_emoji_release', __('Emoji Release', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_wp_emoji_release', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable WordPress Emoji Release Script', 'abovewp-tweaks-optimizer'), 'description' => __('Removes the extra script WordPress loads for emoji release handling.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'enable_classic_widgets', __('Classic Widgets', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'enable_classic_widgets', 'option_name' => 'abovewp_bloat_options', 'label' => __('Enable Classic Widgets Interface', 'abovewp-tweaks-optimizer'), 'description' => __('Restores the traditional, lightweight widget interface instead of using the heavier block-based widget editor. This provides a more streamlined experience when managing widgets.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => false ) ); add_settings_field( 'disable_query_strings', __('Query Strings', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_query_strings', 'option_name' => 'abovewp_bloat_options', 'label' => __('Remove Query Strings from Static Resources', 'abovewp-tweaks-optimizer'), 'description' => __('Improves caching by removing query strings (ver=x.x.x) from static resources.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_self_pingbacks', __('Self Pingbacks', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_self_pingbacks', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable Self Pingbacks', 'abovewp-tweaks-optimizer'), 'description' => __('Disable WordPress sending pingbacks when you link to your own site.', 'abovewp-tweaks-optimizer'), 'default' => 'yes' ) ); add_settings_field( 'disable_xmlrpc', __('XML-RPC', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-bloat', 'abovewp_bloat_section', array( 'name' => 'disable_xmlrpc', 'option_name' => 'abovewp_bloat_options', 'label' => __('Disable XML-RPC', 'abovewp-tweaks-optimizer'), 'description' => __('Disable the XML-RPC API (may affect some 3rd party services like Jetpack).', 'abovewp-tweaks-optimizer'), 'default' => 'yes' ) ); // Register WooCommerce settings and fields if ($this->is_woocommerce_active()) { $this->register_woocommerce_settings(); } } /** * Register WooCommerce settings section and fields */ private function register_woocommerce_settings() { // WooCommerce section add_settings_section( 'abovewp_woocommerce_section', __('WooCommerce Tweaks', 'abovewp-tweaks-optimizer'), array($this, 'woocommerce_section_callback'), 'abovewp-tweaks-optimizer-woocommerce' ); // Add WooCommerce enhancement fields add_settings_field( 'disable_password_strength_meter', __('Password Strength Meter', 'abovewp-tweaks-optimizer'), array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-woocommerce', 'abovewp_woocommerce_section', array( 'name' => 'disable_password_strength_meter', 'option_name' => 'abovewp_woocommerce_options', 'label' => __('Disable Password Strength Meter', 'abovewp-tweaks-optimizer'), 'description' => __('Remove the password strength meter on checkout page to improve performance.', 'abovewp-tweaks-optimizer'), 'default' => 'no', 'reverse' => true ) ); // Product Tabs section header add_settings_field( 'product_tabs_header', __('Product Tabs', 'abovewp-tweaks-optimizer'), array($this, 'section_header_callback'), 'abovewp-tweaks-optimizer-woocommerce', 'abovewp_woocommerce_section', array( 'description' => __('Select which product tabs to remove from product pages.', 'abovewp-tweaks-optimizer') ) ); // Individual checkbox for each product tab add_settings_field( 'disable_reviews_tab', '', array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-woocommerce', 'abovewp_woocommerce_section', array( 'name' => 'disable_reviews_tab', 'option_name' => 'abovewp_woocommerce_options', 'label' => __('Disable Reviews Tab', 'abovewp-tweaks-optimizer'), 'description' => '', 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_description_tab', '', array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-woocommerce', 'abovewp_woocommerce_section', array( 'name' => 'disable_description_tab', 'option_name' => 'abovewp_woocommerce_options', 'label' => __('Disable Description Tab', 'abovewp-tweaks-optimizer'), 'description' => '', 'default' => 'no', 'reverse' => true ) ); add_settings_field( 'disable_additional_information_tab', '', array($this, 'checkbox_field_callback'), 'abovewp-tweaks-optimizer-woocommerce', 'abovewp_woocommerce_section', array( 'name' => 'disable_additional_information_tab', 'option_name' => 'abovewp_woocommerce_options', 'label' => __('Disable Additional Information Tab', 'abovewp-tweaks-optimizer'), 'description' => '', 'default' => 'no', 'reverse' => true ) ); } /** * Sanitize tweaks options * * @param array $input Input from settings form * @return array */ public function sanitize_tweaks_options($input) { $output = array(); $old_options = get_option('abovewp_tweaks_options', array()); $checkboxes = array( 'disable_wp_cron', 'admin_cleanup', 'disable_admin_notices', 'limit_login_attempts', 'enable_media_trash', ); foreach ($checkboxes as $checkbox) { $output[$checkbox] = isset($input[$checkbox]) ? sanitize_text_field($input[$checkbox]) : 'no'; } // Sanitize selects $selects = array('admin_heartbeat', 'heartbeat_frequency'); foreach ($selects as $select) { $output[$select] = isset($input[$select]) ? sanitize_text_field($input[$select]) : ''; } // Sanitize numbers $output['limit_post_revisions'] = isset($input['limit_post_revisions']) ? intval($input['limit_post_revisions']) : -1; $output['autosave_interval'] = isset($input['autosave_interval']) ? intval($input['autosave_interval']) : 60; $output['login_attempts_limit'] = isset($input['login_attempts_limit']) ? intval($input['login_attempts_limit']) : 5; $output['login_lockout_time'] = isset($input['login_lockout_time']) ? intval($input['login_lockout_time']) : 60; // Check if media trash setting has changed $old_media_trash = isset($old_options['enable_media_trash']) ? $old_options['enable_media_trash'] : 'no'; $new_media_trash = $output['enable_media_trash']; if ($old_media_trash !== $new_media_trash) { // Setting has changed, update wp-config.php if ($new_media_trash === 'yes') { // Add the constant $this->add_media_trash_to_config(); } else { // Remove the constant $this->remove_media_trash_from_config(); } } return $output; } /** * Sanitize bloat options * * @param array $input Input from settings form * @return array */ public function sanitize_bloat_options($input) { $output = array(); $checkboxes = array( 'disable_gutenberg', 'disable_comments', 'disable_embeds', 'disable_rest_api', 'disable_feed_links', 'disable_all_feeds', 'disable_author_archives', 'disable_dashicons', 'disable_shortlinks', 'disable_wlwmanifest', 'disable_rsd', 'disable_wp_version', 'disable_admin_bar', 'disable_wp_emoji_release', 'enable_classic_widgets', 'disable_query_strings', 'disable_self_pingbacks', 'disable_xmlrpc', ); foreach ($checkboxes as $checkbox) { $output[$checkbox] = isset($input[$checkbox]) ? sanitize_text_field($input[$checkbox]) : 'no'; } return $output; } /** * Tweaks section callback */ public function tweaks_section_callback() { // No additional text needed as we have the section-info div } /** * Bloat section callback */ public function bloat_section_callback() { // No additional text needed as we have the section-info div } /** * WooCommerce section callback */ public function woocommerce_section_callback() { // No additional text needed as we have the section-info div } /** * Checkbox field callback * * @param array $args Field arguments */ public function checkbox_field_callback($args) { $option_name = $args['option_name']; $name = $args['name']; $label = $args['label']; $description = $args['description']; $default = isset($args['default']) ? $args['default'] : 'yes'; $options = get_option($option_name); $value = isset($options[$name]) ? $options[$name] : $default; $class = ''; if ($name === 'disable_rest_api' || $name === 'disable_gutenberg' || $name === 'disable_comments') { $class = 'risky-setting'; } ?>

update_wp_config_directly(); } // Check if WooCommerce is active $woocommerce_active = $this->is_woocommerce_active(); ?>

add_media_trash_to_config(); if ($success) { // Update the setting to match $tweaks_options = get_option('abovewp_tweaks_options', array()); $tweaks_options['enable_media_trash'] = 'yes'; update_option('abovewp_tweaks_options', $tweaks_options); // Refresh the page to show updated settings wp_safe_redirect(admin_url('admin.php?page=abovewp-tweaks-optimizer&tab=tweaks&updated=true')); exit; } } /** * Add MEDIA_TRASH constant to wp-config.php */ private function add_media_trash_to_config() { // Same implementation as update_wp_config_directly but with no notices $config_path = $this->get_wp_config_path(); global $wp_filesystem; if (empty($wp_filesystem)) { require_once ABSPATH . 'wp-admin/includes/file.php'; WP_Filesystem(); } if (!$config_path || !$wp_filesystem->is_writable($config_path)) { return false; } $config_content = $wp_filesystem->get_contents($config_path); if (!$config_content) { return false; } // Check if already defined if (strpos($config_content, "define('MEDIA_TRASH'") !== false || strpos($config_content, 'define("MEDIA_TRASH"') !== false) { return true; // Already exists } // Find insertion point $insertion_point = strpos($config_content, "/* That's all, stop editing!"); if ($insertion_point === false) { $insertion_point = strpos($config_content, "require_once"); if ($insertion_point === false) { return false; } } // Insert the constant $new_content = substr($config_content, 0, $insertion_point); $new_content .= "/** Added by AboveWP Tweaks Optimizer */\n"; $new_content .= "define('MEDIA_TRASH', true);\n\n"; $new_content .= substr($config_content, $insertion_point); // Write the new content $result = $wp_filesystem->put_contents($config_path, $new_content, FS_CHMOD_FILE); // Add success message if ($result !== false) { add_settings_error( 'abovewp_tweaks_options', 'media_trash_enabled', __('Media Trash has been enabled in your wp-config.php file.', 'abovewp-tweaks-optimizer'), 'success' ); return true; } return false; } /** * Remove MEDIA_TRASH constant from wp-config.php */ private function remove_media_trash_from_config() { $config_path = $this->get_wp_config_path(); global $wp_filesystem; if (empty($wp_filesystem)) { require_once ABSPATH . 'wp-admin/includes/file.php'; WP_Filesystem(); } if (!$config_path || !$wp_filesystem->is_writable($config_path)) { return false; } $config_content = $wp_filesystem->get_contents($config_path); if (!$config_content) { return false; } // Check for the constant $media_trash_line = "define('MEDIA_TRASH', true);"; $media_trash_line_alt = 'define("MEDIA_TRASH", true);'; $media_trash_comment = "/** Added by AboveWP Tweaks Optimizer */"; // Try to find the lines to remove if (strpos($config_content, $media_trash_line) !== false) { // Remove the line and potentially the comment $pattern = '/\s*' . preg_quote($media_trash_comment, '/') . '\s*' . preg_quote($media_trash_line, '/') . '\s*/'; $new_content = preg_replace($pattern, "\n", $config_content); if ($new_content !== $config_content) { $result = $wp_filesystem->put_contents($config_path, $new_content, FS_CHMOD_FILE); if ($result !== false) { add_settings_error( 'abovewp_tweaks_options', 'media_trash_disabled', __('Media Trash has been disabled in your wp-config.php file.', 'abovewp-tweaks-optimizer'), 'success' ); return true; } } } else if (strpos($config_content, $media_trash_line_alt) !== false) { // Try alternative quote style $pattern = '/\s*' . preg_quote($media_trash_comment, '/') . '\s*' . preg_quote($media_trash_line_alt, '/') . '\s*/'; $new_content = preg_replace($pattern, "\n", $config_content); if ($new_content !== $config_content) { $result = $wp_filesystem->put_contents($config_path, $new_content, FS_CHMOD_FILE); if ($result !== false) { add_settings_error( 'abovewp_tweaks_options', 'media_trash_disabled', __('Media Trash has been disabled in your wp-config.php file.', 'abovewp-tweaks-optimizer'), 'success' ); return true; } } } return false; } /** * Get wp-config.php path * * @return string|false Path to wp-config.php or false if not found */ private function get_wp_config_path() { global $wp_filesystem; if (empty($wp_filesystem)) { require_once ABSPATH . 'wp-admin/includes/file.php'; WP_Filesystem(); } $config_path = ABSPATH . 'wp-config.php'; if ($wp_filesystem->exists($config_path)) { return $config_path; } // Try one directory up $config_path = dirname(ABSPATH) . '/wp-config.php'; if ($wp_filesystem->exists($config_path)) { return $config_path; } return false; } /** * Check if WooCommerce is active * * @return boolean */ private function is_woocommerce_active() { return in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins'))) || // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- WordPress core filter. (is_multisite() && array_key_exists('woocommerce/woocommerce.php', get_site_option('active_sitewide_plugins', array()))); } /** * Section header callback for sub-sections * * @param array $args Field arguments */ public function section_header_callback($args) { if (isset($args['description']) && !empty($args['description'])) { echo '

' . esc_html($args['description']) . '

'; } } /** * Sanitize WooCommerce options * * @param array $input Input from settings form * @return array */ public function sanitize_woocommerce_options($input) { $output = array(); $checkboxes = array( 'disable_password_strength_meter', 'disable_reviews_tab', 'disable_description_tab', 'disable_additional_information_tab', ); foreach ($checkboxes as $checkbox) { $output[$checkbox] = isset($input[$checkbox]) ? sanitize_text_field($input[$checkbox]) : 'no'; } return $output; } }