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