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