PluginProbe ʕ •ᴥ•ʔ
Permalink Manager Lite / 2.2.17
Permalink Manager Lite v2.2.17
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 4 years ago languages 4 years ago out 4 years ago LICENSE.txt 4 years ago README.txt 4 years ago permalink-manager.php 4 years ago
permalink-manager.php
373 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.2.17
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: 6.4.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.2.17' );
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', 'http://permalinkmanager.pro?utm_source=plugin' );
34 define( 'PERMALINK_MANAGER_DONATE', 'https://www.paypal.me/Bismit' );
35
36 class Permalink_Manager_Class {
37
38 public $permalink_manager_options_page, $permalink_manager_options;
39 public $sections, $functions, $permalink_manager_before_sections_html, $permalink_manager_after_sections_html;
40
41 /**
42 * Get options from DB, load subclasses & hooks
43 */
44 public function __construct() {
45 $this->include_subclassess();
46 $this->register_init_hooks();
47 }
48
49 /**
50 * Include back-end classess and set their instances
51 */
52 function include_subclassess() {
53 // WP_List_Table needed for post types & taxnomies editors
54 if( ! class_exists( 'WP_List_Table' ) ) {
55 require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
56 }
57
58 $classes = array(
59 'core' => array(
60 'helper-functions' => 'Permalink_Manager_Helper_Functions',
61 'uri-functions' => 'Permalink_Manager_URI_Functions',
62 'uri-functions-post' => 'Permalink_Manager_URI_Functions_Post',
63 'uri-functions-tax' => 'Permalink_Manager_URI_Functions_Tax',
64 'admin-functions' => 'Permalink_Manager_Admin_Functions',
65 'actions' => 'Permalink_Manager_Actions',
66 'third-parties' => 'Permalink_Manager_Third_Parties',
67 'language-plugins' => 'Permalink_Manager_Language_Plugins',
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 'views' => array(
74 'uri-editor' => 'Permalink_Manager_Uri_Editor',
75 'tools' => 'Permalink_Manager_Tools',
76 'permastructs' => 'Permalink_Manager_Permastructs',
77 'settings' => 'Permalink_Manager_Settings',
78 'debug' => 'Permalink_Manager_Debug',
79 'pro-addons' => 'Permalink_Manager_Pro_Addons',
80 'help' => 'Permalink_Manager_Help',
81 'uri-editor-tax' => false,
82 'uri-editor-post' => false
83 )
84 );
85
86 // Load classes and set-up their instances
87 foreach($classes as $class_type => $classes_array) {
88 foreach($classes_array as $class => $class_name) {
89 $filename = PERMALINK_MANAGER_DIR . "/includes/{$class_type}/permalink-manager-{$class}.php";
90
91 if(file_exists($filename)) {
92 require_once $filename;
93 if($class_name) { $this->functions[$class] = new $class_name(); }
94 }
95 }
96 }
97 }
98
99 /**
100 * Register general hooks
101 */
102 public function register_init_hooks() {
103 // Localize plugin
104 add_action( 'init', array($this, 'localize_me'), 1 );
105
106 // Support deprecated hooks
107 add_action( 'plugins_loaded', array($this, 'deprecated_hooks'), 9 );
108
109 // Deactivate free version if Permalink Manager Pro is activated
110 add_action( 'plugins_loaded', array($this, 'is_pro_activated'), 9 );
111
112 // Load globals & options
113 add_action( 'plugins_loaded', array($this, 'get_options_and_globals'), 9 );
114
115 // Legacy support
116 add_action( 'init', array($this, 'legacy_support'), 2 );
117
118 // Default settings & alerts
119 add_filter( 'permalink_manager_options', array($this, 'default_settings'), 1 );
120 add_filter( 'permalink_manager_alerts', array($this, 'default_alerts'), 1 );
121 }
122
123 /**
124 * Localize this plugin
125 */
126 function localize_me() {
127 load_plugin_textdomain( 'permalink-manager', false, basename(dirname(__FILE__)) . "/languages" );
128 }
129
130 /**
131 * Get options values & set global
132 */
133 public function get_options_and_globals() {
134 // 1. Globals with data stored in DB
135 global $permalink_manager_options, $permalink_manager_uris, $permalink_manager_permastructs, $permalink_manager_redirects, $permalink_manager_external_redirects;
136
137 $this->permalink_manager_options = $permalink_manager_options = (array) apply_filters('permalink_manager_options', get_option('permalink-manager', array()));
138 $this->permalink_manager_uris = $permalink_manager_uris = (array) apply_filters('permalink_manager_uris', get_option('permalink-manager-uris', array()));
139 $this->permalink_manager_permastructs = $permalink_manager_permastructs = (array) apply_filters('permalink_manager_permastructs', get_option('permalink-manager-permastructs', array()));
140 $this->permalink_manager_redirects = $permalink_manager_redirects = (array) apply_filters('permalink_manager_redirects', get_option('permalink-manager-redirects', array()));
141 $this->permalink_manager_external_redirects = $permalink_manager_external_redirects = (array) apply_filters('permalink_manager_external_redirects', get_option('permalink-manager-external-redirects', array()));
142
143 // 2. Globals used to display additional content (eg. alerts)
144 global $permalink_manager_alerts, $permalink_manager_before_sections_html, $permalink_manager_after_sections_html;
145
146 $this->permalink_manager_alerts = $permalink_manager_alerts = apply_filters('permalink_manager_alerts', get_option('permalink-manager-alerts', array()));
147 $this->permalink_manager_before_sections_html = $permalink_manager_before_sections_html = apply_filters('permalink_manager_before_sections', '');
148 $this->permalink_manager_after_sections_html = $permalink_manager_after_sections_html = apply_filters('permalink_manager_after_sections', '');
149 }
150
151 /**
152 * Set the initial/default settings (including "Screen Options")
153 */
154 public function default_settings($settings) {
155 $default_settings = apply_filters('permalink_manager_default_options', array(
156 'screen-options' => array(
157 'per_page' => 20,
158 'post_statuses' => array('publish'),
159 'group' => false,
160 ),
161 'general' => array(
162 'auto_update_uris' => 0,
163 'show_native_slug_field' => 0,
164 'pagination_redirect' => 0,
165 'sslwww_redirect' => 0,
166 'canonical_redirect' => 1,
167 'old_slug_redirect' => 0,
168 'setup_redirects' => 0,
169 'redirect' => '301',
170 'extra_redirects' => 1,
171 'copy_query_redirect' => 1,
172 'trailing_slashes' => 0,
173 'trailing_slash_redirect' => 0,
174 'auto_fix_duplicates' => 0,
175 'fix_language_mismatch' => 1,
176 'wpml_support' => 1,
177 'pmxi_support' => 1,
178 'um_support' => 1,
179 'yoast_breadcrumbs' => 0,
180 'primary_category' => 1,
181 'force_custom_slugs' => 0,
182 'disable_slug_sanitization' => 0,
183 'keep_accents' => 0,
184 'partial_disable' => array(
185 'post_types' => array('attachment', 'tribe_events')
186 ),
187 'ignore_drafts' => 1,
188 'edit_uris_cap' => 'publish_posts',
189 ),
190 'licence' => array()
191 ));
192
193 // Check if settings array is empty
194 $settings_empty = empty($settings);
195
196 // Apply the default settings (if empty values) in all settings sections
197 foreach($default_settings as $group_name => $fields) {
198 foreach($fields as $field_name => $field) {
199 if($settings_empty || (!isset($settings[$group_name][$field_name]) && $field_name !== 'partial_disable')) {
200 $settings[$group_name][$field_name] = $field;
201 }
202 }
203 }
204
205 return $settings;
206 }
207
208 /**
209 * Set the initial/default admin notices
210 */
211 public function default_alerts($alerts) {
212 $default_alerts = apply_filters('permalink_manager_default_alerts', array(
213 'jan21' => array(
214 'txt' => sprintf(
215 __("Get access to extra features: full taxonomy and WooCommerce support, possibility to use custom fields inside the permalinks and more!<br /><strong>Buy Permalink Manager Pro <a href=\"%s\" target=\"_blank\">here</a> and save %s using \"%s\" coupon code!</strong> Valid until %s!", "permalink-manager"),
216 PERMALINK_MANAGER_WEBSITE . "&utm_campaign=discount_code",
217 '20&#37;',
218 'NEWYEAR21',
219 '09.01'
220 ),
221 'type' => 'notice-info',
222 'show' => 'pro_hide',
223 'plugin_only' => true,
224 'until' => '2021-01-09'
225 )
226 ));
227
228 // Apply the default settings (if empty values) in all settings sections
229 return (array) $alerts + (array) $default_alerts;
230 }
231
232 /**
233 * Temporary hook
234 */
235 function legacy_support() {
236 global $permalink_manager_permastructs, $permalink_manager_options;
237
238 if(isset($permalink_manager_options['base-editor'])) {
239 $new_options['post_types'] = $permalink_manager_options['base-editor'];
240 update_option('permalink-manager-permastructs', $new_options);
241 }
242 else if(empty($permalink_manager_permastructs['post_types']) && empty($permalink_manager_permastructs['taxonomies']) && count($permalink_manager_permastructs) > 0) {
243 $new_options['post_types'] = $permalink_manager_permastructs;
244 update_option('permalink-manager-permastructs', $new_options);
245 }
246
247 // Adjust options structure
248 if(!empty($permalink_manager_options['miscellaneous'])) {
249 // Combine general & miscellaneous options
250 $permalink_manager_unfiltered_options['general'] = array_merge($permalink_manager_unfiltered_options['general'], $permalink_manager_unfiltered_options['miscellaneous']);
251
252 // Move licence key to different section
253 $permalink_manager_unfiltered_options['licence']['licence_key'] = (!empty($permalink_manager_unfiltered_options['miscellaneous']['license_key'])) ? $permalink_manager_unfiltered_options['miscellaneous']['license_key'] : "";
254 }
255
256 // Separate "Trailing slashes" & "Trailing slashes redirect" setting fields
257 if(!empty($permalink_manager_options['general']['trailing_slashes']) && $permalink_manager_options['general']['trailing_slashes'] >= 10) {
258 $permalink_manager_unfiltered_options = (!empty($permalink_manager_unfiltered_options)) ? $permalink_manager_unfiltered_options : $permalink_manager_options;
259
260 $permalink_manager_unfiltered_options['general']['trailing_slashes_redirect'] = 1;
261 $permalink_manager_unfiltered_options['general']['trailing_slashes'] = ($permalink_manager_options['general']['trailing_slashes'] == 10) ? 1 : 2;
262 }
263
264 // Adjust WP All Import suport mode
265 if(isset($permalink_manager_options['general']['pmxi_import_support'])) {
266 $permalink_manager_unfiltered_options = (!empty($permalink_manager_unfiltered_options)) ? $permalink_manager_unfiltered_options : $permalink_manager_options;
267
268 $permalink_manager_unfiltered_options['general']['pmxi_support'] = (empty($permalink_manager_options['general']['pmxi_import_support'])) ? 1 : 0;
269 unset($permalink_manager_unfiltered_options['general']['pmxi_import_support']);
270 }
271
272 // Save the settings in database
273 if(!empty($permalink_manager_unfiltered_options)) {
274 update_option('permalink-manager', $permalink_manager_unfiltered_options);
275 }
276 }
277
278 /**
279 * Support deprecated hooks
280 */
281 function deprecated_hooks_list($filters = true) {
282 $deprecated_filters = array(
283 'permalink_manager_default_options' => 'permalink-manager-default-options',
284 'permalink_manager_options' => 'permalink-manager-options',
285 'permalink_manager_uris' => 'permalink-manager-uris',
286 'permalink_manager_alerts' => 'permalink-manager-alerts',
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 return ($filters) ? $deprecated_filters : array();
325 }
326
327 function deprecated_hooks() {
328 $deprecated_filters = (array) $this->deprecated_hooks_list(true);
329 foreach($deprecated_filters as $new => $old) {
330 add_filter($new, array($this, 'deprecated_hooks_mapping'), -1000, 8);
331 }
332 }
333
334 function deprecated_hooks_mapping($data) {
335 $deprecated_filters = $this->deprecated_hooks_list(true);
336 $filter = current_filter();
337
338 if(isset($deprecated_filters[$filter])) {
339 if(has_filter($deprecated_filters[$filter])) {
340 $args = func_get_args();
341 $data = apply_filters_ref_array($deprecated_filters[$filter], $args);
342 }
343 }
344
345 return $data;
346 }
347
348 /**
349 * Deactivate Permalink Manager Lite if Permalink Manager Pro is enabled
350 */
351 function is_pro_activated() {
352 if(function_exists('is_plugin_active') && is_plugin_active('permalink-manager/permalink-manager.php') && is_plugin_active('permalink-manager-pro/permalink-manager.php')) {
353 deactivate_plugins('permalink-manager/permalink-manager.php');
354 }
355 }
356
357 }
358
359 /**
360 * Begins execution of the plugin.
361 */
362 function run_permalink_manager() {
363 global $permalink_manager;
364
365 // Do not run when Elementor is opened
366 if((!empty($_REQUEST['action']) && strpos($_REQUEST['action'], 'elementor') !== false) || isset($_REQUEST['elementor-preview'])) { return; }
367
368 $permalink_manager = new Permalink_Manager_Class();
369 }
370
371 run_permalink_manager();
372 }
373