PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 2.7.0
Admin and Site Enhancements (ASE) v2.7.0
9.1.0 9.0.2 9.0.1 9.0.0 8.9.2 8.9.1 8.9.0 8.8.8 8.8.7 8.8.6 8.8.5 8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.3 8.7.2 8.7.1 8.2.1 8.2.2 8.2.3 8.3.0 8.3.1 8.3.2 8.4.0 8.4.1 8.4.2 8.5.0 8.5.1 8.5.2 8.6.0 8.6.1 8.6.2 8.7.0 5.0.1 5.0.2 5.0.2.1 5.0.2.2 5.0.2.3 5.0.2.4 5.1.0 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.8.0 5.8.1 6.0.0 6.0.3 6.0.4 6.0.5 6.0.5.1 6.0.6 6.0.7 6.0.8.1 6.1.0 6.1.3 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.3.0 6.3.1 6.3.2 6.4.0 6.5.0 6.5.1 6.6.0 6.7.0 6.8.0 6.8.2 6.8.3 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13.1 6.9.13.2 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.2 7.0.2.1 7.0.2.2 7.0.2.3 7.0.3 7.1.0 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2.0 7.2.1 7.3.0 7.3.1 7.3.2 7.3.3 7.4.0 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.5.0 7.5.1 7.5.2 7.5.3 7.5.4 7.6.0 7.6.1 7.6.1.1 7.6.10 7.6.11 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.6.7 7.6.7.1 7.6.8 7.6.9 7.7.0 7.8.0 7.8.1 7.8.10 7.8.11 7.8.12 7.8.13 7.8.14 7.8.15 7.8.16 7.8.17 7.8.18 7.8.2 7.8.3 7.8.4 7.8.5 7.8.5.1 7.8.6 7.8.7 7.8.8 7.8.9 7.9.0 7.9.1 7.9.10 7.9.11 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.9.8 7.9.9 8.0.0 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.0.6 8.0.7 8.0.8 8.1.0 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 trunk 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 2.0.0 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 2.6.0 2.7.0 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.2.0 3.3.0 3.4.0 3.5.0 3.6.1 3.7.0 3.8.0 3.9.0 3.9.1 3.9.2 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.1 4.8.2 4.8.3 4.9.0 4.9.1 4.9.2 4.9.3 5.0.0
admin-site-enhancements / bootstrap.php
admin-site-enhancements Last commit date
assets 3 years ago classes 3 years ago vendor 3 years ago LICENSE.md 3 years ago README.md 3 years ago admin-site-enhancements.php 3 years ago bootstrap.php 3 years ago settings.php 3 years ago
bootstrap.php
294 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 /**
9 * Main class of the plugin used to add functionalities
10 *
11 * @since 1.0.0
12 */
13 class Admin_Site_Enhancements {
14
15 // Refers to a single instance of this class
16 private static $instance = null;
17
18 /**
19 * Creates or returns a single instance of this class
20 *
21 * @return Admin_Site_Enhancements a single instance of this class
22 * @since 1.0.0
23 */
24 public static function get_instance() {
25
26 if ( null == self::$instance ) {
27
28 self::$instance = new self;
29
30 }
31
32 return self::$instance;
33
34 }
35
36 /**
37 * Initialize plugin functionalities
38 */
39 private function __construct() {
40
41 // Setup admin menu, admin page, settings, settings sections, sections fields, admin scripts, plugin action links, etc.
42
43 // Register admin menu and add the settings page.
44 add_action( 'admin_menu', 'asenha_register_admin_menu' );
45
46 // Register plugin settings
47
48 // Instantiate object for registration of settings section and fields
49 $settings = new ASENHA\Classes\Settings_Sections_Fields;
50
51 add_action( 'admin_init', [ $settings, 'register_sections_fields' ] );
52
53 // Suppress all notices on the plugin's main page. Then add notification for successful settings update.
54 add_action( 'admin_notices', 'asenha_suppress_notices', 5 );
55 add_action( 'all_admin_notices', 'asenha_suppress_generic_notices', 5 );
56
57 // Enqueue admin scripts and styles only on the plugin's main page
58 add_action( 'admin_enqueue_scripts', 'asenha_admin_scripts' );
59
60 // Add action links in plugins page
61 add_filter( 'plugin_action_links_' . ASENHA_SLUG . '/' . ASENHA_SLUG . '.php', 'asenha_plugin_action_links' );
62
63 // Update footer text
64 add_filter( 'admin_footer_text', 'asenha_footer_text' );
65
66 // ===== Activate features based on settings =====
67
68 // Get all WP Enhancements options, default to empty array in case it's not been created yet
69 $options = get_option( ASENHA_SLUG_U, array() );
70
71 // ===== CONTENT MANAGEMENT =====
72
73 // Instantiate object for Content Management features
74 $content_management = new ASENHA\Classes\Content_Management;
75
76 // Content Management >> Enable Page and Post Duplication
77 if ( array_key_exists( 'enable_duplication', $options ) && $options['enable_duplication'] ) {
78 add_action( 'admin_action_asenha_enable_duplication', [ $content_management, 'asenha_enable_duplication' ] );
79 add_filter( 'page_row_actions', [ $content_management, 'add_duplication_action_link' ], 10, 2 );
80 add_filter( 'post_row_actions', [ $content_management, 'add_duplication_action_link' ], 10, 2 );
81 }
82
83 // Content Management >> Enable Media Replacement
84 if ( array_key_exists( 'enable_media_replacement', $options ) && $options['enable_media_replacement'] ) {
85 add_filter( 'media_row_actions', [ $content_management, 'modify_media_list_table_edit_link' ], 10, 2 );
86 add_filter( 'attachment_fields_to_edit', [ $content_management, 'add_media_replacement_button' ] );
87 add_action( 'edit_attachment', [ $content_management, 'replace_media' ] );
88 add_filter( 'post_updated_messages', [ $content_management, 'attachment_updated_custom_message' ] );
89 }
90
91 // Content Management >> Enable SVG Upload
92 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'] ) ) {
93
94 global $roles_svg_upload_enabled;
95
96 $enable_svg_upload = $options['enable_svg_upload'];
97 $for_roles = $options['enable_svg_upload_for'];
98
99 // User has role(s). Do further checks.
100 if ( isset( $for_roles ) && ( count( $for_roles ) > 0 ) ) {
101
102 // Assemble single-dimensional array of roles for which SVG upload would be enabled
103 $roles_svg_upload_enabled = array();
104 foreach( $for_roles as $role_slug => $svg_upload_enabled ) {
105 if ( $svg_upload_enabled ) {
106 $roles_svg_upload_enabled[] = $role_slug;
107 }
108 }
109
110 }
111
112 add_filter( 'upload_mimes', [ $content_management, 'add_svg_mime' ] );
113 add_filter( 'wp_check_filetype_and_ext', [ $content_management, 'confirm_file_type_is_svg' ], 10, 4 );
114 add_filter( 'wp_handle_upload_prefilter', [ $content_management, 'sanitize_and_maybe_allow_svg_upload' ] );
115 add_filter( 'wp_generate_attachment_metadata', [ $content_management, 'generate_svg_metadata' ], 10, 3 );
116 add_action( 'wp_ajax_svg_get_attachment_url', [ $content_management, 'get_svg_attachment_url' ] );
117 add_filter( 'wp_prepare_attachment_for_js', [ $content_management, 'get_svg_url_in_media_library' ] );
118 }
119
120
121 // Content Management >> Enhance List Tables
122 if ( array_key_exists( 'enhance_list_tables', $options ) && $options['enhance_list_tables'] ) {
123
124 // Show Featured Image Column
125 if ( array_key_exists( 'show_featured_image_column', $options ) && $options['show_featured_image_column'] ) {
126 add_action( 'admin_init', [ $content_management, 'show_featured_image_column' ] );
127 }
128
129 // Show Excerpt Column
130 if ( array_key_exists( 'show_excerpt_column', $options ) && $options['show_excerpt_column'] ) {
131 add_action( 'admin_init', [ $content_management, 'show_excerpt_column' ] );
132 }
133
134 // Show ID Column
135 if ( array_key_exists( 'show_id_column', $options ) && $options['show_id_column'] ) {
136 add_action( 'admin_init', [ $content_management, 'show_id_column' ] );
137 }
138
139 // Hide Comments Column
140 if ( array_key_exists( 'hide_comments_column', $options ) && $options['hide_comments_column'] ) {
141 add_action( 'admin_init', [ $content_management, 'hide_comments_column' ] );
142 }
143
144 // Hide Post Tags Column
145 if ( array_key_exists( 'hide_post_tags_column', $options ) && $options['hide_post_tags_column'] ) {
146 add_action( 'admin_init', [ $content_management, 'hide_post_tags_column' ] );
147 }
148
149 // Show Custom Taxonomy Filters
150 if ( array_key_exists( 'show_custom_taxonomy_filters', $options ) && $options['show_custom_taxonomy_filters'] ) {
151 add_action( 'restrict_manage_posts', [ $content_management, 'show_custom_taxonomy_filters' ] );
152 }
153
154 }
155
156 // ===== ADMIN INTERFACE =====
157
158 // Instantiate object for Admin Interface features
159 $admin_interface = new ASENHA\Classes\Admin_Interface;
160
161 // Admin Interface >> Hide Admin Notices
162 if ( array_key_exists( 'hide_admin_notices', $options ) && $options['hide_admin_notices'] ) {
163 add_action( 'all_admin_notices', [ $admin_interface, 'admin_notices_wrapper' ] );
164 add_action( 'admin_bar_menu', [ $admin_interface, 'admin_notices_menu' ] );
165 add_action( 'admin_enqueue_scripts', [ $admin_interface, 'admin_notices_menu_inline_css' ] ); // wp-admin
166 }
167
168 // Admin Interface >> Hide Admin Bar
169 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'] ) ) {
170 add_filter( 'show_admin_bar', [ $admin_interface, 'hide_admin_bar_for_roles' ] );
171 }
172
173 // Admin Interface >> View Admin as Role
174 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
175 add_action( 'admin_bar_menu', [ $admin_interface, 'view_admin_as_admin_bar_menu' ], 8 ); // Priority 8 so it is next to username section
176 add_action( 'init', [ $admin_interface, 'role_switcher_to_view_admin_as' ] );
177 add_action( 'wp_die_handler', [ $admin_interface, 'custom_error_page_on_switch_failure' ] );
178 }
179
180 // Admin Interface >> Hide or Modify Elements
181 if ( array_key_exists( 'hide_modify_elements', $options ) && $options['hide_modify_elements'] ) {
182 add_filter( 'admin_bar_menu', [ $admin_interface, 'modify_admin_bar_menu' ], 5 ); // priority 5 to execute earlier than the normal 10
183 }
184
185 // Admin Interface >> Customize Admin Menu
186
187 // Load jQuery UI sortables scripts regardless of whether Customize Admin Menu is enabled or not. This is needed to enable sorting upon clicking the feature toggle.
188 add_action( 'admin_enqueue_scripts', [ $admin_interface, 'enqueue_jquery_ui_sortables_scripts' ] );
189
190 if ( array_key_exists( 'customize_admin_menu', $options ) && $options['customize_admin_menu'] ) {
191 // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_interface, 'save_custom_menu_order' ] );
192 // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_interface, 'save_hidden_menu_items' ] );
193 add_filter( 'custom_menu_order', '__return_true' );
194 add_filter( 'menu_order', [ $admin_interface, 'render_custom_menu_order' ] );
195 add_action( 'admin_menu', [ $admin_interface, 'hide_menu_items' ], 999 );
196 add_action( 'admin_menu', [ $admin_interface, 'add_hidden_menu_toggle' ] );
197 add_action( 'admin_enqueue_scripts', [ $admin_interface, 'enqueue_toggle_hidden_menu_script' ] );
198 }
199
200 // ===== SECURITY =====
201
202 // Instantiate object for Security features
203 $security = new ASENHA\Classes\Security;
204
205 // Security >> Change Login URL
206 if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) {
207 if ( array_key_exists( 'custom_login_slug', $options ) && ! empty( $options['custom_login_slug'] ) ) {
208 add_action( 'init', [ $security, 'redirect_on_custom_login_url' ] );
209 add_action( 'login_head', [ $security, 'redirect_on_default_login_urls' ] );
210 add_action( 'wp_login_failed', [ $security, 'redirect_to_custom_login_url_on_login_fail' ] );
211 add_action( 'wp_logout', [ $security, 'redirect_to_custom_login_url_on_logout_success' ] );
212 }
213 }
214
215 // Security >> Limit Login Attempts
216 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
217 add_filter( 'authenticate', [ $security, 'maybe_allow_login' ], 999, 3 ); // Very low priority so it is processed last
218 add_action( 'login_enqueue_scripts', [ $security, 'maybe_hide_login_form' ] );
219 add_action( 'wp_login_failed', [ $security, 'log_failed_login' ], 5 ); // Higher priority than one in Change Login URL
220 add_action( 'wp_login_errors', [ $security, 'login_error_handler' ], 999, 2 );
221 add_filter( 'login_message', [ $security, 'add_failed_login_message' ] );
222 add_action( 'wp_login', [ $security, 'clear_failed_login_log' ] );
223 }
224
225 // Security >> Obfuscate Author Slugs
226 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
227 add_action( 'pre_get_posts', [ $security, 'alter_author_query' ], 10 );
228 add_filter( 'author_link', [ $security, 'alter_author_link' ], 10, 3 );
229 add_filter( 'rest_prepare_user', [ $security, 'alter_json_users' ], 10, 3 );
230 }
231
232 // Security >> Disable XML-RPC
233 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
234 add_filter( 'xmlrpc_enabled', '__return_false' );
235 add_filter( 'wp_xmlrpc_server_class', [ $security, 'maybe_disable_xmlrpc' ] );
236 }
237
238 // ===== UTILITIES ======
239
240 // Instantiate object for Utilities features
241 $utilities = new ASENHA\Classes\Utilities;
242
243 // Utilities >> Redirect After Login
244 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
245 if ( array_key_exists( 'redirect_after_login_to_slug', $options ) && ! empty( $options['redirect_after_login_to_slug'] ) ) {
246 if ( array_key_exists( 'redirect_after_login_for', $options ) && ! empty( $options['redirect_after_login_for'] ) ) {
247 add_filter( 'wp_login', [ $utilities, 'redirect_for_roles_after_login' ], 5, 2 );
248 }
249 }
250 }
251
252 // Utilities >> Redirect After Logout
253 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
254 if ( array_key_exists( 'redirect_after_logout_to_slug', $options ) && ! empty( $options['redirect_after_logout_to_slug'] ) ) {
255 if ( array_key_exists( 'redirect_after_logout_for', $options ) && ! empty( $options['redirect_after_logout_for'] ) ) {
256 add_action( 'wp_logout', [ $utilities, 'redirect_after_logout' ], 5, 1 ); // load earlier than Change Login URL add_action
257 }
258 }
259 }
260
261 // Utilities >> Redirect 404 to Homepage
262 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
263 add_filter( 'wp', [ $utilities, 'redirect_404_to_homepage' ] );
264 }
265
266 // Utilities >> Enable Custom Admin / Frontend CSS
267
268 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
269 add_filter( 'admin_enqueue_scripts', [ $utilities, 'custom_admin_css' ] );
270 }
271
272 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
273 add_filter( 'wp_enqueue_scripts', [ $utilities, 'custom_frontend_css' ] );
274 }
275
276 // ===== DISABLE COMPONENTS ======
277
278 // Instantiate object for Disable Components features
279 $disable_components = new ASENHA\Classes\Disable_Components;
280
281 // Disable Components >> Disable Comments
282 if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) {
283 if ( array_key_exists( 'disable_comments_for', $options ) && ! empty( $options['disable_comments_for'] ) ) {
284 add_action( 'wp_loaded', [ $disable_components, 'disable_comments_for_post_types_edit' ] ); // also work with 'init' and 'admin_init' hooks
285 add_filter( 'comments_array', [ $disable_components, 'hide_existing_comments_on_frontend' ], 10, 2 ); // hide comments
286 add_filter( 'comments_open', [ $disable_components, 'close_commenting_on_frontend' ] ); // close commenting
287 }
288 }
289
290 }
291
292 }
293
294 Admin_Site_Enhancements::get_instance();