PluginProbe ʕ •ᴥ•ʔ
Permalink Manager Lite / 2.2.12
Permalink Manager Lite v2.2.12
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
369 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.12
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: 5.5.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.2.12' );
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', null));
138 $this->permalink_manager_uris = $permalink_manager_uris = (array) apply_filters('permalink_manager_uris', get_option('permalink-manager-uris', null));
139 $this->permalink_manager_permastructs = $permalink_manager_permastructs = (array) apply_filters('permalink_manager_permastructs', get_option('permalink-manager-permastructs', null));
140 $this->permalink_manager_redirects = $permalink_manager_redirects = (array) apply_filters('permalink_manager_redirects', get_option('permalink-manager-redirects', null));
141 $this->permalink_manager_external_redirects = $permalink_manager_external_redirects = (array) apply_filters('permalink_manager_external_redirects', get_option('permalink-manager-external-redirects', null));
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 'pmxi_support' => 1,
177 'um_support' => 1,
178 'yoast_breadcrumbs' => 0,
179 'force_custom_slugs' => 0,
180 'disable_slug_sanitization' => 0,
181 'keep_accents' => 0,
182 'partial_disable' => array(
183 'post_types' => array('attachment', 'tribe_events')
184 ),
185 'deep_detect' => 1,
186 'ignore_drafts' => 0,
187 'edit_uris_cap' => 'publish_posts',
188 ),
189 'licence' => array()
190 ));
191
192 // Apply the default settings (if empty values) in all settings sections
193 foreach($default_settings as $group_name => $fields) {
194 foreach($fields as $field_name => $field) {
195 if(!isset($settings[$group_name][$field_name]) && $field_name !== 'partial_disable') {
196 $settings[$group_name][$field_name] = $field;
197 }
198 }
199 }
200
201 return $settings;
202 }
203
204 /**
205 * Set the initial/default admin notices
206 */
207 public function default_alerts($alerts) {
208 $default_alerts = apply_filters('permalink_manager_default_alerts', array(
209 'jan21' => array(
210 'txt' => sprintf(
211 __("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"),
212 PERMALINK_MANAGER_WEBSITE . "&utm_campaign=discount_code",
213 '20&#37;',
214 'NEWYEAR21',
215 '09.01'
216 ),
217 'type' => 'notice-info',
218 'show' => 'pro_hide',
219 'plugin_only' => true,
220 'until' => '2021-01-09'
221 )
222 ));
223
224 // Apply the default settings (if empty values) in all settings sections
225 return (array) $alerts + (array) $default_alerts;
226 }
227
228 /**
229 * Temporary hook
230 */
231 function legacy_support() {
232 global $permalink_manager_permastructs, $permalink_manager_options;
233
234 if(isset($permalink_manager_options['base-editor'])) {
235 $new_options['post_types'] = $permalink_manager_options['base-editor'];
236 update_option('permalink-manager-permastructs', $new_options);
237 }
238 else if(empty($permalink_manager_permastructs['post_types']) && empty($permalink_manager_permastructs['taxonomies']) && count($permalink_manager_permastructs) > 0) {
239 $new_options['post_types'] = $permalink_manager_permastructs;
240 update_option('permalink-manager-permastructs', $new_options);
241 }
242
243 // Adjust options structure
244 if(!empty($permalink_manager_options['miscellaneous'])) {
245 // Combine general & miscellaneous options
246 $permalink_manager_unfiltered_options['general'] = array_merge($permalink_manager_unfiltered_options['general'], $permalink_manager_unfiltered_options['miscellaneous']);
247
248 // Move licence key to different section
249 $permalink_manager_unfiltered_options['licence']['licence_key'] = (!empty($permalink_manager_unfiltered_options['miscellaneous']['license_key'])) ? $permalink_manager_unfiltered_options['miscellaneous']['license_key'] : "";
250 }
251
252 // Separate "Trailing slashes" & "Trailing slashes redirect" setting fields
253 if(!empty($permalink_manager_options['general']['trailing_slashes']) && $permalink_manager_options['general']['trailing_slashes'] >= 10) {
254 $permalink_manager_unfiltered_options = (!empty($permalink_manager_unfiltered_options)) ? $permalink_manager_unfiltered_options : $permalink_manager_options;
255
256 $permalink_manager_unfiltered_options['general']['trailing_slashes_redirect'] = 1;
257 $permalink_manager_unfiltered_options['general']['trailing_slashes'] = ($permalink_manager_options['general']['trailing_slashes'] == 10) ? 1 : 2;
258 }
259
260 // Adjust WP All Import suport mode
261 if(isset($permalink_manager_options['general']['pmxi_import_support'])) {
262 $permalink_manager_unfiltered_options = (!empty($permalink_manager_unfiltered_options)) ? $permalink_manager_unfiltered_options : $permalink_manager_options;
263
264 $permalink_manager_unfiltered_options['general']['pmxi_support'] = (empty($permalink_manager_options['general']['pmxi_import_support'])) ? 1 : 0;
265 unset($permalink_manager_unfiltered_options['general']['pmxi_import_support']);
266 }
267
268 // Save the settings in database
269 if(!empty($permalink_manager_unfiltered_options)) {
270 update_option('permalink-manager', $permalink_manager_unfiltered_options);
271 }
272 }
273
274 /**
275 * Support deprecated hooks
276 */
277 function deprecated_hooks_list($filters = true) {
278 $deprecated_filters = array(
279 'permalink_manager_default_options' => 'permalink-manager-default-options',
280 'permalink_manager_options' => 'permalink-manager-options',
281 'permalink_manager_uris' => 'permalink-manager-uris',
282 'permalink_manager_alerts' => 'permalink-manager-alerts',
283 'permalink_manager_redirects' => 'permalink-manager-redirects',
284 'permalink_manager_external_redirects' => 'permalink-manager-external-redirects',
285 'permalink_manager_permastructs' => 'permalink-manager-permastructs',
286
287 'permalink_manager_alerts' => 'permalink-manager-alerts',
288 'permalink_manager_before_sections' => 'permalink-manager-before-sections',
289 'permalink_manager_sections' => 'permalink-manager-sections',
290 'permalink_manager_after_sections' => 'permalink-manager-after-sections',
291
292 'permalink_manager_field_args' => 'permalink-manager-field-args',
293 'permalink_manager_field_output' => 'permalink-manager-field-output',
294
295 'permalink_manager_deep_uri_detect' => 'permalink-manager-deep-uri-detect',
296 'permalink_manager_detect_uri' => 'permalink-manager-detect-uri',
297 'permalink_manager_detected_element_id' => 'permalink-manager-detected-initial-id',
298 'permalink_manager_detected_term_id' => 'permalink-manager-detected-term-id',
299 'permalink_manager_detected_post_id' => 'permalink-manager-detected-post-id',
300
301 'permalink_manager_primary_term' => 'permalink-manager-primary-term',
302 'permalink_manager_disabled_post_types' => 'permalink-manager-disabled-post-types',
303 'permalink_manager_disabled_taxonomies' => 'permalink-manager-disabled-taxonomies',
304 'permalink_manager_endpoints' => 'permalink-manager-endpoints',
305 'permalink_manager_filter_permalink_base' => 'permalink_manager-filter-permalink-base',
306 'permalink_manager_force_lowercase_uris' => 'permalink-manager-force-lowercase-uris',
307
308 'permalink_manager_uri_editor_extra_info' => 'permalink-manager-uri-editor-extra-info',
309 'permalink_manager_debug_fields' => 'permalink-manager-debug-fields',
310 'permalink_manager_permastructs_fields' => 'permalink-manager-permastructs-fields',
311 'permalink_manager_settings_fields' => 'permalink-manager-settings-fields',
312 'permalink_manager_tools_fields' => 'permalink-manager-tools-fields',
313
314 'permalink_manager_uri_editor_columns' => 'permalink-manager-uri-editor-columns',
315 'permalink_manager_uri_editor_column_content' => 'permalink-manager-uri-editor-column-content',
316
317 'permalink_manager_redirect_shop_archive' => 'permalink-manager-redirect-shop-archive'
318 );
319
320 return ($filters) ? $deprecated_filters : array();
321 }
322
323 function deprecated_hooks() {
324 $deprecated_filters = (array) $this->deprecated_hooks_list(true);
325 foreach($deprecated_filters as $new => $old) {
326 add_filter($new, array($this, 'deprecated_hooks_mapping'), -1000, 8);
327 }
328 }
329
330 function deprecated_hooks_mapping($data) {
331 $deprecated_filters = $this->deprecated_hooks_list(true);
332 $filter = current_filter();
333
334 if(isset($deprecated_filters[$filter])) {
335 if(has_filter($deprecated_filters[$filter])) {
336 $args = func_get_args();
337 $data = apply_filters_ref_array($deprecated_filters[$filter], $args);
338 }
339 }
340
341 return $data;
342 }
343
344 /**
345 * Deactivate Permalink Manager Lite if Permalink Manager Pro is enabled
346 */
347 function is_pro_activated() {
348 if(function_exists('is_plugin_active') && is_plugin_active('permalink-manager/permalink-manager.php') && is_plugin_active('permalink-manager-pro/permalink-manager.php')) {
349 deactivate_plugins('permalink-manager/permalink-manager.php');
350 }
351 }
352
353 }
354
355 /**
356 * Begins execution of the plugin.
357 */
358 function run_permalink_manager() {
359 global $permalink_manager;
360
361 // Do not run when Elementor is opened
362 if((!empty($_REQUEST['action']) && strpos($_REQUEST['action'], 'elementor') !== false) || isset($_REQUEST['elementor-preview'])) { return; }
363
364 $permalink_manager = new Permalink_Manager_Class();
365 }
366
367 run_permalink_manager();
368 }
369