admin-site-enhancements
Last commit date
assets
1 year ago
classes
1 year ago
includes
1 year ago
languages
1 year ago
vendor
1 year ago
CHANGELOG.md
1 year ago
LICENSE.md
1 year ago
README.md
1 year ago
admin-site-enhancements.php
1 year ago
bootstrap.php
1 year ago
functions.php
1 year ago
settings.php
1 year ago
bootstrap.php
1090 lines
| 1 | <?php |
| 2 | |
| 3 | // We're using the singleton design pattern |
| 4 | // https://code.tutsplus.com/articles/design-patterns-in-wordpress-the-singleton-pattern--wp-31621 |
| 5 | // https://carlalexander.ca/singletons-in-wordpress/ |
| 6 | // https://torquemag.io/2016/11/singletons-wordpress-good-evil/ |
| 7 | /** |
| 8 | * Main class of the plugin used to add functionalities |
| 9 | * |
| 10 | * @since 1.0.0 |
| 11 | */ |
| 12 | class Admin_Site_Enhancements { |
| 13 | // Refers to a single instance of this class |
| 14 | private static $instance = null; |
| 15 | |
| 16 | /** |
| 17 | * Creates or returns a single instance of this class |
| 18 | * |
| 19 | * @return Admin_Site_Enhancements a single instance of this class |
| 20 | * @since 1.0.0 |
| 21 | */ |
| 22 | public static function get_instance() { |
| 23 | if ( null == self::$instance ) { |
| 24 | self::$instance = new self(); |
| 25 | } |
| 26 | return self::$instance; |
| 27 | } |
| 28 | |
| 29 | /** |
| 30 | * Initialize plugin functionalities |
| 31 | */ |
| 32 | private function __construct() { |
| 33 | global $wp_post_types, $pagenow, $typenow; |
| 34 | // Setup admin menu, admin page, settings, settings sections, sections fields, admin scripts, plugin action links, etc. |
| 35 | // Register admin menu and add the settings page. |
| 36 | add_action( 'admin_menu', 'asenha_register_admin_menu' ); |
| 37 | // Register plugin settings |
| 38 | // Instantiate object for registration of settings section and fields |
| 39 | $settings = new ASENHA\Classes\Settings_Sections_Fields(); |
| 40 | add_action( 'admin_init', [$settings, 'register_sections_fields'] ); |
| 41 | // Suppress all notices on the plugin's main page. Then add notification for successful settings update. |
| 42 | add_action( 'admin_notices', 'asenha_suppress_add_notices', 5 ); |
| 43 | add_action( 'all_admin_notices', 'asenha_suppress_generic_notices', 5 ); |
| 44 | // Enqueue admin scripts and styles |
| 45 | add_action( 'admin_enqueue_scripts', 'asenha_admin_scripts' ); |
| 46 | add_action( 'admin_head', 'asenha_admin_menu_organizer_css' ); |
| 47 | // Enqueue public scripts and styles |
| 48 | add_action( 'wp_enqueue_scripts', 'asenha_public_scripts' ); |
| 49 | // Dequeue scripts that prevents settings page from working |
| 50 | add_action( 'wp_print_scripts', 'asenha_dequeue_scritps', PHP_INT_MAX ); |
| 51 | add_action( 'admin_print_footer_scripts', 'asenha_dequeue_scritps', PHP_INT_MAX ); |
| 52 | add_action( 'admin_enqueue_scripts-tools_page_admin-site-enhancements', 'asenha_dequeue_scritps', PHP_INT_MAX ); |
| 53 | add_action( 'admin_print_scripts-tools_page_admin-site-enhancements', 'asenha_dequeue_scritps', PHP_INT_MAX ); |
| 54 | // Add admin bar inline styles |
| 55 | add_action( 'admin_head', 'asenha_admin_bar_item_js_css' ); |
| 56 | add_action( 'wp_head', 'asenha_admin_bar_item_js_css' ); |
| 57 | add_filter( 'plugin_action_links_' . ASENHA_SLUG . '/' . ASENHA_SLUG . '.php', 'asenha_plugin_action_links' ); |
| 58 | // Mark that a user have supported ASE (via AJAX) |
| 59 | add_action( 'wp_ajax_have_supported', 'asenha_have_supported' ); |
| 60 | // Dismiss upgrade nudge (via AJAX) |
| 61 | add_action( 'wp_ajax_dismiss_upgrade_nudge', 'asenha_dismiss_upgrade_nudge' ); |
| 62 | // Dismiss promo nudge (via AJAX) |
| 63 | add_action( 'wp_ajax_dismiss_promo_nudge', 'asenha_dismiss_promo_nudge' ); |
| 64 | // Dismiss support nudge (via AJAX) |
| 65 | add_action( 'wp_ajax_dismiss_support_nudge', 'asenha_dismiss_support_nudge' ); |
| 66 | if ( function_exists( 'bwasenha_fs' ) ) { |
| 67 | bwasenha_fs()->add_filter( 'plugin_icon', 'fs_custom_optin_icon__premium_only' ); |
| 68 | } |
| 69 | // Get all ASE options, default to empty array in case it's not been created yet |
| 70 | $options = get_option( ASENHA_SLUG_U, array() ); |
| 71 | // Add style="display:[something];" to the safe CSS attributes. |
| 72 | // Ref: https://github.com/WordPress/wordpress-develop/blob/6.4/src/wp-includes/kses.php#L2329 |
| 73 | // Ref: https://wordpress.stackexchange.com/a/195433 |
| 74 | add_filter( 'safe_style_css', function ( $styles ) { |
| 75 | $styles[] = 'display'; |
| 76 | return $styles; |
| 77 | } ); |
| 78 | // Content Duplication |
| 79 | if ( array_key_exists( 'enable_duplication', $options ) && $options['enable_duplication'] ) { |
| 80 | $content_duplication = new ASENHA\Classes\Content_Duplication(); |
| 81 | add_action( 'admin_action_duplicate_content', [$content_duplication, 'duplicate_content'] ); |
| 82 | add_filter( |
| 83 | 'page_row_actions', |
| 84 | [$content_duplication, 'add_duplication_action_link'], |
| 85 | 20, |
| 86 | 2 |
| 87 | ); |
| 88 | add_filter( |
| 89 | 'post_row_actions', |
| 90 | [$content_duplication, 'add_duplication_action_link'], |
| 91 | 20, |
| 92 | 2 |
| 93 | ); |
| 94 | add_action( 'admin_bar_menu', [$content_duplication, 'add_admin_bar_duplication_link'], 100 ); |
| 95 | } |
| 96 | // Content Order |
| 97 | if ( array_key_exists( 'content_order', $options ) && $options['content_order'] ) { |
| 98 | if ( array_key_exists( 'content_order_for', $options ) && !empty( $options['content_order_for'] ) || array_key_exists( 'content_order_for_other_post_types', $options ) && !empty( $options['content_order_for_other_post_types'] ) ) { |
| 99 | $content_order = new ASENHA\Classes\Content_Order(); |
| 100 | add_action( 'admin_menu', [$content_order, 'add_content_order_submenu'] ); |
| 101 | add_action( 'admin_init', [$content_order, 'maybe_perform_menu_link_redirects'] ); |
| 102 | add_action( 'admin_footer', [$content_order, 'add_additional_elements'] ); |
| 103 | add_filter( 'admin_enqueue_scripts', [$content_order, 'add_list_tables_scripts'] ); |
| 104 | add_action( 'wp_ajax_save_custom_order', [$content_order, 'save_custom_content_order'] ); |
| 105 | add_filter( 'pre_get_posts', [$content_order, 'orderby_menu_order'], PHP_INT_MAX ); |
| 106 | // TODO: https://developer.wordpress.org/reference/hooks/ajax_query_attachments_args/ (for grid view of media library) |
| 107 | add_filter( |
| 108 | 'save_post', |
| 109 | [$content_order, 'set_menu_order_for_new_posts'], |
| 110 | 10, |
| 111 | 3 |
| 112 | ); |
| 113 | } |
| 114 | } |
| 115 | // Media Replacement |
| 116 | if ( array_key_exists( 'enable_media_replacement', $options ) && $options['enable_media_replacement'] ) { |
| 117 | $media_replacement = new ASENHA\Classes\Media_Replacement(); |
| 118 | $disable_media_replacement_cache_busting = ( isset( $options['disable_media_replacement_cache_busting'] ) ? $options['disable_media_replacement_cache_busting'] : false ); |
| 119 | add_filter( |
| 120 | 'media_row_actions', |
| 121 | [$media_replacement, 'modify_media_list_table_edit_link'], |
| 122 | 10, |
| 123 | 2 |
| 124 | ); |
| 125 | add_filter( |
| 126 | 'attachment_fields_to_edit', |
| 127 | [$media_replacement, 'add_media_replacement_button'], |
| 128 | 10, |
| 129 | 2 |
| 130 | ); |
| 131 | add_action( 'edit_attachment', [$media_replacement, 'replace_media'] ); |
| 132 | add_filter( 'post_updated_messages', [$media_replacement, 'attachment_updated_custom_message'] ); |
| 133 | // Mayve bust browser cache of old/replaced images by appending a time stamp URL parameter |
| 134 | if ( !$disable_media_replacement_cache_busting ) { |
| 135 | add_filter( |
| 136 | 'wp_calculate_image_srcset', |
| 137 | [$media_replacement, 'append_cache_busting_param_to_image_srcset'], |
| 138 | 10, |
| 139 | 5 |
| 140 | ); |
| 141 | add_filter( |
| 142 | 'wp_get_attachment_image_src', |
| 143 | [$media_replacement, 'append_cache_busting_param_to_attachment_image_src'], |
| 144 | 10, |
| 145 | 2 |
| 146 | ); |
| 147 | add_filter( |
| 148 | 'wp_prepare_attachment_for_js', |
| 149 | [$media_replacement, 'append_cache_busting_param_to_attachment_for_js'], |
| 150 | 10, |
| 151 | 2 |
| 152 | ); |
| 153 | add_filter( |
| 154 | 'wp_get_attachment_url', |
| 155 | [$media_replacement, 'append_cache_busting_param_to_attachment_url'], |
| 156 | 20, |
| 157 | 2 |
| 158 | ); |
| 159 | } |
| 160 | } |
| 161 | // Media Library Infinite Scrolling |
| 162 | if ( array_key_exists( 'media_library_infinite_scrolling', $options ) && $options['media_library_infinite_scrolling'] ) { |
| 163 | add_filter( 'media_library_infinite_scrolling', '__return_true' ); |
| 164 | } |
| 165 | // SVG Upload |
| 166 | if ( array_key_exists( 'enable_svg_upload', $options ) && $options['enable_svg_upload'] && array_key_exists( 'enable_svg_upload_for', $options ) && isset( $options['enable_svg_upload_for'] ) ) { |
| 167 | global $roles_svg_upload_enabled; |
| 168 | $enable_svg_upload = $options['enable_svg_upload']; |
| 169 | $for_roles = $options['enable_svg_upload_for']; |
| 170 | // User has role(s). Do further checks. |
| 171 | if ( isset( $for_roles ) && count( $for_roles ) > 0 ) { |
| 172 | // Assemble single-dimensional array of roles for which SVG upload would be enabled |
| 173 | $roles_svg_upload_enabled = array(); |
| 174 | foreach ( $for_roles as $role_slug => $svg_upload_enabled ) { |
| 175 | if ( $svg_upload_enabled ) { |
| 176 | $roles_svg_upload_enabled[] = $role_slug; |
| 177 | } |
| 178 | } |
| 179 | } |
| 180 | $svg_upload = new ASENHA\Classes\SVG_Upload(); |
| 181 | add_filter( 'upload_mimes', [$svg_upload, 'add_svg_mime'] ); |
| 182 | add_filter( |
| 183 | 'wp_check_filetype_and_ext', |
| 184 | [$svg_upload, 'confirm_file_type_is_svg'], |
| 185 | 10, |
| 186 | 4 |
| 187 | ); |
| 188 | add_filter( 'wp_handle_sideload_prefilter', [$svg_upload, 'sanitize_and_maybe_allow_svg_upload'] ); |
| 189 | add_filter( 'wp_handle_upload_prefilter', [$svg_upload, 'sanitize_and_maybe_allow_svg_upload'] ); |
| 190 | add_action( |
| 191 | 'rest_insert_attachment', |
| 192 | [$svg_upload, 'sanitize_after_upload'], |
| 193 | 10, |
| 194 | 3 |
| 195 | ); |
| 196 | add_filter( |
| 197 | 'wp_generate_attachment_metadata', |
| 198 | [$svg_upload, 'generate_svg_metadata'], |
| 199 | 10, |
| 200 | 3 |
| 201 | ); |
| 202 | add_filter( 'wp_calculate_image_srcset', [$svg_upload, 'disable_svg_srcset'] ); |
| 203 | if ( !in_array( 'auto-sizes/auto-sizes.php', get_option( 'active_plugins', array() ) ) ) { |
| 204 | // Only add this filter when https://wordpress.org/plugins/auto-sizes/ is not active to prevent PHP deprecation notice |
| 205 | add_filter( |
| 206 | 'wp_calculate_image_sizes', |
| 207 | [$svg_upload, 'remove_svg_responsive_image_attr'], |
| 208 | 10, |
| 209 | 3 |
| 210 | ); |
| 211 | } |
| 212 | add_action( 'wp_ajax_svg_get_attachment_url', [$svg_upload, 'get_svg_attachment_url'] ); |
| 213 | add_filter( 'wp_prepare_attachment_for_js', [$svg_upload, 'get_svg_url_in_media_library'] ); |
| 214 | } |
| 215 | // AVIF Upload |
| 216 | if ( array_key_exists( 'enable_avif_upload', $options ) && $options['enable_avif_upload'] ) { |
| 217 | $avif_upload = new ASENHA\Classes\AVIF_Upload(); |
| 218 | add_filter( 'mime_types', [$avif_upload, 'add_avif_mime_type'] ); |
| 219 | add_filter( 'upload_mimes', [$avif_upload, 'allow_avif_mime_type_upload'] ); |
| 220 | add_filter( 'getimagesize_mimes_to_exts', [$avif_upload, 'add_avif_mime_type_to_exts'] ); |
| 221 | add_filter( |
| 222 | 'wp_generate_attachment_metadata', |
| 223 | [$avif_upload, 'add_avif_image_dimension'], |
| 224 | 10, |
| 225 | 3 |
| 226 | ); |
| 227 | add_filter( |
| 228 | 'file_is_displayable_image', |
| 229 | [$avif_upload, 'make_avif_displayable'], |
| 230 | 10, |
| 231 | 2 |
| 232 | ); |
| 233 | add_filter( |
| 234 | 'wp_check_filetype_and_ext', |
| 235 | [$avif_upload, 'handle_exif_and_fileinfo_fail'], |
| 236 | 10, |
| 237 | 5 |
| 238 | ); |
| 239 | } |
| 240 | // External Permalinks |
| 241 | if ( array_key_exists( 'enable_external_permalinks', $options ) && $options['enable_external_permalinks'] ) { |
| 242 | if ( array_key_exists( 'enable_external_permalinks_for', $options ) && !empty( $options['enable_external_permalinks_for'] ) ) { |
| 243 | $external_permalinks = new ASENHA\Classes\External_Permalinks(); |
| 244 | add_action( |
| 245 | 'add_meta_boxes', |
| 246 | [$external_permalinks, 'add_external_permalink_meta_box'], |
| 247 | 10, |
| 248 | 2 |
| 249 | ); |
| 250 | add_action( 'save_post', [$external_permalinks, 'save_external_permalink'] ); |
| 251 | // Filter the permalink for use by get_permalink() |
| 252 | add_filter( |
| 253 | 'page_link', |
| 254 | [$external_permalinks, 'use_external_permalink_for_pages'], |
| 255 | 20, |
| 256 | 2 |
| 257 | ); |
| 258 | add_filter( |
| 259 | 'post_link', |
| 260 | [$external_permalinks, 'use_external_permalink_for_posts'], |
| 261 | 20, |
| 262 | 2 |
| 263 | ); |
| 264 | add_filter( |
| 265 | 'post_type_link', |
| 266 | [$external_permalinks, 'use_external_permalink_for_posts'], |
| 267 | 20, |
| 268 | 2 |
| 269 | ); |
| 270 | // Enable redirection to external permalink when page/post is opened directly via it's WP permalink |
| 271 | add_action( 'wp', [$external_permalinks, 'redirect_to_external_permalink'] ); |
| 272 | } |
| 273 | } |
| 274 | // Open All External Links in New Tab |
| 275 | if ( array_key_exists( 'external_links_new_tab', $options ) && $options['external_links_new_tab'] ) { |
| 276 | $open_external_links_in_new_tab = new ASENHA\Classes\Open_External_Links_In_New_Tab(); |
| 277 | add_filter( 'the_content', [$open_external_links_in_new_tab, 'add_target_and_rel_atts_to_content_links'] ); |
| 278 | if ( in_array( 'elementor/elementor.php', get_option( 'active_plugins', array() ) ) ) { |
| 279 | add_filter( 'elementor/frontend/the_content', [$open_external_links_in_new_tab, 'add_target_and_rel_atts_to_content_links'] ); |
| 280 | } |
| 281 | } |
| 282 | // Allow Custom Menu Links to Open in New Tab |
| 283 | if ( array_key_exists( 'custom_nav_menu_items_new_tab', $options ) && $options['custom_nav_menu_items_new_tab'] ) { |
| 284 | $custom_nav_menu_items_in_new_tab = new ASENHA\Classes\Custom_Nav_Menu_Items_In_New_Tab(); |
| 285 | add_filter( |
| 286 | 'wp_nav_menu_item_custom_fields', |
| 287 | [$custom_nav_menu_items_in_new_tab, 'add_custom_nav_menu_open_in_new_tab_field'], |
| 288 | 10, |
| 289 | 4 |
| 290 | ); |
| 291 | add_action( |
| 292 | 'wp_update_nav_menu_item', |
| 293 | [$custom_nav_menu_items_in_new_tab, 'save_custom_nav_menu_open_in_new_tab_status'], |
| 294 | 10, |
| 295 | 3 |
| 296 | ); |
| 297 | add_action( |
| 298 | 'nav_menu_link_attributes', |
| 299 | [$custom_nav_menu_items_in_new_tab, 'add_attributes_to_custom_nav_menu_item'], |
| 300 | 10, |
| 301 | 3 |
| 302 | ); |
| 303 | } |
| 304 | // Auto-Publishing of Posts with Missed Schedules |
| 305 | if ( array_key_exists( 'enable_missed_schedule_posts_auto_publish', $options ) && $options['enable_missed_schedule_posts_auto_publish'] ) { |
| 306 | $auto_publish_posts_with_missed_schedule = new ASENHA\Classes\Auto_Publish_Posts_With_Missed_Schedule(); |
| 307 | add_action( 'wp_head', [$auto_publish_posts_with_missed_schedule, 'publish_missed_schedule_posts'] ); |
| 308 | add_action( 'admin_head', [$auto_publish_posts_with_missed_schedule, 'publish_missed_schedule_posts'] ); |
| 309 | } |
| 310 | // Hide or Modify Elements / Clean Up Admin Bar |
| 311 | if ( array_key_exists( 'hide_modify_elements', $options ) && $options['hide_modify_elements'] ) { |
| 312 | $cleanup_admin_bar = new ASENHA\Classes\Cleanup_Admin_Bar(); |
| 313 | // Priority 5 to execute earlier than the normal 10. This is for removing default items. |
| 314 | add_filter( 'admin_bar_menu', [$cleanup_admin_bar, 'modify_admin_bar_menu'], 5 ); |
| 315 | add_filter( 'admin_bar_menu', [$cleanup_admin_bar, 'remove_howdy'], PHP_INT_MAX - 100 ); |
| 316 | if ( array_key_exists( 'hide_help_drawer', $options ) && $options['hide_help_drawer'] ) { |
| 317 | add_action( 'admin_head', [$cleanup_admin_bar, 'hide_help_drawer'] ); |
| 318 | } |
| 319 | } |
| 320 | // Hide Admin Notices |
| 321 | if ( array_key_exists( 'hide_admin_notices', $options ) && $options['hide_admin_notices'] ) { |
| 322 | $hide_admin_notices = new ASENHA\Classes\Hide_Admin_Notices(); |
| 323 | add_action( 'admin_footer', [$hide_admin_notices, 'admin_notices_wrapper'], 9 ); |
| 324 | // add_action( 'all_admin_notices', [ $hide_admin_notices, 'admin_notices_wrapper' ] ); |
| 325 | add_action( 'admin_bar_menu', [$hide_admin_notices, 'admin_notices_menu'] ); |
| 326 | add_action( 'admin_print_styles', [$hide_admin_notices, 'admin_notices_menu_inline_css'] ); |
| 327 | } |
| 328 | // Disable Dashboard Widgets |
| 329 | if ( array_key_exists( 'disable_dashboard_widgets', $options ) && $options['disable_dashboard_widgets'] ) { |
| 330 | $disable_dashboard_widgets = new ASENHA\Classes\Disable_Dashboard_Widgets(); |
| 331 | add_action( 'wp_dashboard_setup', [$disable_dashboard_widgets, 'disable_dashboard_widgets'], PHP_INT_MAX ); |
| 332 | add_action( 'admin_init', [$disable_dashboard_widgets, 'maybe_remove_welcome_panel'] ); |
| 333 | } |
| 334 | // Hide Admin Bar |
| 335 | if ( array_key_exists( 'hide_admin_bar', $options ) && $options['hide_admin_bar'] ) { |
| 336 | $hide_admin_bar = new ASENHA\Classes\Hide_Admin_Bar(); |
| 337 | } |
| 338 | // On the frontend |
| 339 | if ( array_key_exists( 'hide_admin_bar', $options ) && $options['hide_admin_bar'] && array_key_exists( 'hide_admin_bar_for', $options ) && isset( $options['hide_admin_bar_for'] ) ) { |
| 340 | add_filter( 'show_admin_bar', [$hide_admin_bar, 'hide_admin_bar_for_roles_on_frontend'] ); |
| 341 | } |
| 342 | // Wider Admin Menu |
| 343 | if ( array_key_exists( 'wider_admin_menu', $options ) && $options['wider_admin_menu'] ) { |
| 344 | $wider_admin_menu = new ASENHA\Classes\Wider_Admin_Menu(); |
| 345 | add_action( 'admin_head', [$wider_admin_menu, 'set_custom_menu_width'], 99 ); |
| 346 | } |
| 347 | // Admin Menu Organizer |
| 348 | if ( array_key_exists( 'customize_admin_menu', $options ) && $options['customize_admin_menu'] ) { |
| 349 | $options_extra = get_option( ASENHA_SLUG_U . '_extra', array() ); |
| 350 | $admin_menu_options = ( isset( $options_extra['admin_menu'] ) ? $options_extra['admin_menu'] : array() ); |
| 351 | $admin_menu_organizer = new ASENHA\Classes\Admin_Menu_Organizer(); |
| 352 | add_action( 'admin_menu', [$admin_menu_organizer, 'add_menu_item'] ); |
| 353 | // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_menu_organizer, 'save_custom_menu_order' ] ); |
| 354 | // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_menu_organizer, 'save_hidden_menu_items' ] ); |
| 355 | if ( array_key_exists( 'custom_menu_order', $admin_menu_options ) ) { |
| 356 | add_filter( 'custom_menu_order', '__return_true', PHP_INT_MAX ); |
| 357 | add_filter( 'menu_order', [$admin_menu_organizer, 'render_custom_menu_order'], PHP_INT_MAX ); |
| 358 | } |
| 359 | if ( array_key_exists( 'custom_menu_titles', $admin_menu_options ) ) { |
| 360 | add_action( 'admin_menu', [$admin_menu_organizer, 'apply_custom_menu_item_titles'], 9999999995 ); |
| 361 | // For 'Posts' menu, if the title has been changed, try changing the labels for it everywhere |
| 362 | $custom_menu_titles = explode( ',', $admin_menu_options['custom_menu_titles'] ); |
| 363 | foreach ( $custom_menu_titles as $custom_menu_title ) { |
| 364 | if ( false !== strpos( $custom_menu_title, 'menu-posts__' ) ) { |
| 365 | $custom_menu_title = explode( '__', $custom_menu_title ); |
| 366 | $posts_custom_title = $custom_menu_title[1]; |
| 367 | $posts_default_title = $wp_post_types['post']->label; |
| 368 | if ( $posts_default_title != $posts_custom_title ) { |
| 369 | add_filter( 'post_type_labels_post', [$admin_menu_organizer, 'change_post_labels'] ); |
| 370 | add_action( 'init', [$admin_menu_organizer, 'change_post_object_label'] ); |
| 371 | add_action( 'admin_menu', [$admin_menu_organizer, 'change_post_menu_label'], PHP_INT_MAX ); |
| 372 | add_action( 'admin_bar_menu', [$admin_menu_organizer, 'change_wp_admin_bar'], 80 ); |
| 373 | } |
| 374 | } |
| 375 | } |
| 376 | } |
| 377 | if ( array_key_exists( 'custom_menu_hidden', $admin_menu_options ) || array_key_exists( 'custom_menu_always_hidden', $admin_menu_options ) ) { |
| 378 | add_action( 'admin_menu', [$admin_menu_organizer, 'hide_menu_items'], 9999999996 ); |
| 379 | add_action( 'admin_menu', [$admin_menu_organizer, 'add_hidden_menu_toggle'], 9999999997 ); |
| 380 | add_action( 'admin_enqueue_scripts', [$admin_menu_organizer, 'enqueue_toggle_hidden_menu_script'] ); |
| 381 | } |
| 382 | add_action( 'wp_ajax_save_admin_menu', [$admin_menu_organizer, 'save_admin_menu'] ); |
| 383 | } |
| 384 | // Show Custom Taxonomy Filters |
| 385 | if ( array_key_exists( 'show_custom_taxonomy_filters', $options ) && $options['show_custom_taxonomy_filters'] ) { |
| 386 | $show_custom_taxonomy_filters = new ASENHA\Classes\Show_Custom_Taxonomy_Filters(); |
| 387 | add_action( 'restrict_manage_posts', [$show_custom_taxonomy_filters, 'show_custom_taxonomy_filters'] ); |
| 388 | } |
| 389 | // Enhance List Tables |
| 390 | if ( array_key_exists( 'enhance_list_tables', $options ) && $options['enhance_list_tables'] ) { |
| 391 | $enhance_list_tables = new ASENHA\Classes\Enhance_List_Tables(); |
| 392 | // Show Featured Image Column |
| 393 | if ( array_key_exists( 'show_featured_image_column', $options ) && $options['show_featured_image_column'] ) { |
| 394 | add_action( 'admin_init', [$enhance_list_tables, 'show_featured_image_column'] ); |
| 395 | } |
| 396 | // Show Excerpt Column |
| 397 | if ( array_key_exists( 'show_excerpt_column', $options ) && $options['show_excerpt_column'] ) { |
| 398 | add_action( 'admin_init', [$enhance_list_tables, 'show_excerpt_column'] ); |
| 399 | } |
| 400 | // Show Last Modified Column |
| 401 | if ( array_key_exists( 'show_last_modified_column', $options ) && $options['show_last_modified_column'] ) { |
| 402 | add_action( 'admin_init', [$enhance_list_tables, 'show_last_modified_column'] ); |
| 403 | } |
| 404 | // Show ID Column |
| 405 | if ( array_key_exists( 'show_id_column', $options ) && $options['show_id_column'] ) { |
| 406 | add_action( 'admin_init', [$enhance_list_tables, 'show_id_column'] ); |
| 407 | } |
| 408 | // Show File Size Column in Media Library |
| 409 | if ( array_key_exists( 'show_file_size_column', $options ) && $options['show_file_size_column'] ) { |
| 410 | add_filter( 'manage_upload_columns', [$enhance_list_tables, 'add_column_file_size'] ); |
| 411 | add_action( |
| 412 | 'manage_media_custom_column', |
| 413 | [$enhance_list_tables, 'display_file_size'], |
| 414 | 10, |
| 415 | 2 |
| 416 | ); |
| 417 | add_action( 'admin_head', [$enhance_list_tables, 'add_media_styles'] ); |
| 418 | } |
| 419 | // Show ID in Action Row |
| 420 | if ( array_key_exists( 'show_id_in_action_row', $options ) && $options['show_id_in_action_row'] ) { |
| 421 | add_action( 'admin_init', [$enhance_list_tables, 'show_id_in_action_row'] ); |
| 422 | } |
| 423 | // Hide Date Column |
| 424 | if ( array_key_exists( 'hide_date_column', $options ) && $options['hide_date_column'] ) { |
| 425 | add_action( 'admin_init', [$enhance_list_tables, 'hide_date_column'] ); |
| 426 | } |
| 427 | // Hide Comments Column |
| 428 | if ( array_key_exists( 'hide_comments_column', $options ) && $options['hide_comments_column'] ) { |
| 429 | add_action( 'admin_init', [$enhance_list_tables, 'hide_comments_column'] ); |
| 430 | } |
| 431 | // Hide Post Tags Column |
| 432 | if ( array_key_exists( 'hide_post_tags_column', $options ) && $options['hide_post_tags_column'] ) { |
| 433 | add_action( 'admin_init', [$enhance_list_tables, 'hide_post_tags_column'] ); |
| 434 | } |
| 435 | } |
| 436 | // Various Admin UI Enhancements |
| 437 | if ( array_key_exists( 'various_admin_ui_enhancements', $options ) && $options['various_admin_ui_enhancements'] ) { |
| 438 | $various_admin_ui_enhancements = new ASENHA\Classes\Various_Admin_Ui_Enhancements(); |
| 439 | // Display Active Plugins First |
| 440 | if ( array_key_exists( 'display_active_plugins_first', $options ) && $options['display_active_plugins_first'] ) { |
| 441 | add_action( 'admin_head-plugins.php', [$various_admin_ui_enhancements, 'show_active_plugins_first'] ); |
| 442 | } |
| 443 | } |
| 444 | // Custom Admin Footer Text |
| 445 | if ( array_key_exists( 'custom_admin_footer_text', $options ) && $options['custom_admin_footer_text'] ) { |
| 446 | $custom_admin_footer_text = new ASENHA\Classes\Custom_Admin_Footer_Text(); |
| 447 | // Update footer text |
| 448 | if ( is_asenha() ) { |
| 449 | add_filter( 'admin_footer_text', 'asenha_footer_text', 20 ); |
| 450 | } else { |
| 451 | add_filter( 'admin_footer_text', [$custom_admin_footer_text, 'custom_admin_footer_text_left'], 20 ); |
| 452 | } |
| 453 | // Update footer version text |
| 454 | if ( is_asenha() ) { |
| 455 | add_filter( 'update_footer', 'asenha_footer_version_text', 20 ); |
| 456 | } else { |
| 457 | add_filter( 'update_footer', [$custom_admin_footer_text, 'custom_admin_footer_text_right'], 20 ); |
| 458 | } |
| 459 | } else { |
| 460 | // Update footer text |
| 461 | if ( is_asenha() ) { |
| 462 | add_filter( 'admin_footer_text', 'asenha_footer_text', 20 ); |
| 463 | } |
| 464 | // Update footer version text |
| 465 | if ( is_asenha() ) { |
| 466 | add_filter( 'update_footer', 'asenha_footer_version_text', 20 ); |
| 467 | } |
| 468 | } |
| 469 | // ================================================================= |
| 470 | // LOG IN | LOG OUT |
| 471 | // ================================================================= |
| 472 | // Change Login URL |
| 473 | if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) { |
| 474 | if ( array_key_exists( 'custom_login_slug', $options ) && !empty( $options['custom_login_slug'] ) ) { |
| 475 | $change_login_url = new ASENHA\Classes\Change_Login_URL(); |
| 476 | add_action( 'init', [$change_login_url, 'redirect_on_custom_login_url'] ); |
| 477 | if ( in_array( 'gravityforms/gravityforms.php', get_option( 'active_plugins', array() ) ) ) { |
| 478 | // Load earlier than Gravity Forms process_exterior_pages() |
| 479 | add_action( 'wp', [$change_login_url, 'prevent_redirect_to_custom_login_url'], 0 ); |
| 480 | } |
| 481 | add_filter( |
| 482 | 'login_url', |
| 483 | [$change_login_url, 'customize_login_url'], |
| 484 | 10, |
| 485 | 3 |
| 486 | ); |
| 487 | add_filter( 'lostpassword_url', [$change_login_url, 'customize_lost_password_url'] ); |
| 488 | add_filter( 'register_url', [$change_login_url, 'customize_register_url'] ); |
| 489 | add_action( 'wp_loaded', [$change_login_url, 'redirect_on_default_login_urls'] ); |
| 490 | add_action( 'wp_login_failed', [$change_login_url, 'redirect_to_custom_login_url_on_login_fail'] ); |
| 491 | add_filter( 'login_message', [$change_login_url, 'add_failed_login_message'] ); |
| 492 | // No need to modify logout_url or perform redirect on logout |
| 493 | // The customized login URL is already being returned after logout |
| 494 | // add_action( 'wp_logout', [ $change_login_url, 'redirect_to_custom_login_url_on_logout_success' ] ); |
| 495 | // add_filter( 'logout_url', [ $change_login_url, 'customize_logout_url' ], 10, 2 ); |
| 496 | } |
| 497 | } |
| 498 | // Login ID Type |
| 499 | if ( array_key_exists( 'login_id_type_restriction', $options ) && $options['login_id_type_restriction'] ) { |
| 500 | if ( array_key_exists( 'login_id_type', $options ) && !empty( $options['login_id_type'] ) ) { |
| 501 | $login_id_type = new ASENHA\Classes\Login_ID_Type(); |
| 502 | switch ( $options['login_id_type'] ) { |
| 503 | case 'username': |
| 504 | remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 ); |
| 505 | add_filter( 'login_form_defaults', [$login_id_type, 'change_login_form_defaults'] ); |
| 506 | add_filter( |
| 507 | 'gettext', |
| 508 | [$login_id_type, 'gettext_login_id_username'], |
| 509 | 20, |
| 510 | 3 |
| 511 | ); |
| 512 | break; |
| 513 | case 'email': |
| 514 | add_filter( |
| 515 | 'authenticate', |
| 516 | [$login_id_type, 'authenticate_email'], |
| 517 | 20, |
| 518 | 2 |
| 519 | ); |
| 520 | add_filter( |
| 521 | 'gettext', |
| 522 | [$login_id_type, 'gettext_login_id_email'], |
| 523 | 20, |
| 524 | 3 |
| 525 | ); |
| 526 | break; |
| 527 | } |
| 528 | } |
| 529 | } |
| 530 | // Use Site Identity on the Login Page |
| 531 | if ( array_key_exists( 'site_identity_on_login', $options ) && $options['site_identity_on_login'] ) { |
| 532 | $site_identity_on_login_page = new ASENHA\Classes\Site_Identity_On_Login_Page(); |
| 533 | add_action( 'login_head', [$site_identity_on_login_page, 'use_site_icon_on_login'] ); |
| 534 | add_filter( 'login_headerurl', [$site_identity_on_login_page, 'use_site_url_on_login'] ); |
| 535 | } |
| 536 | // Login Logout Menu |
| 537 | if ( array_key_exists( 'enable_login_logout_menu', $options ) && $options['enable_login_logout_menu'] ) { |
| 538 | $login_logout_menu = new ASENHA\Classes\Login_Logout_Menu(); |
| 539 | add_action( 'admin_head-nav-menus.php', [$login_logout_menu, 'add_login_logout_metabox'] ); |
| 540 | add_filter( 'wp_setup_nav_menu_item', [$login_logout_menu, 'set_login_logout_menu_item_dynamic_url'] ); |
| 541 | add_filter( 'wp_nav_menu_objects', [$login_logout_menu, 'maybe_remove_login_or_logout_menu_item'] ); |
| 542 | } |
| 543 | // Last Login Column |
| 544 | if ( array_key_exists( 'enable_last_login_column', $options ) && $options['enable_last_login_column'] ) { |
| 545 | $last_login_column = new ASENHA\Classes\Last_Login_Column(); |
| 546 | add_action( |
| 547 | 'wp_login', |
| 548 | [$last_login_column, 'log_login_datetime'], |
| 549 | 3, |
| 550 | 1 |
| 551 | ); |
| 552 | // Earlier than Redirect After Login |
| 553 | add_filter( 'manage_users_columns', [$last_login_column, 'add_last_login_column'] ); |
| 554 | add_filter( |
| 555 | 'manage_users_custom_column', |
| 556 | [$last_login_column, 'show_last_login_info'], |
| 557 | 10, |
| 558 | 3 |
| 559 | ); |
| 560 | add_action( 'admin_print_styles-users.php', [$last_login_column, 'add_column_style'] ); |
| 561 | } |
| 562 | // Registration Date Column |
| 563 | if ( array_key_exists( 'registration_date_column', $options ) && $options['registration_date_column'] ) { |
| 564 | $registration_date_column = new ASENHA\Classes\Registration_Date_Column(); |
| 565 | add_filter( 'manage_users_columns', [$registration_date_column, 'add_registration_date_column'] ); |
| 566 | add_filter( |
| 567 | 'manage_users_custom_column', |
| 568 | [$registration_date_column, 'display_registration_date'], |
| 569 | 10, |
| 570 | 3 |
| 571 | ); |
| 572 | } |
| 573 | // Redirect After Login |
| 574 | if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) { |
| 575 | if ( array_key_exists( 'redirect_after_login_for', $options ) && !empty( $options['redirect_after_login_for'] ) ) { |
| 576 | $redirect_after_login = new ASENHA\Classes\Redirect_After_Login(); |
| 577 | add_filter( |
| 578 | 'wp_login', |
| 579 | [$redirect_after_login, 'redirect_after_login'], |
| 580 | 5, |
| 581 | 2 |
| 582 | ); |
| 583 | } |
| 584 | } |
| 585 | // Redirect After Logout |
| 586 | if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) { |
| 587 | if ( array_key_exists( 'redirect_after_logout_for', $options ) && !empty( $options['redirect_after_logout_for'] ) ) { |
| 588 | $redirect_after_logout = new ASENHA\Classes\Redirect_After_Logout(); |
| 589 | add_action( |
| 590 | 'wp_logout', |
| 591 | [$redirect_after_logout, 'redirect_after_logout'], |
| 592 | 5, |
| 593 | 1 |
| 594 | ); |
| 595 | // load earlier than Change Login URL add_action |
| 596 | // add_filter( 'logout_redirect', [ $redirect_after_logout, 'apply_custom_logout_redirect' ], PHP_INT_MAX, 3 ); |
| 597 | // add_filter( 'logout_url', [ $redirect_after_logout, 'add_redirect_to_in_logout_url' ], PHP_INT_MAX, 2 ); |
| 598 | } |
| 599 | } |
| 600 | // Enable Custom Admin / Frontend CSS |
| 601 | if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] || array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) { |
| 602 | $custom_css = new ASENHA\Classes\Custom_Css(); |
| 603 | } |
| 604 | if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) { |
| 605 | // add_filter( 'admin_enqueue_scripts', [ $custom_css, 'custom_admin_css' ] ); |
| 606 | add_filter( 'admin_print_footer_scripts', [$custom_css, 'custom_admin_css'] ); |
| 607 | } |
| 608 | if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) { |
| 609 | add_filter( 'wp_head', [$custom_css, 'custom_frontend_css'] ); |
| 610 | } |
| 611 | // Insert <head>, <body> and <footer> code |
| 612 | if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) { |
| 613 | $insert_code = new ASENHA\Classes\Insert_Head_Body_Footer_Code(); |
| 614 | if ( isset( $options['head_code_priority'] ) ) { |
| 615 | add_action( 'wp_head', [$insert_code, 'insert_head_code'], $options['head_code_priority'] ); |
| 616 | } else { |
| 617 | add_action( 'wp_head', [$insert_code, 'insert_head_code'], 10 ); |
| 618 | } |
| 619 | if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) { |
| 620 | if ( isset( $options['body_code_priority'] ) ) { |
| 621 | add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], $options['body_code_priority'] ); |
| 622 | } else { |
| 623 | add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], 10 ); |
| 624 | } |
| 625 | } |
| 626 | if ( isset( $options['footer_code_priority'] ) ) { |
| 627 | add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], $options['footer_code_priority'] ); |
| 628 | } else { |
| 629 | add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], 10 ); |
| 630 | } |
| 631 | } |
| 632 | // Custom Body Class |
| 633 | if ( array_key_exists( 'enable_custom_body_class', $options ) && $options['enable_custom_body_class'] ) { |
| 634 | if ( array_key_exists( 'enable_custom_body_class_for', $options ) && !empty( $options['enable_custom_body_class_for'] ) ) { |
| 635 | $custom_body_class = new ASENHA\Classes\Custom_Body_Class(); |
| 636 | add_action( |
| 637 | 'add_meta_boxes', |
| 638 | [$custom_body_class, 'add_custom_body_class_meta_box'], |
| 639 | 10, |
| 640 | 2 |
| 641 | ); |
| 642 | add_action( 'save_post', [$custom_body_class, 'save_custom_body_class'], 99 ); |
| 643 | add_filter( 'body_class', [$custom_body_class, 'append_custom_body_class'], 99 ); |
| 644 | } |
| 645 | } |
| 646 | // Manage ads.txt and app-ads.txt |
| 647 | if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) { |
| 648 | $manage_ads_appads_txt = new ASENHA\Classes\Manage_Ads_Appads_Txt(); |
| 649 | add_action( 'init', [$manage_ads_appads_txt, 'show_ads_appads_txt_content'] ); |
| 650 | } |
| 651 | // Manage robots.txt |
| 652 | if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) { |
| 653 | $manage_robots_txt = new ASENHA\Classes\Manage_Robots_Txt(); |
| 654 | add_filter( |
| 655 | 'robots_txt', |
| 656 | [$manage_robots_txt, 'maybe_show_custom_robots_txt_content'], |
| 657 | PHP_INT_MAX, |
| 658 | 2 |
| 659 | ); |
| 660 | } |
| 661 | // ================================================================= |
| 662 | // DISABLE COMPONENTS |
| 663 | // ================================================================= |
| 664 | // Disable Gutenberg |
| 665 | if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) { |
| 666 | if ( array_key_exists( 'disable_gutenberg_for', $options ) && !empty( $options['disable_gutenberg_for'] ) ) { |
| 667 | $disable_gutenberg = new ASENHA\Classes\Disable_Gutenberg(); |
| 668 | if ( !class_exists( 'Classic_Editor' ) ) { |
| 669 | require_once ASENHA_PATH . 'includes/empty-class-classic-editor.php'; |
| 670 | } |
| 671 | add_action( 'admin_init', [$disable_gutenberg, 'disable_gutenberg_for_post_types_admin'] ); |
| 672 | add_action( 'admin_print_styles', [$disable_gutenberg, 'safari_18_fix'] ); |
| 673 | if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) { |
| 674 | add_action( 'wp_enqueue_scripts', [$disable_gutenberg, 'disable_gutenberg_for_post_types_frontend'], 100 ); |
| 675 | } |
| 676 | } |
| 677 | } |
| 678 | // Disable Comments |
| 679 | if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) { |
| 680 | if ( array_key_exists( 'disable_comments_for', $options ) && !empty( $options['disable_comments_for'] ) ) { |
| 681 | $disable_comments = new ASENHA\Classes\Disable_Comments(); |
| 682 | add_action( 'admin_init', [$disable_comments, 'disable_comments_for_post_types_edit'] ); |
| 683 | // also work with 'init', 'admin_init', 'wp_loaded', 'do_meta_boxes' hooks |
| 684 | add_action( 'template_redirect', [$disable_comments, 'show_blank_comment_template'] ); |
| 685 | add_action( 'wp_loaded', [$disable_comments, 'hide_existing_comments_on_frontend'] ); |
| 686 | add_filter( |
| 687 | 'comments_array', |
| 688 | [$disable_comments, 'maybe_return_empty_comments'], |
| 689 | 20, |
| 690 | 2 |
| 691 | ); |
| 692 | add_filter( |
| 693 | 'comments_open', |
| 694 | [$disable_comments, 'close_comments_pings_on_frontend'], |
| 695 | 20, |
| 696 | 2 |
| 697 | ); |
| 698 | add_filter( |
| 699 | 'pings_open', |
| 700 | [$disable_comments, 'close_comments_pings_on_frontend'], |
| 701 | 20, |
| 702 | 2 |
| 703 | ); |
| 704 | add_filter( |
| 705 | 'get_comments_number', |
| 706 | [$disable_comments, 'return_zero_comments_count'], |
| 707 | 20, |
| 708 | 2 |
| 709 | ); |
| 710 | // Disable commenting via XML-RPC |
| 711 | add_filter( 'xmlrpc_allow_anonymous_comments', '__return_false' ); |
| 712 | add_filter( 'xmlrpc_methods', [$disable_comments, 'disable_xmlrpc_comments'] ); |
| 713 | // Disable commenting via REST API |
| 714 | add_filter( 'rest_endpoints', [$disable_comments, 'disable_rest_api_comments_endpoints'] ); |
| 715 | add_filter( |
| 716 | 'rest_pre_insert_comment', |
| 717 | [$disable_comments, 'return_blank_comment'], |
| 718 | 10, |
| 719 | 2 |
| 720 | ); |
| 721 | } |
| 722 | } |
| 723 | // Disable REST API |
| 724 | if ( array_key_exists( 'disable_rest_api', $options ) && $options['disable_rest_api'] ) { |
| 725 | if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) { |
| 726 | $disable_rest_api = new ASENHA\Classes\Disable_REST_API(); |
| 727 | add_filter( 'rest_authentication_errors', [$disable_rest_api, 'disable_rest_api'] ); |
| 728 | } else { |
| 729 | // REST API 1.x |
| 730 | add_filter( 'json_enabled', '__return_false' ); |
| 731 | add_filter( 'json_jsonp_enabled', '__return_false' ); |
| 732 | // REST API 2.x |
| 733 | add_filter( 'rest_enabled', '__return_false' ); |
| 734 | add_filter( 'rest_jsonp_enabled', '__return_false' ); |
| 735 | } |
| 736 | remove_action( 'wp_head', 'rest_output_link_wp_head', 10 ); |
| 737 | // Disable REST API links in HTML <head> |
| 738 | remove_action( |
| 739 | 'template_redirect', |
| 740 | 'rest_output_link_header', |
| 741 | 11, |
| 742 | 0 |
| 743 | ); |
| 744 | // Disable REST API link in HTTP headers |
| 745 | remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' ); |
| 746 | // Remove REST API URL from the WP RSD endpoint. |
| 747 | } |
| 748 | // Disable Feeds |
| 749 | if ( array_key_exists( 'disable_feeds', $options ) && $options['disable_feeds'] ) { |
| 750 | remove_action( 'wp_head', 'feed_links', 2 ); |
| 751 | // Remove feed links in <head> |
| 752 | remove_action( 'wp_head', 'feed_links_extra', 3 ); |
| 753 | // Remove feed links in <head> |
| 754 | remove_action( |
| 755 | 'do_feed_rdf', |
| 756 | 'do_feed_rdf', |
| 757 | 10, |
| 758 | 0 |
| 759 | ); |
| 760 | remove_action( |
| 761 | 'do_feed_rss', |
| 762 | 'do_feed_rss', |
| 763 | 10, |
| 764 | 0 |
| 765 | ); |
| 766 | remove_action( |
| 767 | 'do_feed_rss2', |
| 768 | 'do_feed_rss2', |
| 769 | 10, |
| 770 | 1 |
| 771 | ); |
| 772 | remove_action( |
| 773 | 'do_feed_atom', |
| 774 | 'do_feed_atom', |
| 775 | 10, |
| 776 | 1 |
| 777 | ); |
| 778 | $disable_feeds = new ASENHA\Classes\Disable_Feeds(); |
| 779 | add_action( |
| 780 | 'template_redirect', |
| 781 | [$disable_feeds, 'redirect_feed_to_403'], |
| 782 | 10, |
| 783 | 1 |
| 784 | ); |
| 785 | } |
| 786 | // Disable All Updates |
| 787 | if ( array_key_exists( 'disable_all_updates', $options ) && $options['disable_all_updates'] ) { |
| 788 | $disable_updates = new ASENHA\Classes\Disable_Updates(); |
| 789 | add_action( 'admin_init', [$disable_updates, 'disable_update_notices_version_checks'] ); |
| 790 | // Disable core update |
| 791 | add_filter( 'pre_transient_update_core', [$disable_updates, 'override_version_check_info'] ); |
| 792 | add_filter( 'pre_site_transient_update_core', [$disable_updates, 'override_version_check_info'] ); |
| 793 | // Disable theme updates |
| 794 | add_filter( 'pre_transient_update_themes', [$disable_updates, 'override_version_check_info'] ); |
| 795 | add_filter( 'pre_site_transient_update_themes', [$disable_updates, 'override_version_check_info'] ); |
| 796 | add_action( 'pre_set_site_transient_update_themes', [$disable_updates, 'override_version_check_info'], 20 ); |
| 797 | // Disable plugin updates |
| 798 | add_filter( 'pre_transient_update_plugins', [$disable_updates, 'override_version_check_info'] ); |
| 799 | add_filter( 'pre_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'] ); |
| 800 | add_action( 'pre_set_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'], 20 ); |
| 801 | // Disable auto updates |
| 802 | add_filter( 'automatic_updater_disabled', '__return_true' ); |
| 803 | if ( !defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) { |
| 804 | define( 'AUTOMATIC_UPDATER_DISABLED', true ); |
| 805 | } |
| 806 | if ( !defined( 'WP_AUTO_UPDATE_CORE' ) ) { |
| 807 | define( 'WP_AUTO_UPDATE_CORE', false ); |
| 808 | } |
| 809 | add_filter( 'auto_update_core', '__return_false' ); |
| 810 | add_filter( 'wp_auto_update_core', '__return_false' ); |
| 811 | add_filter( 'allow_minor_auto_core_updates', '__return_false' ); |
| 812 | add_filter( 'allow_major_auto_core_updates', '__return_false' ); |
| 813 | add_filter( 'allow_dev_auto_core_updates', '__return_false' ); |
| 814 | add_filter( 'auto_update_plugin', '__return_false' ); |
| 815 | add_filter( 'auto_update_theme', '__return_false' ); |
| 816 | add_filter( 'auto_update_translation', '__return_false' ); |
| 817 | remove_action( 'init', 'wp_schedule_update_checks' ); |
| 818 | // Disable update emails |
| 819 | add_filter( 'auto_core_update_send_email', '__return_false' ); |
| 820 | add_filter( 'send_core_update_notification_email', '__return_false' ); |
| 821 | add_filter( 'automatic_updates_send_debug_email', '__return_false' ); |
| 822 | // Remove Dashboard >> Updates menu |
| 823 | add_action( 'admin_menu', [$disable_updates, 'remove_updates_menu'] ); |
| 824 | } |
| 825 | // Disable Smaller Components |
| 826 | if ( array_key_exists( 'disable_smaller_components', $options ) && $options['disable_smaller_components'] ) { |
| 827 | $disable_smaller_components = new ASENHA\Classes\Disable_Smaller_Components(); |
| 828 | if ( array_key_exists( 'disable_head_generator_tag', $options ) && $options['disable_head_generator_tag'] ) { |
| 829 | remove_action( 'wp_head', 'wp_generator' ); |
| 830 | } |
| 831 | if ( array_key_exists( 'disable_feed_generator_tag', $options ) && $options['disable_feed_generator_tag'] ) { |
| 832 | add_filter( |
| 833 | 'the_generator', |
| 834 | [$disable_smaller_components, 'remove_feed_generator_tag'], |
| 835 | 10, |
| 836 | 2 |
| 837 | ); |
| 838 | } |
| 839 | if ( array_key_exists( 'disable_resource_version_number', $options ) && $options['disable_resource_version_number'] ) { |
| 840 | add_filter( 'style_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX ); |
| 841 | add_filter( 'script_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX ); |
| 842 | } |
| 843 | if ( array_key_exists( 'disable_head_wlwmanifest_tag', $options ) && $options['disable_head_wlwmanifest_tag'] ) { |
| 844 | remove_action( 'wp_head', 'wlwmanifest_link' ); |
| 845 | } |
| 846 | if ( array_key_exists( 'disable_head_rsd_tag', $options ) && $options['disable_head_rsd_tag'] ) { |
| 847 | remove_action( 'wp_head', 'rsd_link' ); |
| 848 | } |
| 849 | if ( array_key_exists( 'disable_head_shortlink_tag', $options ) && $options['disable_head_shortlink_tag'] ) { |
| 850 | remove_action( 'wp_head', 'wp_shortlink_wp_head' ); |
| 851 | remove_action( |
| 852 | 'template_redirect', |
| 853 | 'wp_shortlink_header', |
| 854 | 100, |
| 855 | 0 |
| 856 | ); |
| 857 | } |
| 858 | if ( array_key_exists( 'disable_frontend_dashicons', $options ) && $options['disable_frontend_dashicons'] ) { |
| 859 | add_action( 'init', [$disable_smaller_components, 'disable_dashicons_public_assets'] ); |
| 860 | } |
| 861 | if ( array_key_exists( 'disable_emoji_support', $options ) && $options['disable_emoji_support'] ) { |
| 862 | add_action( 'init', [$disable_smaller_components, 'disable_emoji_support'] ); |
| 863 | } |
| 864 | if ( array_key_exists( 'disable_jquery_migrate', $options ) && $options['disable_jquery_migrate'] ) { |
| 865 | add_action( 'wp_default_scripts', [$disable_smaller_components, 'disable_jquery_migrate'] ); |
| 866 | } |
| 867 | if ( array_key_exists( 'disable_block_widgets', $options ) && $options['disable_block_widgets'] ) { |
| 868 | // Disables the block editor from managing widgets in the Gutenberg plugin. |
| 869 | add_filter( 'gutenberg_use_widgets_block_editor', '__return_false' ); |
| 870 | // Disables the block editor from managing widgets. |
| 871 | add_filter( 'use_widgets_block_editor', '__return_false' ); |
| 872 | } |
| 873 | if ( array_key_exists( 'disable_lazy_load', $options ) && $options['disable_lazy_load'] ) { |
| 874 | add_filter( 'wp_lazy_loading_enabled', '__return_false' ); |
| 875 | add_filter( 'wp_get_attachment_image_attributes', [$disable_smaller_components, 'eager_load_featured_images'] ); |
| 876 | } |
| 877 | if ( array_key_exists( 'disable_application_passwords', $options ) && $options['disable_application_passwords'] ) { |
| 878 | add_filter( 'wp_is_application_passwords_available', '__return_false' ); |
| 879 | } |
| 880 | if ( array_key_exists( 'disable_plugin_theme_editor', $options ) ) { |
| 881 | if ( $options['disable_plugin_theme_editor'] ) { |
| 882 | add_action( 'admin_init', [$disable_smaller_components, 'disable_plugin_theme_editor'], PHP_INT_MAX ); |
| 883 | } else { |
| 884 | add_action( 'admin_init', [$disable_smaller_components, 'enable_plugin_theme_editor'], PHP_INT_MAX ); |
| 885 | } |
| 886 | } |
| 887 | } |
| 888 | // ================================================================= |
| 889 | // SECURITY |
| 890 | // ================================================================= |
| 891 | // Limit Login Attempts |
| 892 | if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) { |
| 893 | $limit_login_attempts = new ASENHA\Classes\Limit_Login_Attempts(); |
| 894 | add_filter( |
| 895 | 'authenticate', |
| 896 | [$limit_login_attempts, 'maybe_allow_login'], |
| 897 | 999, |
| 898 | 3 |
| 899 | ); |
| 900 | // Very low priority so it is processed last |
| 901 | add_action( |
| 902 | 'wp_login_errors', |
| 903 | [$limit_login_attempts, 'login_error_handler'], |
| 904 | 999, |
| 905 | 2 |
| 906 | ); |
| 907 | add_action( 'login_enqueue_scripts', [$limit_login_attempts, 'maybe_hide_login_form'] ); |
| 908 | add_filter( 'login_message', [$limit_login_attempts, 'add_failed_login_message'] ); |
| 909 | add_action( 'wp_login_failed', [$limit_login_attempts, 'log_failed_login'], 5 ); |
| 910 | // Higher priority than one in Change Login URL |
| 911 | add_action( 'wp_login', [$limit_login_attempts, 'clear_failed_login_log'] ); |
| 912 | // Log table clean up |
| 913 | add_action( 'added_option', [$limit_login_attempts, 'trigger_clear_or_schedule_log_clean_up_by_amount'] ); |
| 914 | add_action( 'updated_option', [$limit_login_attempts, 'trigger_clear_or_schedule_log_clean_up_by_amount'] ); |
| 915 | add_action( 'plugins_loaded', [$limit_login_attempts, 'clear_or_schedule_log_clean_up_by_amount'] ); |
| 916 | add_action( 'asenha_failed_login_attempts_log_cleanup_by_amount', [$limit_login_attempts, 'perform_failed_login_attempts_log_clean_up_by_amount'] ); |
| 917 | } |
| 918 | // Obfuscate Author Slugs |
| 919 | if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) { |
| 920 | $obfuscate_author_slugs = new ASENHA\Classes\Obfuscate_Author_Slugs(); |
| 921 | add_action( 'pre_get_posts', [$obfuscate_author_slugs, 'alter_author_query'], 10 ); |
| 922 | add_filter( |
| 923 | 'author_link', |
| 924 | [$obfuscate_author_slugs, 'alter_author_link'], |
| 925 | 10, |
| 926 | 3 |
| 927 | ); |
| 928 | add_filter( |
| 929 | 'rest_prepare_user', |
| 930 | [$obfuscate_author_slugs, 'alter_json_users'], |
| 931 | 10, |
| 932 | 3 |
| 933 | ); |
| 934 | } |
| 935 | // Email Address Obfuscator |
| 936 | if ( array_key_exists( 'obfuscate_email_address', $options ) && $options['obfuscate_email_address'] ) { |
| 937 | $email_address_obfuscator = new ASENHA\Classes\Email_Address_Obfuscator(); |
| 938 | add_shortcode( 'obfuscate', [$email_address_obfuscator, 'obfuscate_string'] ); |
| 939 | add_filter( 'safe_style_css', [$email_address_obfuscator, 'add_additional_attributes_to_safe_css'] ); |
| 940 | add_filter( 'widget_text', 'shortcode_unautop' ); |
| 941 | add_filter( 'widget_text', 'do_shortcode' ); |
| 942 | } |
| 943 | // Disable XML-RPC |
| 944 | if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) { |
| 945 | $disable_xml_rpc = new ASENHA\Classes\Disable_XML_RPC(); |
| 946 | add_filter( 'xmlrpc_enabled', '__return_false' ); |
| 947 | add_action( 'wp', [$disable_xml_rpc, 'remove_xmlrpc_link'], 11 ); |
| 948 | add_filter( 'xmlrpc_methods', [$disable_xml_rpc, 'remove_xmlrpc_methods'] ); |
| 949 | add_filter( 'wp_xmlrpc_server_class', [$disable_xml_rpc, 'maybe_disable_xmlrpc'] ); |
| 950 | // Hide xmlrpc.php in HTTP response headers |
| 951 | add_filter( 'wp_headers', [$disable_xml_rpc, 'hide_xmlrpc_in_http_response_headers'] ); |
| 952 | add_filter( 'pings_open', '__return_false', PHP_INT_MAX ); |
| 953 | } |
| 954 | // ================================================================= |
| 955 | // OPTIMIZATIONS |
| 956 | // ================================================================= |
| 957 | // Image Upload Control |
| 958 | if ( array_key_exists( 'image_upload_control', $options ) && $options['image_upload_control'] ) { |
| 959 | $image_upload_control = new ASENHA\Classes\Image_Upload_Control(); |
| 960 | // Fix image rotation. Ref: https://plugins.trac.wordpress.org/browser/fix-image-rotation/tags/2.2.2/includes/class-fix-image-rotation.php |
| 961 | if ( extension_loaded( 'exif' ) && function_exists( 'exif_read_data' ) ) { |
| 962 | add_filter( |
| 963 | 'wp_handle_upload_prefilter', |
| 964 | [$image_upload_control, 'prefilter_maybe_fix_image_orientation'], |
| 965 | 10, |
| 966 | 1 |
| 967 | ); |
| 968 | add_filter( |
| 969 | 'wp_handle_upload', |
| 970 | [$image_upload_control, 'maybe_fix_image_orientation'], |
| 971 | 1, |
| 972 | 3 |
| 973 | ); |
| 974 | } |
| 975 | // Resize and convert happens here |
| 976 | add_filter( 'wp_handle_upload', [$image_upload_control, 'image_upload_handler'] ); |
| 977 | if ( array_key_exists( 'disabled_image_sizes', $options ) && isset( $options['disabled_image_sizes'] ) ) { |
| 978 | add_filter( |
| 979 | 'intermediate_image_sizes_advanced', |
| 980 | [$image_upload_control, 'disable_intermediate_image_sizes__premium_only'], |
| 981 | 10, |
| 982 | 2 |
| 983 | ); |
| 984 | } |
| 985 | } |
| 986 | // Revisions Control |
| 987 | if ( array_key_exists( 'enable_revisions_control', $options ) && $options['enable_revisions_control'] ) { |
| 988 | $revisions_control = new ASENHA\Classes\Revisions_Control(); |
| 989 | add_filter( |
| 990 | 'wp_revisions_to_keep', |
| 991 | [$revisions_control, 'limit_revisions_to_max_number'], |
| 992 | 10, |
| 993 | 2 |
| 994 | ); |
| 995 | } |
| 996 | // Heartbeat Control |
| 997 | if ( array_key_exists( 'enable_heartbeat_control', $options ) && $options['enable_heartbeat_control'] ) { |
| 998 | $heartbeat_control = new ASENHA\Classes\Heartbeat_Control(); |
| 999 | add_filter( |
| 1000 | 'heartbeat_settings', |
| 1001 | [$heartbeat_control, 'maybe_modify_heartbeat_frequency'], |
| 1002 | 99, |
| 1003 | 2 |
| 1004 | ); |
| 1005 | add_action( 'admin_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 ); |
| 1006 | add_action( 'wp_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 ); |
| 1007 | } |
| 1008 | // ================================================================= |
| 1009 | // UTILITIES |
| 1010 | // ================================================================= |
| 1011 | // SMTP Email Delivery |
| 1012 | if ( array_key_exists( 'smtp_email_delivery', $options ) && $options['smtp_email_delivery'] ) { |
| 1013 | $email_delivery = new ASENHA\Classes\Email_Delivery(); |
| 1014 | add_action( 'phpmailer_init', [$email_delivery, 'deliver_email_via_smtp'], 99999 ); |
| 1015 | add_action( 'wp_ajax_send_test_email', [$email_delivery, 'send_test_email'] ); |
| 1016 | } |
| 1017 | // Multiple User Roles |
| 1018 | if ( array_key_exists( 'multiple_user_roles', $options ) && $options['multiple_user_roles'] ) { |
| 1019 | $multiple_user_roles = new ASENHA\Classes\Multiple_User_Roles(); |
| 1020 | // Show roles checkboxes |
| 1021 | add_action( 'show_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] ); |
| 1022 | // for when user edits their own profile |
| 1023 | add_action( 'edit_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] ); |
| 1024 | // for when editing other user's profile |
| 1025 | add_action( 'user_new_form', [$multiple_user_roles, 'add_multiple_roles_ui'] ); |
| 1026 | // new user creation |
| 1027 | // Save roles selections |
| 1028 | add_action( 'personal_options_update', [$multiple_user_roles, 'save_roles_assignment'] ); |
| 1029 | // for when user edits their own profile |
| 1030 | add_action( 'edit_user_profile_update', [$multiple_user_roles, 'save_roles_assignment'] ); |
| 1031 | // for when editing other user's profile |
| 1032 | add_action( 'user_register', [$multiple_user_roles, 'save_roles_assignment'] ); |
| 1033 | // new user creation |
| 1034 | } |
| 1035 | // Image Sizes Panel |
| 1036 | if ( array_key_exists( 'image_sizes_panel', $options ) && $options['image_sizes_panel'] ) { |
| 1037 | $image_sizes_panel = new ASENHA\Classes\Image_Sizes_Panel(); |
| 1038 | add_action( 'add_meta_boxes', array($image_sizes_panel, 'add_image_sizes_meta_box') ); |
| 1039 | } |
| 1040 | // View Admin as Role |
| 1041 | if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) { |
| 1042 | $view_admin_as_role = new ASENHA\Classes\View_Admin_As_Role(); |
| 1043 | add_action( 'admin_bar_menu', [$view_admin_as_role, 'view_admin_as_admin_bar_menu'], 8 ); |
| 1044 | // Priority 8 so it is next to username section |
| 1045 | add_action( 'init', [$view_admin_as_role, 'role_switcher_to_view_admin_as'] ); |
| 1046 | add_action( 'profile_update', [$view_admin_as_role, 'maybe_prevent_switchback_to_administrator'], 20 ); |
| 1047 | // add_action( 'wp_die_handler', [ $view_admin_as_role, 'custom_error_page_on_switch_failure' ] ); |
| 1048 | add_action( 'admin_footer', [$view_admin_as_role, 'add_floating_reset_button'] ); |
| 1049 | } |
| 1050 | // Password Protection |
| 1051 | if ( array_key_exists( 'enable_password_protection', $options ) && $options['enable_password_protection'] ) { |
| 1052 | $password_protection = new ASENHA\Classes\Password_Protection(); |
| 1053 | add_action( 'plugins_loaded', [$password_protection, 'show_password_protection_admin_bar_icon'] ); |
| 1054 | add_action( 'init', [$password_protection, 'maybe_disable_page_caching'], 1 ); |
| 1055 | add_action( 'template_redirect', [$password_protection, 'maybe_show_login_form'], 0 ); |
| 1056 | // load early |
| 1057 | add_action( 'init', [$password_protection, 'maybe_process_login'], 1 ); |
| 1058 | add_action( 'asenha_password_protection_error_messages', [$password_protection, 'add_login_error_messages'] ); |
| 1059 | if ( function_exists( 'wp_site_icon' ) ) { |
| 1060 | // WP v4.3+ |
| 1061 | add_action( 'asenha_password_protection_login_head', 'wp_site_icon' ); |
| 1062 | } |
| 1063 | } |
| 1064 | // Maintenance Mode |
| 1065 | if ( array_key_exists( 'maintenance_mode', $options ) && $options['maintenance_mode'] ) { |
| 1066 | $maintenance_mode = new ASENHA\Classes\Maintenance_Mode(); |
| 1067 | add_action( 'send_headers', [$maintenance_mode, 'maintenance_mode_redirect'] ); |
| 1068 | add_action( 'plugins_loaded', [$maintenance_mode, 'show_maintenance_mode_admin_bar_icon'] ); |
| 1069 | } |
| 1070 | // Redirect 404 to Homepage |
| 1071 | if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) { |
| 1072 | $redirect_fourofour = new ASENHA\Classes\Redirect_Fourofour(); |
| 1073 | add_filter( 'template_redirect', [$redirect_fourofour, 'redirect_404'], PHP_INT_MAX ); |
| 1074 | } |
| 1075 | // Display System Summary |
| 1076 | if ( array_key_exists( 'display_system_summary', $options ) && $options['display_system_summary'] ) { |
| 1077 | // require_once ASENHA_PATH . 'includes/premium/display-system-summary/ignore-directories.php'; |
| 1078 | $display_system_summary = new ASENHA\Classes\Display_System_Summary(); |
| 1079 | add_action( 'rightnow_end', [$display_system_summary, 'display_system_summary'] ); |
| 1080 | } |
| 1081 | // Search Engines Visibility Status |
| 1082 | if ( array_key_exists( 'search_engine_visibility_status', $options ) && $options['search_engine_visibility_status'] ) { |
| 1083 | $search_engines_visibility = new ASENHA\Classes\Search_Engines_Visibility(); |
| 1084 | add_action( 'admin_init', [$search_engines_visibility, 'maybe_display_search_engine_visibility_status'] ); |
| 1085 | } |
| 1086 | } |
| 1087 | |
| 1088 | } |
| 1089 | |
| 1090 | Admin_Site_Enhancements::get_instance(); |