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