PluginProbe ʕ •ᴥ•ʔ
Permalink Manager Lite / 2.5.0
Permalink Manager Lite v2.5.0
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 1 year ago languages 1 year ago out 1 year ago LICENSE.txt 1 year ago README.txt 1 year ago permalink-manager.php 1 year ago
permalink-manager.php
391 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.0
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: 9.6.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.5.0' );
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 public $permalink_manager_options;
40 public $sections, $functions;
41
42 /**
43 * Get options from DB, load subclasses & hooks
44 */
45 public function __construct() {
46 $this->include_subclasses();
47 $this->register_init_hooks();
48 }
49
50 /**
51 * Include back-end classes and set their instances
52 */
53 function include_subclasses() {
54 // WP_List_Table needed for post types & taxonomies editors
55 if ( ! class_exists( 'WP_List_Table' ) ) {
56 require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
57 }
58
59 $classes = array(
60 'core' => array(
61 'helper-functions' => 'Permalink_Manager_Helper_Functions',
62 'uri-functions' => 'Permalink_Manager_URI_Functions',
63 'uri-functions-post' => 'Permalink_Manager_URI_Functions_Post',
64 'uri-functions-tax' => 'Permalink_Manager_URI_Functions_Tax',
65 'admin-functions' => 'Permalink_Manager_Admin_Functions',
66 'actions' => 'Permalink_Manager_Actions',
67 'core-functions' => 'Permalink_Manager_Core_Functions',
68 'permastructures-functions' => 'Permalink_Manager_Permastructure_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 'permastructures' => '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 add_action( 'init', array( $this, 'get_output_globals' ), 9 );
124
125 // Legacy support
126 add_action( 'init', array( $this, 'legacy_support' ), 2 );
127
128 // Default settings & alerts
129 add_filter( 'permalink_manager_options', array( $this, 'default_settings' ), 1 );
130 add_filter( 'permalink_manager_alerts', array( $this, 'default_alerts' ), 1 );
131 }
132
133 /**
134 * Localize this plugin
135 */
136 function localize_me() {
137 load_plugin_textdomain( 'permalink-manager', false, basename( dirname( __FILE__ ) ) . "/languages" );
138 }
139
140 /**
141 * Get options values & set global variables
142 */
143 public function get_options_and_globals() {
144 // 1. Globals with data stored in DB
145 global $permalink_manager_options, $permalink_manager_uris, $permalink_manager_permastructs, $permalink_manager_redirects, $permalink_manager_external_redirects;
146
147 $permalink_manager_options = (array) apply_filters( 'permalink_manager_options', get_option( 'permalink-manager', array() ) );
148 $permalink_manager_uris = (array) apply_filters( 'permalink_manager_uris', get_option( 'permalink-manager-uris', array() ) );
149 $permalink_manager_permastructs = (array) apply_filters( 'permalink_manager_permastructs', get_option( 'permalink-manager-permastructs', array() ) );
150 $permalink_manager_redirects = (array) apply_filters( 'permalink_manager_redirects', get_option( 'permalink-manager-redirects', array() ) );
151 $permalink_manager_external_redirects = (array) apply_filters( 'permalink_manager_external_redirects', get_option( 'permalink-manager-external-redirects', array() ) );
152 }
153
154 /**
155 * Get global variables
156 */
157 public function get_output_globals() {
158 // 2. Globals used to display additional content (e.g. alerts)
159 global $permalink_manager_alerts, $permalink_manager_before_sections_html, $permalink_manager_after_sections_html;
160
161 $permalink_manager_alerts = apply_filters( 'permalink_manager_alerts', array() );
162 $permalink_manager_before_sections_html = apply_filters( 'permalink_manager_before_sections', '' );
163 $permalink_manager_after_sections_html = apply_filters( 'permalink_manager_after_sections', '' );
164 }
165
166 /**
167 * Set the initial/default settings (including "Screen Options")
168 *
169 * @param array $settings
170 *
171 * @return array
172 */
173 public function default_settings( $settings ) {
174 $default_settings = apply_filters( 'permalink_manager_default_options', array(
175 'screen-options' => array(
176 'per_page' => 20,
177 'post_statuses' => array( 'publish' ),
178 'group' => false
179 ),
180 'general' => array(
181 'auto_update_uris' => 0,
182 'show_native_slug_field' => 0,
183 'pagination_redirect' => 0,
184 'sslwww_redirect' => 1,
185 'canonical_redirect' => 1,
186 'old_slug_redirect' => 0,
187 'setup_redirects' => 0,
188 'redirect' => '301',
189 'extra_redirects' => 1,
190 'copy_query_redirect' => 1,
191 'trailing_slashes' => 0,
192 'trailing_slash_redirect' => 1,
193 'auto_fix_duplicates' => 0,
194 'fix_language_mismatch' => 0,
195 'wpml_support' => 1,
196 'pmxi_support' => 1,
197 'um_support' => 1,
198 'yoast_breadcrumbs' => 0,
199 'rankmath_redirect' => 1,
200 'primary_category' => 1,
201 'force_custom_slugs' => 0,
202 'disable_slug_sanitization' => 0,
203 'keep_accents' => 0,
204 'partial_disable' => array(
205 'post_types' => array( 'attachment', 'tribe_events', 'e-landing-page' )
206 ),
207 'partial_disable_strict' => 1,
208 'ignore_drafts' => 1,
209 'edit_uris_cap' => 'publish_posts'
210 ),
211 'licence' => array()
212 ) );
213
214 // Check if settings array is empty
215 $settings_empty = empty( $settings );
216
217 // Apply the default settings (if empty values) in all settings sections
218 foreach ( $default_settings as $group_name => $fields ) {
219 foreach ( $fields as $field_name => $field ) {
220 if ( $settings_empty || ( ! isset( $settings[ $group_name ][ $field_name ] ) && strpos( $field_name, 'partial_disable' ) === false ) ) {
221 $settings[ $group_name ][ $field_name ] = $field;
222 }
223 }
224 }
225
226 return $settings;
227 }
228
229 /**
230 * Set the initial/default admin notices
231 *
232 * @param array $alerts
233 *
234 * @return array
235 */
236 public function default_alerts( $alerts ) {
237 $default_alerts = apply_filters( 'permalink_manager_default_alerts', array(
238 'sample-alert' => array(
239 'txt' => '',
240 'type' => 'notice-info',
241 'show' => 'pro_hide',
242 'plugin_only' => true,
243 'until' => '2021-01-09'
244 )
245 ) );
246
247 // Apply the default settings (if empty values) in all settings sections
248 return (array) $alerts + (array) $default_alerts;
249 }
250
251 /**
252 * Make sure that the Permalink Manager options stored in DB match the new structure
253 */
254 function legacy_support() {
255 global $permalink_manager_permastructs, $permalink_manager_options;
256
257 if ( isset( $permalink_manager_options['base-editor'] ) ) {
258 $new_options['post_types'] = $permalink_manager_options['base-editor'];
259 update_option( 'permalink-manager-permastructs', $new_options );
260 } else if ( empty( $permalink_manager_permastructs['post_types'] ) && empty( $permalink_manager_permastructs['taxonomies'] ) && count( $permalink_manager_permastructs ) > 0 ) {
261 $new_options['post_types'] = $permalink_manager_permastructs;
262 update_option( 'permalink-manager-permastructs', $new_options );
263 }
264
265 // Separate "Trailing slashes" & "Trailing slashes redirect" setting fields
266 if ( ! empty( $permalink_manager_options['general']['trailing_slashes'] ) && $permalink_manager_options['general']['trailing_slashes'] >= 10 ) {
267 $permalink_manager_unfiltered_options = ( ! empty( $permalink_manager_unfiltered_options ) ) ? $permalink_manager_unfiltered_options : $permalink_manager_options;
268
269 $permalink_manager_unfiltered_options['general']['trailing_slashes_redirect'] = 1;
270 $permalink_manager_unfiltered_options['general']['trailing_slashes'] = ( $permalink_manager_options['general']['trailing_slashes'] == 10 ) ? 1 : 2;
271 }
272
273 // Save the settings in database
274 if ( ! empty( $permalink_manager_unfiltered_options ) ) {
275 update_option( 'permalink-manager', $permalink_manager_unfiltered_options );
276 }
277
278 // Remove obsolete 'permalink-manager-alerts' from wp_options table
279 if ( get_option( 'permalink-manager-alerts' ) ) {
280 delete_option( 'permalink-manager-alerts' );
281 }
282 }
283
284 /**
285 * Return the array of deprecated hooks
286 *
287 * @return array
288 */
289 function deprecated_hooks_list() {
290 return array(
291 'permalink_manager_default_options' => 'permalink-manager-default-options',
292 'permalink_manager_options' => 'permalink-manager-options',
293 'permalink_manager_uris' => 'permalink-manager-uris',
294 'permalink_manager_redirects' => 'permalink-manager-redirects',
295 'permalink_manager_external_redirects' => 'permalink-manager-external-redirects',
296 'permalink_manager_permastructs' => 'permalink-manager-permastructs',
297
298 'permalink_manager_alerts' => 'permalink-manager-alerts',
299 'permalink_manager_before_sections' => 'permalink-manager-before-sections',
300 'permalink_manager_sections' => 'permalink-manager-sections',
301 'permalink_manager_after_sections' => 'permalink-manager-after-sections',
302
303 'permalink_manager_field_args' => 'permalink-manager-field-args',
304 'permalink_manager_field_output' => 'permalink-manager-field-output',
305
306 'permalink_manager_deep_uri_detect' => 'permalink-manager-deep-uri-detect',
307 'permalink_manager_detect_uri' => 'permalink-manager-detect-uri',
308 'permalink_manager_detected_element_id' => 'permalink-manager-detected-initial-id',
309 'permalink_manager_detected_term_id' => 'permalink-manager-detected-term-id',
310 'permalink_manager_detected_post_id' => 'permalink-manager-detected-post-id',
311
312 'permalink_manager_primary_term' => 'permalink-manager-primary-term',
313 'permalink_manager_disabled_post_types' => 'permalink-manager-disabled-post-types',
314 'permalink_manager_disabled_taxonomies' => 'permalink-manager-disabled-taxonomies',
315 'permalink_manager_endpoints' => 'permalink-manager-endpoints',
316 'permalink_manager_filter_permalink_base' => 'permalink_manager-filter-permalink-base',
317 'permalink_manager_force_lowercase_uris' => 'permalink-manager-force-lowercase-uris',
318
319 'permalink_manager_uri_editor_extra_info' => 'permalink-manager-uri-editor-extra-info',
320 'permalink_manager_debug_fields' => 'permalink-manager-debug-fields',
321 'permalink_manager_permastructs_fields' => 'permalink-manager-permastructs-fields',
322 'permalink_manager_settings_fields' => 'permalink-manager-settings-fields',
323 'permalink_manager_tools_fields' => 'permalink-manager-tools-fields',
324
325 'permalink_manager_uri_editor_columns' => 'permalink-manager-uri-editor-columns',
326 'permalink_manager_uri_editor_column_content' => 'permalink-manager-uri-editor-column-content',
327
328 'permalink_manager_redirect_shop_archive' => 'permalink-manager-redirect-shop-archive'
329 );
330 }
331
332 /**
333 * Map the deprecated hooks to their relevant equivalents.
334 */
335 function deprecated_hooks() {
336 $deprecated_filters = $this->deprecated_hooks_list();
337 foreach ( $deprecated_filters as $new => $old ) {
338 add_filter( $new, array( $this, 'deprecated_hooks_mapping' ), - 1000, 8 );
339 }
340 }
341
342 /**
343 * Apply the deprecated filters to the relevant hooks
344 *
345 * @param mixed $data
346 *
347 * @return mixed
348 */
349 function deprecated_hooks_mapping( $data ) {
350 $deprecated_filters = $this->deprecated_hooks_list();
351 $filter = current_filter();
352
353 if ( isset( $deprecated_filters[ $filter ] ) ) {
354 if ( has_filter( $deprecated_filters[ $filter ] ) ) {
355 do_action( 'deprecated_function_run', $deprecated_filters[ $filter ], $filter, '2.4.3' );
356
357 $args = func_get_args();
358 $data = apply_filters_ref_array( $deprecated_filters[ $filter ], $args );
359 }
360 }
361
362 return $data;
363 }
364
365 /**
366 * Deactivate Permalink Manager Lite if Permalink Manager Pro is enabled
367 */
368 function is_pro_activated() {
369 if ( function_exists( 'is_plugin_active' ) && is_plugin_active( 'permalink-manager/permalink-manager.php' ) && is_plugin_active( 'permalink-manager-pro/permalink-manager.php' ) ) {
370 deactivate_plugins( 'permalink-manager/permalink-manager.php' );
371 }
372 }
373
374 }
375
376 /**
377 * Begins execution of the plugin
378 */
379 function run_permalink_manager() {
380 global $permalink_manager;
381
382 // Do not run when Elementor is opened
383 if ( ( ! empty( $_REQUEST['action'] ) && is_string( $_REQUEST['action'] ) && strpos( $_REQUEST['action'], 'elementor' ) !== false ) || isset( $_REQUEST['elementor-preview'] ) || isset( $_REQUEST['disable-pm'] ) ) {
384 return;
385 }
386
387 $permalink_manager = new Permalink_Manager_Class();
388 }
389
390 run_permalink_manager();
391 }