PluginProbe ʕ •ᴥ•ʔ
Permalink Manager Lite / 2.4.4
Permalink Manager Lite v2.4.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 / 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
384 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.4
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.1.2
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.4' );
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 'gutenberg' => 'Permalink_Manager_Gutenberg',
69 'debug' => 'Permalink_Manager_Debug_Functions',
70 'pro-functions' => 'Permalink_Manager_Pro_Functions'
71 ),
72 'integrations' => array(
73 'third-parties' => 'Permalink_Manager_Third_Parties',
74 'woocommerce' => 'Permalink_Manager_WooCommerce',
75 'seo-plugins' => 'Permalink_Manager_SEO_Plugins',
76 'language-plugins' => 'Permalink_Manager_Language_Plugins'
77 ),
78 'views' => array(
79 'ui-elements' => 'Permalink_Manager_UI_Elements',
80 'uri-editor' => 'Permalink_Manager_URI_Editor',
81 'tools' => 'Permalink_Manager_Tools',
82 'permastructs' => 'Permalink_Manager_Permastructs',
83 'settings' => 'Permalink_Manager_Settings',
84 'debug' => 'Permalink_Manager_Debug',
85 'pro-addons' => 'Permalink_Manager_Pro_Addons',
86 'help' => 'Permalink_Manager_Help',
87 'uri-editor-tax' => false,
88 'uri-editor-post' => false
89 )
90 );
91
92 // Load classes and set-up their instances
93 foreach ( $classes as $class_type => $classes_array ) {
94 foreach ( $classes_array as $class => $class_name ) {
95 $filename = PERMALINK_MANAGER_DIR . "/includes/{$class_type}/permalink-manager-{$class}.php";
96
97 if ( file_exists( $filename ) ) {
98 require_once $filename;
99 if ( $class_name ) {
100 $this->functions[ $class ] = new $class_name();
101 }
102 }
103 }
104 }
105 }
106
107 /**
108 * Register general hooks
109 */
110 public function register_init_hooks() {
111 // Localize plugin
112 add_action( 'init', array( $this, 'localize_me' ), 1 );
113
114 // Support deprecated hooks
115 add_action( 'plugins_loaded', array( $this, 'deprecated_hooks' ), 9 );
116
117 // Deactivate free version if Permalink Manager Pro is activated
118 add_action( 'plugins_loaded', array( $this, 'is_pro_activated' ), 9 );
119
120 // Load globals & options
121 add_action( 'plugins_loaded', array( $this, 'get_options_and_globals' ), 9 );
122
123 // Legacy support
124 add_action( 'init', array( $this, 'legacy_support' ), 2 );
125
126 // Default settings & alerts
127 add_filter( 'permalink_manager_options', array( $this, 'default_settings' ), 1 );
128 add_filter( 'permalink_manager_alerts', array( $this, 'default_alerts' ), 1 );
129 }
130
131 /**
132 * Localize this plugin
133 */
134 function localize_me() {
135 load_plugin_textdomain( 'permalink-manager', false, basename( dirname( __FILE__ ) ) . "/languages" );
136 }
137
138 /**
139 * Get options values & set global variables
140 */
141 public function get_options_and_globals() {
142 // 1. Globals with data stored in DB
143 global $permalink_manager_options, $permalink_manager_uris, $permalink_manager_permastructs, $permalink_manager_redirects, $permalink_manager_external_redirects;
144
145 $permalink_manager_options = (array) apply_filters( 'permalink_manager_options', get_option( 'permalink-manager', array() ) );
146 $permalink_manager_uris = (array) apply_filters( 'permalink_manager_uris', get_option( 'permalink-manager-uris', array() ) );
147 $permalink_manager_permastructs = (array) apply_filters( 'permalink_manager_permastructs', get_option( 'permalink-manager-permastructs', array() ) );
148 $permalink_manager_redirects = (array) apply_filters( 'permalink_manager_redirects', get_option( 'permalink-manager-redirects', array() ) );
149 $permalink_manager_external_redirects = (array) apply_filters( 'permalink_manager_external_redirects', get_option( 'permalink-manager-external-redirects', array() ) );
150
151 // 2. Globals used to display additional content (e.g. alerts)
152 global $permalink_manager_alerts, $permalink_manager_before_sections_html, $permalink_manager_after_sections_html;
153
154 $permalink_manager_alerts = apply_filters( 'permalink_manager_alerts', array() );
155 $permalink_manager_before_sections_html = apply_filters( 'permalink_manager_before_sections', '' );
156 $permalink_manager_after_sections_html = apply_filters( 'permalink_manager_after_sections', '' );
157 }
158
159 /**
160 * Set the initial/default settings (including "Screen Options")
161 *
162 * @param array $settings
163 *
164 * @return array
165 */
166 public function default_settings( $settings ) {
167 $default_settings = apply_filters( 'permalink_manager_default_options', array(
168 'screen-options' => array(
169 'per_page' => 20,
170 'post_statuses' => array( 'publish' ),
171 'group' => false
172 ),
173 'general' => array(
174 'auto_update_uris' => 0,
175 'show_native_slug_field' => 0,
176 'pagination_redirect' => 0,
177 'sslwww_redirect' => 1,
178 'canonical_redirect' => 1,
179 'old_slug_redirect' => 0,
180 'setup_redirects' => 0,
181 'redirect' => '301',
182 'extra_redirects' => 1,
183 'copy_query_redirect' => 1,
184 'trailing_slashes' => 0,
185 'trailing_slash_redirect' => 1,
186 'auto_fix_duplicates' => 0,
187 'fix_language_mismatch' => 0,
188 'wpml_support' => 1,
189 'pmxi_support' => 1,
190 'um_support' => 1,
191 'yoast_breadcrumbs' => 0,
192 'rankmath_redirect' => 1,
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 // Separate "Trailing slashes" & "Trailing slashes redirect" setting fields
259 if ( ! empty( $permalink_manager_options['general']['trailing_slashes'] ) && $permalink_manager_options['general']['trailing_slashes'] >= 10 ) {
260 $permalink_manager_unfiltered_options = ( ! empty( $permalink_manager_unfiltered_options ) ) ? $permalink_manager_unfiltered_options : $permalink_manager_options;
261
262 $permalink_manager_unfiltered_options['general']['trailing_slashes_redirect'] = 1;
263 $permalink_manager_unfiltered_options['general']['trailing_slashes'] = ( $permalink_manager_options['general']['trailing_slashes'] == 10 ) ? 1 : 2;
264 }
265
266 // Save the settings in database
267 if ( ! empty( $permalink_manager_unfiltered_options ) ) {
268 update_option( 'permalink-manager', $permalink_manager_unfiltered_options );
269 }
270
271 // Remove obsolete 'permalink-manager-alerts' from wp_options table
272 if ( get_option( 'permalink-manager-alerts' ) ) {
273 delete_option( 'permalink-manager-alerts' );
274 }
275 }
276
277 /**
278 * Return the array of deprecated hooks
279 *
280 * @return array
281 */
282 function deprecated_hooks_list() {
283 return array(
284 'permalink_manager_default_options' => 'permalink-manager-default-options',
285 'permalink_manager_options' => 'permalink-manager-options',
286 'permalink_manager_uris' => 'permalink-manager-uris',
287 'permalink_manager_redirects' => 'permalink-manager-redirects',
288 'permalink_manager_external_redirects' => 'permalink-manager-external-redirects',
289 'permalink_manager_permastructs' => 'permalink-manager-permastructs',
290
291 'permalink_manager_alerts' => 'permalink-manager-alerts',
292 'permalink_manager_before_sections' => 'permalink-manager-before-sections',
293 'permalink_manager_sections' => 'permalink-manager-sections',
294 'permalink_manager_after_sections' => 'permalink-manager-after-sections',
295
296 'permalink_manager_field_args' => 'permalink-manager-field-args',
297 'permalink_manager_field_output' => 'permalink-manager-field-output',
298
299 'permalink_manager_deep_uri_detect' => 'permalink-manager-deep-uri-detect',
300 'permalink_manager_detect_uri' => 'permalink-manager-detect-uri',
301 'permalink_manager_detected_element_id' => 'permalink-manager-detected-initial-id',
302 'permalink_manager_detected_term_id' => 'permalink-manager-detected-term-id',
303 'permalink_manager_detected_post_id' => 'permalink-manager-detected-post-id',
304
305 'permalink_manager_primary_term' => 'permalink-manager-primary-term',
306 'permalink_manager_disabled_post_types' => 'permalink-manager-disabled-post-types',
307 'permalink_manager_disabled_taxonomies' => 'permalink-manager-disabled-taxonomies',
308 'permalink_manager_endpoints' => 'permalink-manager-endpoints',
309 'permalink_manager_filter_permalink_base' => 'permalink_manager-filter-permalink-base',
310 'permalink_manager_force_lowercase_uris' => 'permalink-manager-force-lowercase-uris',
311
312 'permalink_manager_uri_editor_extra_info' => 'permalink-manager-uri-editor-extra-info',
313 'permalink_manager_debug_fields' => 'permalink-manager-debug-fields',
314 'permalink_manager_permastructs_fields' => 'permalink-manager-permastructs-fields',
315 'permalink_manager_settings_fields' => 'permalink-manager-settings-fields',
316 'permalink_manager_tools_fields' => 'permalink-manager-tools-fields',
317
318 'permalink_manager_uri_editor_columns' => 'permalink-manager-uri-editor-columns',
319 'permalink_manager_uri_editor_column_content' => 'permalink-manager-uri-editor-column-content',
320
321 'permalink_manager_redirect_shop_archive' => 'permalink-manager-redirect-shop-archive'
322 );
323 }
324
325 /**
326 * Map the deprecated hooks to their relevant equivalents.
327 */
328 function deprecated_hooks() {
329 $deprecated_filters = $this->deprecated_hooks_list();
330 foreach ( $deprecated_filters as $new => $old ) {
331 add_filter( $new, array( $this, 'deprecated_hooks_mapping' ), - 1000, 8 );
332 }
333 }
334
335 /**
336 * Apply the deprecated filters to the relevant hooks
337 *
338 * @param mixed $data
339 *
340 * @return mixed
341 */
342 function deprecated_hooks_mapping( $data ) {
343 $deprecated_filters = $this->deprecated_hooks_list();
344 $filter = current_filter();
345
346 if ( isset( $deprecated_filters[ $filter ] ) ) {
347 if ( has_filter( $deprecated_filters[ $filter ] ) ) {
348 do_action( 'deprecated_function_run', $deprecated_filters[ $filter ], $filter, '2.4.3' );
349
350 $args = func_get_args();
351 $data = apply_filters_ref_array( $deprecated_filters[ $filter ], $args );
352 }
353 }
354
355 return $data;
356 }
357
358 /**
359 * Deactivate Permalink Manager Lite if Permalink Manager Pro is enabled
360 */
361 function is_pro_activated() {
362 if ( function_exists( 'is_plugin_active' ) && is_plugin_active( 'permalink-manager/permalink-manager.php' ) && is_plugin_active( 'permalink-manager-pro/permalink-manager.php' ) ) {
363 deactivate_plugins( 'permalink-manager/permalink-manager.php' );
364 }
365 }
366
367 }
368
369 /**
370 * Begins execution of the plugin
371 */
372 function run_permalink_manager() {
373 global $permalink_manager;
374
375 // Do not run when Elementor is opened
376 if ( ( ! empty( $_REQUEST['action'] ) && is_string( $_REQUEST['action'] ) && strpos( $_REQUEST['action'], 'elementor' ) !== false ) || isset( $_REQUEST['elementor-preview'] ) || isset( $_REQUEST['disable-pm'] ) ) {
377 return;
378 }
379
380 $permalink_manager = new Permalink_Manager_Class();
381 }
382
383 run_permalink_manager();
384 }