PluginProbe ʕ •ᴥ•ʔ
Permalink Manager Lite / 2.5.2.2
Permalink Manager Lite v2.5.2.2
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 / permalink-manager.php
permalink-manager Last commit date
includes 7 months ago languages 7 months ago out 7 months ago LICENSE.txt 7 months ago README.txt 7 months ago permalink-manager.php 7 months ago
permalink-manager.php
395 lines
1 <?php
2
3 /**
4 * Plugin Name: Permalink Manager Lite
5 * Plugin URI: https://permalinkmanager.pro?utm_source=plugin
6 * Description: Advanced plugin that allows to set up custom permalinks (bulk editors included), slugs and permastructures (WooCommerce compatible).
7 * Version: 2.5.2.2
8 * Author: Maciej Bis
9 * Author URI: http://maciejbis.net/
10 * License: GPL-2.0+
11 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt
12 * Text Domain: permalink-manager
13 * Domain Path: /languages
14 * WC requires at least: 3.0.0
15 * WC tested up to: 10.3.4
16 */
17
18 // If this file is called directly or plugin is already defined, abort
19 if ( ! defined( 'WPINC' ) ) {
20 die;
21 }
22
23 if ( ! class_exists( 'Permalink_Manager_Class' ) ) {
24
25 // Define the directories used to load plugin files.
26 define( 'PERMALINK_MANAGER_PLUGIN_NAME', 'Permalink Manager' );
27 define( 'PERMALINK_MANAGER_PLUGIN_SLUG', 'permalink-manager' );
28 define( 'PERMALINK_MANAGER_VERSION', '2.5.2.2' );
29 define( 'PERMALINK_MANAGER_FILE', __FILE__ );
30 define( 'PERMALINK_MANAGER_DIR', untrailingslashit( dirname( __FILE__ ) ) );
31 define( 'PERMALINK_MANAGER_BASENAME', plugin_basename( __FILE__ ) );
32 define( 'PERMALINK_MANAGER_URL', untrailingslashit( plugins_url( '', __FILE__ ) ) );
33 define( 'PERMALINK_MANAGER_WEBSITE', 'https://permalinkmanager.pro?utm_source=plugin' );
34 define( 'PERMALINK_MANAGER_PROMO', 'https://permalinkmanager.pro/features/?utm_source=plugin' );
35
36 /**
37 * The base class responsible for loading the plugin data as well as any plugin subclasses and additional functions
38 */
39 class Permalink_Manager_Class {
40 public $permalink_manager_options;
41 public $sections, $functions;
42
43 /**
44 * Get options from DB, load subclasses & hooks
45 */
46 public function __construct() {
47 $this->include_subclasses();
48 $this->register_init_hooks();
49 }
50
51 /**
52 * Include back-end classes and set their instances
53 */
54 function include_subclasses() {
55 // WP_List_Table needed for post types & taxonomies editors
56 if ( ! class_exists( 'WP_List_Table' ) ) {
57 require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
58 }
59
60 $classes = array(
61 'core' => array(
62 'helper-functions' => 'Permalink_Manager_Helper_Functions',
63 'uri-functions' => 'Permalink_Manager_URI_Functions',
64 'uri-functions-post' => 'Permalink_Manager_URI_Functions_Post',
65 'uri-functions-tax' => 'Permalink_Manager_URI_Functions_Tax',
66 'admin-functions' => 'Permalink_Manager_Admin_Functions',
67 'actions' => 'Permalink_Manager_Actions',
68 'core-functions' => 'Permalink_Manager_Core_Functions',
69 'permastructures-functions' => 'Permalink_Manager_Permastructure_Functions',
70 'gutenberg' => 'Permalink_Manager_Gutenberg',
71 'debug' => 'Permalink_Manager_Debug_Functions',
72 'pro-license' => 'Permalink_Manager_Pro_License',
73 'pro-functions' => 'Permalink_Manager_Pro_Functions'
74 ),
75 'integrations' => array(
76 'third-parties' => 'Permalink_Manager_Third_Parties',
77 'woocommerce' => 'Permalink_Manager_WooCommerce',
78 'seo-plugins' => 'Permalink_Manager_SEO_Plugins',
79 'language-plugins' => 'Permalink_Manager_Language_Plugins'
80 ),
81 'views' => array(
82 'ui-elements' => 'Permalink_Manager_UI_Elements',
83 'uri-editor' => 'Permalink_Manager_URI_Editor',
84 'tools' => 'Permalink_Manager_Tools',
85 'permastructures' => 'Permalink_Manager_Permastructs',
86 'settings' => 'Permalink_Manager_Settings',
87 'debug' => 'Permalink_Manager_Debug',
88 'pro-addons' => 'Permalink_Manager_Pro_Addons',
89 'help' => 'Permalink_Manager_Help',
90 'uri-editor-tax' => false,
91 'uri-editor-post' => false
92 )
93 );
94
95 // Load classes and set-up their instances
96 foreach ( $classes as $class_type => $classes_array ) {
97 foreach ( $classes_array as $class => $class_name ) {
98 $filename = PERMALINK_MANAGER_DIR . "/includes/{$class_type}/permalink-manager-{$class}.php";
99
100 if ( file_exists( $filename ) ) {
101 require_once $filename;
102 if ( $class_name ) {
103 $this->functions[ $class ] = new $class_name();
104 }
105 }
106 }
107 }
108 }
109
110 /**
111 * Register general hooks
112 */
113 public function register_init_hooks() {
114 // Localize plugin
115 add_action( 'init', array( $this, 'localize_me' ), 1 );
116
117 // Support deprecated hooks
118 add_action( 'plugins_loaded', array( $this, 'deprecated_hooks' ), 9 );
119
120 // Deactivate free version if Permalink Manager Pro is activated
121 add_action( 'plugins_loaded', array( $this, 'is_pro_activated' ), 9 );
122
123 // Load globals & options
124 add_action( 'plugins_loaded', array( $this, 'get_options_and_globals' ), 9 );
125 add_action( 'init', array( $this, 'get_output_globals' ), 9 );
126
127 // Legacy support
128 add_action( 'init', array( $this, 'legacy_support' ), 2 );
129
130 // Default settings & alerts
131 add_filter( 'permalink_manager_options', array( $this, 'default_settings' ), 1 );
132 add_filter( 'permalink_manager_alerts', array( $this, 'default_alerts' ), 1 );
133 }
134
135 /**
136 * Localize this plugin
137 */
138 function localize_me() {
139 load_plugin_textdomain( 'permalink-manager', false, basename( dirname( __FILE__ ) ) . "/languages" );
140 }
141
142 /**
143 * Get options values & set global variables
144 */
145 public function get_options_and_globals() {
146 // 1. Globals with data stored in DB
147 global $permalink_manager_options, $permalink_manager_uris, $permalink_manager_permastructs, $permalink_manager_redirects, $permalink_manager_external_redirects;
148
149 $permalink_manager_options = (array) apply_filters( 'permalink_manager_options', get_option( 'permalink-manager', array() ) );
150 $permalink_manager_uris = (array) apply_filters( 'permalink_manager_uris', get_option( 'permalink-manager-uris', array() ) );
151 $permalink_manager_permastructs = (array) apply_filters( 'permalink_manager_permastructs', get_option( 'permalink-manager-permastructs', array() ) );
152 $permalink_manager_redirects = (array) apply_filters( 'permalink_manager_redirects', get_option( 'permalink-manager-redirects', array() ) );
153 $permalink_manager_external_redirects = (array) apply_filters( 'permalink_manager_external_redirects', get_option( 'permalink-manager-external-redirects', array() ) );
154 }
155
156 /**
157 * Get global variables
158 */
159 public function get_output_globals() {
160 // 2. Globals used to display additional content (e.g. alerts)
161 global $permalink_manager_alerts, $permalink_manager_before_sections_html, $permalink_manager_after_sections_html;
162
163 $permalink_manager_alerts = apply_filters( 'permalink_manager_alerts', array() );
164 $permalink_manager_before_sections_html = apply_filters( 'permalink_manager_before_sections', '' );
165 $permalink_manager_after_sections_html = apply_filters( 'permalink_manager_after_sections', '' );
166 }
167
168 /**
169 * Set the initial/default settings (including "Screen Options")
170 *
171 * @param array $settings
172 *
173 * @return array
174 */
175 public function default_settings( $settings ) {
176 $default_settings = apply_filters( 'permalink_manager_default_options', array(
177 'screen-options' => array(
178 'per_page' => 20,
179 'post_statuses' => array( 'publish' ),
180 'group' => false
181 ),
182 'general' => array(
183 'auto_update_uris' => 0,
184 'show_native_slug_field' => 0,
185 'pagination_redirect' => 0,
186 'sslwww_redirect' => 1,
187 'canonical_redirect' => 1,
188 'old_slug_redirect' => 0,
189 'setup_redirects' => 0,
190 'redirect' => '301',
191 'extra_redirects' => 1,
192 'copy_query_redirect' => 1,
193 'trailing_slashes' => 0,
194 'trailing_slash_redirect' => 1,
195 'auto_fix_duplicates' => 0,
196 'fix_language_mismatch' => 0,
197 'wpml_support' => 1,
198 'wpml_translate_mode' => 0,
199 'pmxi_support' => 1,
200 'um_support' => 1,
201 'yoast_breadcrumbs' => 0,
202 'rankmath_redirect' => 1,
203 'primary_category' => 1,
204 'force_custom_slugs' => 0,
205 'disable_slug_sanitization' => 0,
206 'keep_accents' => 0,
207 'partial_disable' => array(
208 'post_types' => array( 'attachment', 'tribe_events', 'e-landing-page' )
209 ),
210 'partial_disable_strict' => 1,
211 'ignore_drafts' => 1,
212 'edit_uris_cap' => 'publish_posts',
213 'force_unique_uris' => 0
214 ),
215 'licence' => array()
216 ) );
217
218 // Check if settings array is empty
219 $settings_empty = empty( $settings );
220
221 // Apply the default settings (if empty values) in all settings sections
222 foreach ( $default_settings as $group_name => $fields ) {
223 foreach ( $fields as $field_name => $field ) {
224 if ( $settings_empty || ( ! isset( $settings[ $group_name ][ $field_name ] ) && strpos( $field_name, 'partial_disable' ) === false ) ) {
225 $settings[ $group_name ][ $field_name ] = $field;
226 }
227 }
228 }
229
230 return $settings;
231 }
232
233 /**
234 * Set the initial/default admin notices
235 *
236 * @param array $alerts
237 *
238 * @return array
239 */
240 public function default_alerts( $alerts ) {
241 $default_alerts = apply_filters( 'permalink_manager_default_alerts', array(
242 'sample-alert' => array(
243 'txt' => '',
244 'type' => 'notice-info',
245 'show' => 'pro_hide',
246 'plugin_only' => true,
247 'until' => '2021-01-09'
248 )
249 ) );
250
251 // Apply the default settings (if empty values) in all settings sections
252 return (array) $alerts + (array) $default_alerts;
253 }
254
255 /**
256 * Make sure that the Permalink Manager options stored in DB match the new structure
257 */
258 function legacy_support() {
259 global $permalink_manager_permastructs, $permalink_manager_options;
260
261 if ( isset( $permalink_manager_options['base-editor'] ) ) {
262 $new_options['post_types'] = $permalink_manager_options['base-editor'];
263 update_option( 'permalink-manager-permastructs', $new_options );
264 } else if ( empty( $permalink_manager_permastructs['post_types'] ) && empty( $permalink_manager_permastructs['taxonomies'] ) && count( $permalink_manager_permastructs ) > 0 ) {
265 $new_options['post_types'] = $permalink_manager_permastructs;
266 update_option( 'permalink-manager-permastructs', $new_options );
267 }
268
269 // Separate "Trailing slashes" & "Trailing slashes redirect" setting fields
270 if ( ! empty( $permalink_manager_options['general']['trailing_slashes'] ) && $permalink_manager_options['general']['trailing_slashes'] >= 10 ) {
271 $permalink_manager_unfiltered_options = ( ! empty( $permalink_manager_unfiltered_options ) ) ? $permalink_manager_unfiltered_options : $permalink_manager_options;
272
273 $permalink_manager_unfiltered_options['general']['trailing_slashes_redirect'] = 1;
274 $permalink_manager_unfiltered_options['general']['trailing_slashes'] = ( $permalink_manager_options['general']['trailing_slashes'] == 10 ) ? 1 : 2;
275 }
276
277 // Save the settings in database
278 if ( ! empty( $permalink_manager_unfiltered_options ) ) {
279 update_option( 'permalink-manager', $permalink_manager_unfiltered_options );
280 }
281
282 // Remove obsolete 'permalink-manager-alerts' from wp_options table
283 if ( get_option( 'permalink-manager-alerts' ) ) {
284 delete_option( 'permalink-manager-alerts' );
285 }
286 }
287
288 /**
289 * Return the array of deprecated hooks
290 *
291 * @return array
292 */
293 function deprecated_hooks_list() {
294 return array(
295 'permalink_manager_default_options' => 'permalink-manager-default-options',
296 'permalink_manager_options' => 'permalink-manager-options',
297 'permalink_manager_uris' => 'permalink-manager-uris',
298 'permalink_manager_redirects' => 'permalink-manager-redirects',
299 'permalink_manager_external_redirects' => 'permalink-manager-external-redirects',
300 'permalink_manager_permastructs' => 'permalink-manager-permastructs',
301
302 'permalink_manager_alerts' => 'permalink-manager-alerts',
303 'permalink_manager_before_sections' => 'permalink-manager-before-sections',
304 'permalink_manager_sections' => 'permalink-manager-sections',
305 'permalink_manager_after_sections' => 'permalink-manager-after-sections',
306
307 'permalink_manager_field_args' => 'permalink-manager-field-args',
308 'permalink_manager_field_output' => 'permalink-manager-field-output',
309
310 'permalink_manager_deep_uri_detect' => 'permalink-manager-deep-uri-detect',
311 'permalink_manager_detect_uri' => 'permalink-manager-detect-uri',
312 'permalink_manager_detected_element_id' => 'permalink-manager-detected-initial-id',
313 'permalink_manager_detected_term_id' => 'permalink-manager-detected-term-id',
314 'permalink_manager_detected_post_id' => 'permalink-manager-detected-post-id',
315
316 'permalink_manager_primary_term' => 'permalink-manager-primary-term',
317 'permalink_manager_disabled_post_types' => 'permalink-manager-disabled-post-types',
318 'permalink_manager_disabled_taxonomies' => 'permalink-manager-disabled-taxonomies',
319 'permalink_manager_endpoints' => 'permalink-manager-endpoints',
320 'permalink_manager_filter_permalink_base' => 'permalink_manager-filter-permalink-base',
321 'permalink_manager_force_lowercase_uris' => 'permalink-manager-force-lowercase-uris',
322
323 'permalink_manager_uri_editor_extra_info' => 'permalink-manager-uri-editor-extra-info',
324 'permalink_manager_debug_fields' => 'permalink-manager-debug-fields',
325 'permalink_manager_permastructs_fields' => 'permalink-manager-permastructs-fields',
326 'permalink_manager_settings_fields' => 'permalink-manager-settings-fields',
327 'permalink_manager_tools_fields' => 'permalink-manager-tools-fields',
328
329 'permalink_manager_uri_editor_columns' => 'permalink-manager-uri-editor-columns',
330 'permalink_manager_uri_editor_column_content' => 'permalink-manager-uri-editor-column-content',
331
332 'permalink_manager_redirect_shop_archive' => 'permalink-manager-redirect-shop-archive'
333 );
334 }
335
336 /**
337 * Map the deprecated hooks to their relevant equivalents.
338 */
339 function deprecated_hooks() {
340 $deprecated_filters = $this->deprecated_hooks_list();
341 foreach ( $deprecated_filters as $new => $old ) {
342 add_filter( $new, array( $this, 'deprecated_hooks_mapping' ), - 1000, 8 );
343 }
344 }
345
346 /**
347 * Apply the deprecated filters to the relevant hooks
348 *
349 * @param mixed $data
350 *
351 * @return mixed
352 */
353 function deprecated_hooks_mapping( $data ) {
354 $deprecated_filters = $this->deprecated_hooks_list();
355 $filter = current_filter();
356
357 if ( isset( $deprecated_filters[ $filter ] ) ) {
358 if ( has_filter( $deprecated_filters[ $filter ] ) ) {
359 do_action( 'deprecated_function_run', $deprecated_filters[ $filter ], $filter, '2.4.3' );
360
361 $args = func_get_args();
362 $data = apply_filters_ref_array( $deprecated_filters[ $filter ], $args );
363 }
364 }
365
366 return $data;
367 }
368
369 /**
370 * Deactivate Permalink Manager Lite if Permalink Manager Pro is enabled
371 */
372 function is_pro_activated() {
373 if ( function_exists( 'is_plugin_active' ) && is_plugin_active( 'permalink-manager/permalink-manager.php' ) && is_plugin_active( 'permalink-manager-pro/permalink-manager.php' ) ) {
374 deactivate_plugins( 'permalink-manager/permalink-manager.php' );
375 }
376 }
377
378 }
379
380 /**
381 * Begins execution of the plugin
382 */
383 function run_permalink_manager() {
384 global $permalink_manager;
385
386 // Do not run when Elementor is opened
387 if ( ( ! empty( $_REQUEST['action'] ) && is_string( $_REQUEST['action'] ) && strpos( $_REQUEST['action'], 'elementor' ) !== false ) || isset( $_REQUEST['elementor-preview'] ) || isset( $_REQUEST['disable-pm'] ) ) {
388 return;
389 }
390
391 $permalink_manager = new Permalink_Manager_Class();
392 }
393
394 run_permalink_manager();
395 }