PluginProbe ʕ •ᴥ•ʔ
Permalink Manager Lite / 2.4.3.3
Permalink Manager Lite v2.4.3.3
2.5.4 2.5.3.4 2.2.18 2.2.19.2 2.2.19.3 2.2.19.3.1 2.2.2 2.2.20 2.2.20.1 2.2.20.3 2.2.4 2.2.5 2.2.6 2.2.7.2 2.2.7.3 2.2.7.5 2.2.7.6 2.2.8.4 2.2.8.5 2.2.8.6 2.2.8.7 2.2.8.9 2.2.9.1 2.2.9.2 2.2.9.2.1 2.2.9.3 2.2.9.4 2.2.9.6 2.2.9.7 2.2.9.9 2.3.0 2.3.1.1 2.4.0 2.4.1 2.4.1.2 2.4.1.3 2.4.1.4 2.4.1.5 2.4.1.6 2.4.2 2.4.2.1 2.4.3 2.4.3.1 2.4.3.2 2.4.3.3 2.4.3.4 2.4.4 2.4.4.1 2.4.4.2 2.4.4.3 2.5.0 2.5.1 2.5.1.1 2.5.1.2 2.5.1.3 2.5.1.4 2.5.2 2.5.2.1 2.5.2.2 2.5.2.3 2.5.2.4 2.5.3 2.5.3.1 2.5.3.2 2.5.3.3 trunk 0.2 0.3 0.3.1 0.3.2 0.3.3 0.3.4 0.4 0.4.1 0.4.2 0.4.3 0.4.4 0.4.6 0.4.7 0.4.8 0.4.9 0.5.3 0.5.4 1.0.0 1.0.1 1.0.4 1.1.0 1.1.1 1.1.2 1.11.6.3 2.0.0 2.0.3 2.0.4 2.0.4.3 2.0.5.1 2.0.5.2 2.0.5.3 2.0.5.3.1 2.0.5.4 2.0.5.4a 2.0.5.5 2.0.5.6 2.0.5.6.1 2.0.5.7 2.0.5.9a 2.0.6.2.1 2.0.6.2a 2.0.6.3 2.1.0 2.1.1 2.1.2.4 2.2.0 2.2.1.1 2.2.1.2 2.2.11 2.2.12 2.2.13.1 2.2.14 2.2.15.1 2.2.16 2.2.17
permalink-manager / includes / core / permalink-manager-admin-functions.php
permalink-manager / includes / core Last commit date
permalink-manager-actions.php 2 years ago permalink-manager-admin-functions.php 2 years ago permalink-manager-core-functions.php 2 years ago permalink-manager-debug.php 2 years ago permalink-manager-gutenberg.php 2 years ago permalink-manager-helper-functions.php 2 years ago permalink-manager-uri-functions-post.php 2 years ago permalink-manager-uri-functions.php 2 years ago
permalink-manager-admin-functions.php
402 lines
1 <?php
2
3 /**
4 * Additional functions related to WordPress Admin Dashboard UI
5 */
6 class Permalink_Manager_Admin_Functions {
7
8 public $menu_name, $sections, $active_section, $active_subsection;
9
10 public function __construct() {
11 add_action( 'admin_menu', array( $this, 'add_menu_page' ) );
12 add_action( 'admin_init', array( $this, 'init' ) );
13 add_action( 'admin_bar_menu', array( $this, 'fix_customize_url' ), 41 );
14
15 add_action( 'admin_notices', array( $this, 'display_plugin_notices' ) );
16 add_action( 'admin_notices', array( $this, 'display_global_notices' ) );
17 }
18
19 /**
20 * Hooks that should be triggered with "admin_init"
21 */
22 public function init() {
23 // Additional links in "Plugins" page
24 add_filter( "plugin_action_links_" . PERMALINK_MANAGER_BASENAME, array( $this, "plugins_page_links" ) );
25 add_filter( "plugin_row_meta", array( $this, "plugins_page_meta" ), 10, 2 );
26
27 // Detect current section
28 $this->sections = apply_filters( 'permalink_manager_sections', array() );
29 $this->get_current_section();
30 }
31
32 /**
33 * Use the native URL for "Customize" button in the admin bar
34 *
35 * @param WP_Admin_Bar $wp_admin_bar
36 */
37 public function fix_customize_url( $wp_admin_bar ) {
38 global $permalink_manager_ignore_permalink_filters;
39
40 $object = get_queried_object();
41 $customize = $wp_admin_bar->get_node( 'customize' );
42
43 if ( empty( $customize->href ) ) {
44 return;
45 }
46
47 $permalink_manager_ignore_permalink_filters = true;
48 if ( ! empty( $object->ID ) && is_a( $object, 'WP_Post' ) ) {
49 $new_url = get_permalink( $object->ID );
50 } else if ( ! empty( $object->taxonomy ) && is_a( $object, 'WP_Term' ) ) {
51 $new_url = get_term_link( $object, $object->taxonomy );
52 }
53 $permalink_manager_ignore_permalink_filters = false;
54
55 if ( ! empty( $new_url ) ) {
56 $new_url = urlencode_deep( $new_url );
57 $customize_url = preg_replace( '/url=([^&]+)/', "url={$new_url}", $customize->href );
58
59 $wp_admin_bar->add_node( array(
60 'id' => 'customize',
61 'href' => $customize_url,
62 ) );
63 }
64 }
65
66 /**
67 * Get current section of Permalink Manager admin panel
68 */
69 public function get_current_section() {
70 global $active_section, $active_subsection, $current_admin_tax;
71
72 // 1. Get current section
73 if ( isset( $_GET['page'] ) && $_GET['page'] == PERMALINK_MANAGER_PLUGIN_SLUG ) {
74 if ( isset( $_POST['section'] ) ) {
75 $this->active_section = sanitize_title_with_dashes( $_POST['section'] );
76 } else if ( isset( $_GET['section'] ) ) {
77 $this->active_section = sanitize_title_with_dashes( $_GET['section'] );
78 } else {
79 $sections_names = array_keys( $this->sections );
80 $this->active_section = $sections_names[0];
81 }
82 }
83
84 // 2. Get current subsection
85 if ( $this->active_section && isset( $this->sections[ $this->active_section ]['subsections'] ) ) {
86 if ( isset( $_POST['subsection'] ) ) {
87 $this->active_subsection = sanitize_title_with_dashes( $_POST['subsection'] );
88 } else if ( isset( $_GET['subsection'] ) ) {
89 $this->active_subsection = sanitize_title_with_dashes( $_GET['subsection'] );
90 } else {
91 $subsections_names = array_keys( $this->sections[ $this->active_section ]['subsections'] );
92 $this->active_subsection = $subsections_names[0];
93 }
94 }
95
96 // 3. Check if current admin page is related to taxonomies
97 if ( ! empty( $this->active_subsection ) && substr( $this->active_subsection, 0, 4 ) == 'tax_' ) {
98 $current_admin_tax = substr( $this->active_subsection, 4, strlen( $this->active_subsection ) );
99 } else {
100 $current_admin_tax = false;
101 }
102
103 // Set globals
104 $active_section = $this->active_section;
105 $active_subsection = $this->active_subsection;
106 }
107
108 /**
109 * Add "Tools -> Permalink Manager" to the admin sidebar menu
110 */
111 public function add_menu_page() {
112 $this->menu_name = add_management_page( __( 'Permalink Manager', 'permalink-manager' ), __( 'Permalink Manager', 'permalink-manager' ), 'manage_options', PERMALINK_MANAGER_PLUGIN_SLUG, array( $this, 'display_section' ) );
113
114 add_action( 'admin_init', array( $this, 'enqueue_styles' ) );
115 add_action( 'admin_init', array( $this, 'enqueue_scripts' ) );
116 }
117
118 /**
119 * Display the plugin sections
120 */
121 public function display_section() {
122 echo Permalink_Manager_UI_Elements::get_plugin_sections_html( $this->sections, $this->active_section, $this->active_subsection );
123 }
124
125 /**
126 * Register the CSS files for the plugin's dashboard
127 */
128 public function enqueue_styles() {
129 wp_enqueue_style( 'permalink-manager-plugins', PERMALINK_MANAGER_URL . '/out/permalink-manager-plugins.css', array(), PERMALINK_MANAGER_VERSION );
130 wp_enqueue_style( 'permalink-manager', PERMALINK_MANAGER_URL . '/out/permalink-manager-admin.css', array( 'permalink-manager-plugins' ), PERMALINK_MANAGER_VERSION );
131 }
132
133 /**
134 * Register the JavaScript files for the plugin's dashboard.
135 */
136 public function enqueue_scripts() {
137 wp_enqueue_script( 'permalink-manager-plugins', PERMALINK_MANAGER_URL . '/out/permalink-manager-plugins.js', array( 'jquery', ), PERMALINK_MANAGER_VERSION );
138 wp_enqueue_script( 'permalink-manager', PERMALINK_MANAGER_URL . '/out/permalink-manager-admin.js', array( 'jquery', 'permalink-manager-plugins' ), PERMALINK_MANAGER_VERSION );
139
140 wp_localize_script( 'permalink-manager', 'permalink_manager', array(
141 'ajax_url' => admin_url( 'admin-ajax.php' ),
142 'url' => PERMALINK_MANAGER_URL,
143 'confirm' => __( 'Are you sure? This action cannot be undone!', 'permalink-manager' ),
144 'spinners' => admin_url( 'images' )
145 ) );
146
147 }
148
149 /**
150 * Get the URL of the plugin's dashboard
151 *
152 * @param string $append
153 *
154 * @return string
155 */
156 public static function get_admin_url( $append = '' ) {
157 //return menu_page_url(PERMALINK_MANAGER_PLUGIN_SLUG, false) . $append;
158 $admin_page = sprintf( "tools.php?page=%s", PERMALINK_MANAGER_PLUGIN_SLUG . $append );
159
160 return admin_url( $admin_page );
161 }
162
163 /**
164 * Add shortcut links for Permalink Manager on "Plugins" page
165 *
166 * @param array $links
167 *
168 * @return array
169 */
170 public function plugins_page_links( $links ) {
171 $new_links = array(
172 sprintf( '<a href="%s">%s</a>', $this->get_admin_url(), __( 'URI Editor', 'permalink-manager' ) ),
173 sprintf( '<a href="%s">%s</a>', $this->get_admin_url( '&section=settings' ), __( 'Settings', 'permalink-manager' ) ),
174 );
175
176 return array_merge( $links, $new_links );
177 }
178
179 /**
180 * Add shortcut meta links for Permalink Manager on "Plugins" page
181 *
182 * @param array $links
183 * @param string $file
184 *
185 * @return array
186 */
187 public function plugins_page_meta( $links, $file ) {
188 if ( $file == PERMALINK_MANAGER_BASENAME ) {
189 $new_links = array(
190 'doc' => sprintf( '<a href="%s?utm_source=plugin_admin_page" target="_blank">%s</a>', 'https://permalinkmanager.pro/docs/', __( 'Documentation', 'permalink-manager' ) )
191 );
192
193 if ( ! defined( 'PERMALINK_MANAGER_PRO' ) ) {
194 $new_links['upgrade'] = sprintf( '<a href="%s?utm_source=plugin_admin_page" target="_blank"><strong>%s</strong></a>', PERMALINK_MANAGER_WEBSITE, __( 'Buy Permalink Manager Pro', 'permalink-manager' ) );
195 }
196
197 $links = array_merge( $links, $new_links );
198 }
199
200 return $links;
201 }
202
203 /**
204 * Check if URI Editor should be displayed for current user
205 *
206 * @return bool
207 */
208 public static function current_user_can_edit_uris() {
209 global $permalink_manager_options;
210
211 $edit_uris_cap = ( ! empty( $permalink_manager_options['general']['edit_uris_cap'] ) ) ? $permalink_manager_options['general']['edit_uris_cap'] : 'publish_posts';
212
213 return current_user_can( $edit_uris_cap );
214 }
215
216 /**
217 * Display global notices (throughout wp-admin dashboard)
218 */
219 function display_global_notices() {
220 global $permalink_manager_alerts, $active_section;
221
222 $html = "";
223 if ( ! empty( $permalink_manager_alerts ) && is_array( $permalink_manager_alerts ) ) {
224 foreach ( $permalink_manager_alerts as $alert_id => $alert ) {
225 $dismissed_transient_name = sprintf( 'permalink-manager-notice_%s', sanitize_title( $alert_id ) );
226 $dismissed = get_transient( $dismissed_transient_name );
227
228 // Check if alert was dismissed
229 if ( empty( $dismissed ) ) {
230 // Display the notice only on the plugin pages
231 if ( empty( $active_section ) && ! empty( $alert['plugin_only'] ) ) {
232 continue;
233 }
234
235 // Check if the notice did not expire
236 if ( isset( $alert['until'] ) && ( time() > strtotime( $alert['until'] ) ) ) {
237 continue;
238 }
239
240 $html .= Permalink_Manager_UI_Elements::get_alert_message( $alert['txt'], $alert['type'], true, $alert_id );
241 }
242 }
243 }
244
245 echo $html;
246 }
247
248 /**
249 * Display notices generated by Permalink Manager tools
250 */
251 function display_plugin_notices() {
252 global $permalink_manager_before_sections_html;
253
254 echo $permalink_manager_before_sections_html;
255 }
256
257 /**
258 * Get the list of all duplicated redirects and custom permalinks
259 *
260 * @param bool $include_custom_uris
261 *
262 * @return array
263 */
264 public static function get_all_duplicates( $include_custom_uris = true ) {
265 global $permalink_manager_uris, $permalink_manager_redirects;
266
267 // Make sure that both variables are arrays
268 $all_uris = ( $include_custom_uris && is_array( $permalink_manager_uris ) ) ? $permalink_manager_uris : array();
269 $permalink_manager_redirects = ( is_array( $permalink_manager_redirects ) ) ? $permalink_manager_redirects : array();
270
271 // Convert redirects list, so it can be merged with $permalink_manager_uris
272 foreach ( $permalink_manager_redirects as $element_id => $redirects ) {
273 if ( is_array( $redirects ) ) {
274 foreach ( $redirects as $index => $uri ) {
275 $all_uris["redirect-{$index}_{$element_id}"] = $uri;
276 }
277 }
278 }
279
280 // Count duplicates
281 $duplicates_groups = array();
282 $duplicates_list = array_count_values( $all_uris );
283 $duplicates_list = array_filter( $duplicates_list, function ( $x ) {
284 return $x >= 2;
285 } );
286
287 // Assign keys to duplicates (group them)
288 if ( count( $duplicates_list ) > 0 ) {
289 foreach ( $duplicates_list as $duplicated_uri => $count ) {
290 $duplicated_ids = array_keys( $all_uris, $duplicated_uri );
291
292 // Ignore duplicates in different langauges
293 if ( self::is_uri_duplicated( $duplicated_uri, $duplicated_ids[0], $duplicated_ids ) ) {
294 $duplicates_groups[ $duplicated_uri ] = $duplicated_ids;
295 }
296 }
297 }
298
299 return $duplicates_groups;
300 }
301
302 /**
303 * Check if a single URI is duplicated
304 *
305 * @param string $uri
306 * @param int $element_id
307 * @param array $duplicated_ids
308 *
309 * @return bool
310 */
311 public static function is_uri_duplicated( $uri, $element_id, $duplicated_ids = array() ) {
312 global $permalink_manager_uris;
313
314 if ( empty( $uri ) || empty( $element_id ) || empty( $permalink_manager_uris ) ) {
315 return false;
316 }
317
318 $uri = trim( trim( sanitize_text_field( $uri ) ), "/" );
319 $element_id = sanitize_text_field( $element_id );
320
321 // Keep the URIs in a separate array just here
322 if ( ! empty( $duplicated_ids ) ) {
323 $all_duplicates = $duplicated_ids;
324 } else if ( in_array( $uri, $permalink_manager_uris ) ) {
325 $all_duplicates = array_keys( $permalink_manager_uris, $uri );
326 }
327
328 if ( ! empty( $all_duplicates ) ) {
329 // Get the language code of current element
330 $this_uri_lang = apply_filters( 'permalink_manager_get_language_code', '', $element_id );
331
332 foreach ( $all_duplicates as $key => $duplicated_id ) {
333 // Ignore custom redirects
334 if ( strpos( $key, 'redirect-' ) !== false ) {
335 unset( $all_duplicates[ $key ] );
336 continue;
337 }
338
339 if ( $this_uri_lang ) {
340 $duplicated_uri_lang = apply_filters( 'permalink_manager_get_language_code', '', $duplicated_id );
341 }
342
343 // Ignore the URI for requested element and other elements in other languages to prevent the false alert
344 if ( ( ! empty( $duplicated_uri_lang ) && $duplicated_uri_lang !== $this_uri_lang ) || $element_id == $duplicated_id ) {
345 unset( $all_duplicates[ $key ] );
346 }
347 }
348
349 return ( count( $all_duplicates ) > 0 ) ? true : false;
350 } else {
351 return false;
352 }
353 }
354
355 /**
356 * Allow to use custom permalinks in search queries in Bulk URI Editor
357 *
358 * @param string $search_query
359 * @param string $content_type
360 *
361 * @return array
362 */
363 public static function search_uri( $search_query, $content_type = null ) {
364 global $permalink_manager_uris;
365
366 $found = array();
367 $search_query = preg_quote( $search_query, '/' );
368
369 foreach ( $permalink_manager_uris as $id => $uri ) {
370 if ( preg_match( "/\b$search_query\b/i", $uri ) ) {
371 if ( $content_type == 'taxonomies' && ( strpos( $id, 'tax-' ) !== false ) ) {
372 $found[] = (int) abs( filter_var( $id, FILTER_SANITIZE_NUMBER_INT ) );
373 } else if ( $content_type == 'posts' && is_numeric( $id ) ) {
374 $found[] = (int) filter_var( $id, FILTER_SANITIZE_NUMBER_INT );
375 } else {
376 $found[] = $id;
377 }
378 }
379 }
380
381 return $found;
382 }
383
384 /**
385 * Check if Permalink Manager Pro is active
386 *
387 * @return bool
388 */
389 public static function is_pro_active() {
390 if ( defined( 'PERMALINK_MANAGER_PRO' ) && class_exists( 'Permalink_Manager_Pro_Functions' ) ) {
391 // Check if license is active
392 $exp_date = Permalink_Manager_Pro_Functions::get_expiration_date( true );
393
394 $is_pro = ( $exp_date > 2 ) ? false : true;
395 } else {
396 $is_pro = false;
397 }
398
399 return $is_pro;
400 }
401 }
402