PluginProbe ʕ •ᴥ•ʔ
Permalink Manager Lite / 2.4.1.2
Permalink Manager Lite v2.4.1.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 2 years ago languages 2 years ago out 2 years ago LICENSE.txt 2 years ago README.txt 2 years ago permalink-manager.php 2 years ago
permalink-manager.php
397 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.4.1.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: 7.8.0
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.4.1.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
35 /**
36 * The base class responsible for loading the plugin data as well as any plugin subclasses and additional functions
37 */
38 class Permalink_Manager_Class {
39
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 'third-parties' => 'Permalink_Manager_Third_Parties',
69 'language-plugins' => 'Permalink_Manager_Language_Plugins',
70 'core-functions' => 'Permalink_Manager_Core_Functions',
71 'gutenberg' => 'Permalink_Manager_Gutenberg',
72 'debug' => 'Permalink_Manager_Debug_Functions',
73 'pro-functions' => 'Permalink_Manager_Pro_Functions'
74 ),
75 'views' => array(
76 'uri-editor' => 'Permalink_Manager_Uri_Editor',
77 'tools' => 'Permalink_Manager_Tools',
78 'permastructs' => 'Permalink_Manager_Permastructs',
79 'settings' => 'Permalink_Manager_Settings',
80 'debug' => 'Permalink_Manager_Debug',
81 'pro-addons' => 'Permalink_Manager_Pro_Addons',
82 'help' => 'Permalink_Manager_Help',
83 'uri-editor-tax' => false,
84 'uri-editor-post' => false
85 )
86 );
87
88 // Load classes and set-up their instances
89 foreach ( $classes as $class_type => $classes_array ) {
90 foreach ( $classes_array as $class => $class_name ) {
91 $filename = PERMALINK_MANAGER_DIR . "/includes/{$class_type}/permalink-manager-{$class}.php";
92
93 if ( file_exists( $filename ) ) {
94 require_once $filename;
95 if ( $class_name ) {
96 $this->functions[ $class ] = new $class_name();
97 }
98 }
99 }
100 }
101 }
102
103 /**
104 * Register general hooks
105 */
106 public function register_init_hooks() {
107 // Localize plugin
108 add_action( 'init', array( $this, 'localize_me' ), 1 );
109
110 // Support deprecated hooks
111 add_action( 'plugins_loaded', array( $this, 'deprecated_hooks' ), 9 );
112
113 // Deactivate free version if Permalink Manager Pro is activated
114 add_action( 'plugins_loaded', array( $this, 'is_pro_activated' ), 9 );
115
116 // Load globals & options
117 add_action( 'plugins_loaded', array( $this, 'get_options_and_globals' ), 9 );
118
119 // Legacy support
120 add_action( 'init', array( $this, 'legacy_support' ), 2 );
121
122 // Default settings & alerts
123 add_filter( 'permalink_manager_options', array( $this, 'default_settings' ), 1 );
124 add_filter( 'permalink_manager_alerts', array( $this, 'default_alerts' ), 1 );
125 }
126
127 /**
128 * Localize this plugin
129 */
130 function localize_me() {
131 load_plugin_textdomain( 'permalink-manager', false, basename( dirname( __FILE__ ) ) . "/languages" );
132 }
133
134 /**
135 * Get options values & set global variables
136 */
137 public function get_options_and_globals() {
138 // 1. Globals with data stored in DB
139 global $permalink_manager_options, $permalink_manager_uris, $permalink_manager_permastructs, $permalink_manager_redirects, $permalink_manager_external_redirects;
140
141 $permalink_manager_options = (array) apply_filters( 'permalink_manager_options', get_option( 'permalink-manager', array() ) );
142 $permalink_manager_uris = (array) apply_filters( 'permalink_manager_uris', get_option( 'permalink-manager-uris', array() ) );
143 $permalink_manager_permastructs = (array) apply_filters( 'permalink_manager_permastructs', get_option( 'permalink-manager-permastructs', array() ) );
144 $permalink_manager_redirects = (array) apply_filters( 'permalink_manager_redirects', get_option( 'permalink-manager-redirects', array() ) );
145 $permalink_manager_external_redirects = (array) apply_filters( 'permalink_manager_external_redirects', get_option( 'permalink-manager-external-redirects', array() ) );
146
147 // 2. Globals used to display additional content (eg. alerts)
148 global $permalink_manager_alerts, $permalink_manager_before_sections_html, $permalink_manager_after_sections_html;
149
150 $permalink_manager_alerts = apply_filters( 'permalink_manager_alerts', array() );
151 $permalink_manager_before_sections_html = apply_filters( 'permalink_manager_before_sections', '' );
152 $permalink_manager_after_sections_html = apply_filters( 'permalink_manager_after_sections', '' );
153 }
154
155 /**
156 * Set the initial/default settings (including "Screen Options")
157 *
158 * @param array $settings
159 *
160 * @return array
161 */
162 public function default_settings( $settings ) {
163 $default_settings = apply_filters( 'permalink_manager_default_options', array(
164 'screen-options' => array(
165 'per_page' => 20,
166 'post_statuses' => array( 'publish' ),
167 'group' => false
168 ),
169 'general' => array(
170 'auto_update_uris' => 0,
171 'show_native_slug_field' => 0,
172 'pagination_redirect' => 0,
173 'sslwww_redirect' => 1,
174 'canonical_redirect' => 1,
175 'old_slug_redirect' => 0,
176 'setup_redirects' => 0,
177 'redirect' => '301',
178 'extra_redirects' => 1,
179 'copy_query_redirect' => 1,
180 'trailing_slashes' => 0,
181 'trailing_slash_redirect' => 0,
182 'auto_fix_duplicates' => 0,
183 'fix_language_mismatch' => 1,
184 'wpml_support' => 1,
185 'pmxi_support' => 1,
186 'um_support' => 1,
187 'yoast_breadcrumbs' => 0,
188 'primary_category' => 1,
189 'force_custom_slugs' => 0,
190 'disable_slug_sanitization' => 0,
191 'keep_accents' => 0,
192 'partial_disable' => array(
193 'post_types' => array( 'attachment', 'tribe_events', 'e-landing-page' )
194 ),
195 'partial_disable_strict' => 1,
196 'ignore_drafts' => 1,
197 'edit_uris_cap' => 'publish_posts'
198 ),
199 'licence' => array()
200 ) );
201
202 // Check if settings array is empty
203 $settings_empty = empty( $settings );
204
205 // Apply the default settings (if empty values) in all settings sections
206 foreach ( $default_settings as $group_name => $fields ) {
207 foreach ( $fields as $field_name => $field ) {
208 if ( $settings_empty || ( ! isset( $settings[ $group_name ][ $field_name ] ) && strpos( $field_name, 'partial_disable' ) === false ) ) {
209 $settings[ $group_name ][ $field_name ] = $field;
210 }
211 }
212 }
213
214 return $settings;
215 }
216
217 /**
218 * Set the initial/default admin notices
219 *
220 * @param array $alerts
221 *
222 * @return array
223 */
224 public function default_alerts( $alerts ) {
225 $default_alerts = apply_filters( 'permalink_manager_default_alerts', array(
226 'sample-alert' => array(
227 'txt' => '',
228 'type' => 'notice-info',
229 'show' => 'pro_hide',
230 'plugin_only' => true,
231 'until' => '2021-01-09'
232 )
233 ) );
234
235 // Apply the default settings (if empty values) in all settings sections
236 return (array) $alerts + (array) $default_alerts;
237 }
238
239 /**
240 * Make sure that the Permalink Manager options stored in DB match the new structure
241 */
242 function legacy_support() {
243 global $permalink_manager_permastructs, $permalink_manager_options;
244
245 if ( isset( $permalink_manager_options['base-editor'] ) ) {
246 $new_options['post_types'] = $permalink_manager_options['base-editor'];
247 update_option( 'permalink-manager-permastructs', $new_options );
248 } else if ( empty( $permalink_manager_permastructs['post_types'] ) && empty( $permalink_manager_permastructs['taxonomies'] ) && count( $permalink_manager_permastructs ) > 0 ) {
249 $new_options['post_types'] = $permalink_manager_permastructs;
250 update_option( 'permalink-manager-permastructs', $new_options );
251 }
252
253 // Adjust options structure
254 if ( ! empty( $permalink_manager_options['miscellaneous'] ) ) {
255 $permalink_manager_unfiltered_options = $permalink_manager_options;
256
257 // Combine general & miscellaneous options
258 $permalink_manager_unfiltered_options['general'] = array_merge( $permalink_manager_unfiltered_options['general'], $permalink_manager_unfiltered_options['miscellaneous'] );
259
260 // Move licence key to different section
261 $permalink_manager_unfiltered_options['licence']['licence_key'] = ( ! empty( $permalink_manager_unfiltered_options['miscellaneous']['license_key'] ) ) ? $permalink_manager_unfiltered_options['miscellaneous']['license_key'] : "";
262 }
263
264 // Separate "Trailing slashes" & "Trailing slashes redirect" setting fields
265 if ( ! empty( $permalink_manager_options['general']['trailing_slashes'] ) && $permalink_manager_options['general']['trailing_slashes'] >= 10 ) {
266 $permalink_manager_unfiltered_options = ( ! empty( $permalink_manager_unfiltered_options ) ) ? $permalink_manager_unfiltered_options : $permalink_manager_options;
267
268 $permalink_manager_unfiltered_options['general']['trailing_slashes_redirect'] = 1;
269 $permalink_manager_unfiltered_options['general']['trailing_slashes'] = ( $permalink_manager_options['general']['trailing_slashes'] == 10 ) ? 1 : 2;
270 }
271
272 // Adjust WP All Import support mode
273 if ( isset( $permalink_manager_options['general']['pmxi_import_support'] ) ) {
274 $permalink_manager_unfiltered_options = ( ! empty( $permalink_manager_unfiltered_options ) ) ? $permalink_manager_unfiltered_options : $permalink_manager_options;
275
276 $permalink_manager_unfiltered_options['general']['pmxi_support'] = ( empty( $permalink_manager_options['general']['pmxi_import_support'] ) ) ? 1 : 0;
277 unset( $permalink_manager_unfiltered_options['general']['pmxi_import_support'] );
278 }
279
280 // Save the settings in database
281 if ( ! empty( $permalink_manager_unfiltered_options ) ) {
282 update_option( 'permalink-manager', $permalink_manager_unfiltered_options );
283 }
284
285 // Remove obsolete 'permalink-manager-alerts' from wp_options table
286 if ( get_option( 'permalink-manager-alerts' ) ) {
287 delete_option( 'permalink-manager-alerts' );
288 }
289 }
290
291 /**
292 * Return the array of deprecated hooks
293 *
294 * @return array
295 */
296 function deprecated_hooks_list() {
297 return array(
298 'permalink_manager_default_options' => 'permalink-manager-default-options',
299 'permalink_manager_options' => 'permalink-manager-options',
300 'permalink_manager_uris' => 'permalink-manager-uris',
301 'permalink_manager_redirects' => 'permalink-manager-redirects',
302 'permalink_manager_external_redirects' => 'permalink-manager-external-redirects',
303 'permalink_manager_permastructs' => 'permalink-manager-permastructs',
304
305 'permalink_manager_alerts' => 'permalink-manager-alerts',
306 'permalink_manager_before_sections' => 'permalink-manager-before-sections',
307 'permalink_manager_sections' => 'permalink-manager-sections',
308 'permalink_manager_after_sections' => 'permalink-manager-after-sections',
309
310 'permalink_manager_field_args' => 'permalink-manager-field-args',
311 'permalink_manager_field_output' => 'permalink-manager-field-output',
312
313 'permalink_manager_deep_uri_detect' => 'permalink-manager-deep-uri-detect',
314 'permalink_manager_detect_uri' => 'permalink-manager-detect-uri',
315 'permalink_manager_detected_element_id' => 'permalink-manager-detected-initial-id',
316 'permalink_manager_detected_term_id' => 'permalink-manager-detected-term-id',
317 'permalink_manager_detected_post_id' => 'permalink-manager-detected-post-id',
318
319 'permalink_manager_primary_term' => 'permalink-manager-primary-term',
320 'permalink_manager_disabled_post_types' => 'permalink-manager-disabled-post-types',
321 'permalink_manager_disabled_taxonomies' => 'permalink-manager-disabled-taxonomies',
322 'permalink_manager_endpoints' => 'permalink-manager-endpoints',
323 'permalink_manager_filter_permalink_base' => 'permalink_manager-filter-permalink-base',
324 'permalink_manager_force_lowercase_uris' => 'permalink-manager-force-lowercase-uris',
325
326 'permalink_manager_uri_editor_extra_info' => 'permalink-manager-uri-editor-extra-info',
327 'permalink_manager_debug_fields' => 'permalink-manager-debug-fields',
328 'permalink_manager_permastructs_fields' => 'permalink-manager-permastructs-fields',
329 'permalink_manager_settings_fields' => 'permalink-manager-settings-fields',
330 'permalink_manager_tools_fields' => 'permalink-manager-tools-fields',
331
332 'permalink_manager_uri_editor_columns' => 'permalink-manager-uri-editor-columns',
333 'permalink_manager_uri_editor_column_content' => 'permalink-manager-uri-editor-column-content',
334
335 'permalink_manager_redirect_shop_archive' => 'permalink-manager-redirect-shop-archive'
336 );
337 }
338
339 /**
340 * Map the deprecated hooks to their relevant equivalents.
341 */
342 function deprecated_hooks() {
343 $deprecated_filters = $this->deprecated_hooks_list();
344 foreach ( $deprecated_filters as $new => $old ) {
345 add_filter( $new, array( $this, 'deprecated_hooks_mapping' ), - 1000, 8 );
346 }
347 }
348
349 /**
350 * Apply the deprecated filters to the relevant hooks
351 *
352 * @param mixed $data
353 *
354 * @return mixed
355 */
356 function deprecated_hooks_mapping( $data ) {
357 $deprecated_filters = $this->deprecated_hooks_list();
358 $filter = current_filter();
359
360 if ( isset( $deprecated_filters[ $filter ] ) ) {
361 if ( has_filter( $deprecated_filters[ $filter ] ) ) {
362 $args = func_get_args();
363 $data = apply_filters_ref_array( $deprecated_filters[ $filter ], $args );
364 }
365 }
366
367 return $data;
368 }
369
370 /**
371 * Deactivate Permalink Manager Lite if Permalink Manager Pro is enabled
372 */
373 function is_pro_activated() {
374 if ( function_exists( 'is_plugin_active' ) && is_plugin_active( 'permalink-manager/permalink-manager.php' ) && is_plugin_active( 'permalink-manager-pro/permalink-manager.php' ) ) {
375 deactivate_plugins( 'permalink-manager/permalink-manager.php' );
376 }
377 }
378
379 }
380
381 /**
382 * Begins execution of the plugin
383 */
384 function run_permalink_manager() {
385 global $permalink_manager;
386
387 // Do not run when Elementor is opened
388 if ( ( ! empty( $_REQUEST['action'] ) && is_string( $_REQUEST['action'] ) && strpos( $_REQUEST['action'], 'elementor' ) !== false ) || isset( $_REQUEST['elementor-preview'] ) ) {
389 return;
390 }
391
392 $permalink_manager = new Permalink_Manager_Class();
393 }
394
395 run_permalink_manager();
396 }
397