PluginProbe ʕ •ᴥ•ʔ
Permalink Manager Lite / 2.2.8.5
Permalink Manager Lite v2.2.8.5
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 6 years ago languages 6 years ago out 6 years ago LICENSE.txt 6 years ago README.txt 6 years ago permalink-manager.php 6 years ago
permalink-manager.php
354 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.8.5
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: 4.0.0
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.8.5' );
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-post' => 'Permalink_Manager_URI_Functions_Post',
62 'uri-functions-tax' => 'Permalink_Manager_URI_Functions_Tax',
63 'admin-functions' => 'Permalink_Manager_Admin_Functions',
64 'actions' => 'Permalink_Manager_Actions',
65 'third-parties' => 'Permalink_Manager_Third_Parties',
66 'language-plugins' => 'Permalink_Manager_Language_Plugins',
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 'views' => array(
73 'uri-editor' => 'Permalink_Manager_Uri_Editor',
74 'tools' => 'Permalink_Manager_Tools',
75 'permastructs' => 'Permalink_Manager_Permastructs',
76 'settings' => 'Permalink_Manager_Settings',
77 'debug' => 'Permalink_Manager_Debug',
78 'pro-addons' => 'Permalink_Manager_Pro_Addons',
79 'help' => 'Permalink_Manager_Help',
80 'uri-editor-tax' => false,
81 'uri-editor-post' => false
82 )
83 );
84
85 // Load classes and set-up their instances
86 foreach($classes as $class_type => $classes_array) {
87 foreach($classes_array as $class => $class_name) {
88 $filename = PERMALINK_MANAGER_DIR . "/includes/{$class_type}/permalink-manager-{$class}.php";
89
90 if(file_exists($filename)) {
91 require_once $filename;
92 if($class_name) { $this->functions[$class] = new $class_name(); }
93 }
94 }
95 }
96 }
97
98 /**
99 * Register general hooks
100 */
101 public function register_init_hooks() {
102 // Localize plugin
103 add_action( 'init', array($this, 'localize_me'), 1 );
104
105 // Support deprecated hooks
106 add_action( 'plugins_loaded', array($this, 'deprecated_hooks'), 9 );
107
108 // Deactivate free version if Permalink Manager Pro is activated
109 add_action( 'plugins_loaded', array($this, 'is_pro_activated'), 9 );
110
111 // Load globals & options
112 add_action( 'plugins_loaded', array($this, 'get_options_and_globals'), 9 );
113
114 // Legacy support
115 add_action( 'init', array($this, 'legacy_support'), 2 );
116
117 // Default settings & alerts
118 add_filter( 'permalink_manager_options', array($this, 'default_settings'), 1 );
119 add_filter( 'permalink_manager_alerts', array($this, 'default_alerts'), 1 );
120 }
121
122 /**
123 * Localize this plugin
124 */
125 function localize_me() {
126 load_plugin_textdomain( 'permalink-manager', false, basename(dirname(__FILE__)) . "/languages" );
127 }
128
129 /**
130 * Get options values & set global
131 */
132 public function get_options_and_globals() {
133 // 1. Globals with data stored in DB
134 global $permalink_manager_options, $permalink_manager_uris, $permalink_manager_permastructs, $permalink_manager_redirects, $permalink_manager_external_redirects;
135
136 $this->permalink_manager_options = $permalink_manager_options = apply_filters('permalink_manager_options', get_option('permalink-manager', array()));
137 $this->permalink_manager_uris = $permalink_manager_uris = apply_filters('permalink_manager_uris', get_option('permalink-manager-uris', array()));
138 $this->permalink_manager_permastructs = $permalink_manager_permastructs = apply_filters('permalink_manager_permastructs', get_option('permalink-manager-permastructs', array()));
139 $this->permalink_manager_redirects = $permalink_manager_redirects = apply_filters('permalink_manager_redirects', get_option('permalink-manager-redirects', array()));
140 $this->permalink_manager_external_redirects = $permalink_manager_external_redirects = apply_filters('permalink_manager_external_redirects', get_option('permalink-manager-external-redirects', array()));
141
142 // 2. Globals used to display additional content (eg. alerts)
143 global $permalink_manager_alerts, $permalink_manager_before_sections_html, $permalink_manager_after_sections_html;
144
145 $this->permalink_manager_alerts = $permalink_manager_alerts = apply_filters('permalink_manager_alerts', get_option('permalink-manager-alerts', array()));
146 $this->permalink_manager_before_sections_html = $permalink_manager_before_sections_html = apply_filters('permalink_manager_before_sections', '');
147 $this->permalink_manager_after_sections_html = $permalink_manager_after_sections_html = apply_filters('permalink_manager_after_sections', '');
148 }
149
150 /**
151 * Set the initial/default settings (including "Screen Options")
152 */
153 public function default_settings($settings) {
154 $default_settings = apply_filters('permalink_manager_default_options', array(
155 'screen-options' => array(
156 'per_page' => 20,
157 'post_statuses' => array('publish'),
158 'group' => false,
159 ),
160 'general' => array(
161 'auto_update_uris' => 0,
162 'show_native_slug_field' => 0,
163 'pagination_redirect' => 0,
164 'sslwww_redirect' => 0,
165 'canonical_redirect' => 1,
166 'old_slug_redirect' => 0,
167 'setup_redirects' => 0,
168 'redirect' => '301',
169 'trailing_slashes' => 0,
170 'trailing_slash_redirect' => 0,
171 'auto_remove_duplicates' => 1,
172 'fix_language_mismatch' => 1,
173 'pmxi_import_support' => 0,
174 'yoast_breadcrumbs' => 0,
175 'force_custom_slugs' => 0,
176 'disable_slug_sanitization' => 0,
177 'keep_accents' => 0,
178 'partial_disable' => array(
179 'post_types' => array('attachment', 'tribe_events')
180 ),
181 'deep_detect' => 1,
182 'edit_uris_cap' => 'publish_posts',
183 ),
184 'licence' => array()
185 ));
186
187 // Apply the default settings (if empty values) in all settings sections
188 foreach($default_settings as $group_name => $fields) {
189 foreach($fields as $field_name => $field) {
190 if(!isset($settings[$group_name][$field_name])) {
191 $settings[$group_name][$field_name] = $field;
192 }
193 }
194 }
195
196 return $settings;
197 }
198
199 /**
200 * Set the initial/default admin notices
201 */
202 public function default_alerts($alerts) {
203 $default_alerts = apply_filters('permalink_manager_default_alerts', array(
204 'jan20promo' => array(
205 'txt' => sprintf(
206 __("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"),
207 PERMALINK_MANAGER_WEBSITE . "&utm_campaign=discount_code",
208 '20&#37;',
209 'JAN20',
210 '30.01'
211 ),
212 'type' => 'notice-info',
213 'show' => 'pro_hide',
214 'plugin_only' => true,
215 'until' => '2020-01-31'
216 )
217 ));
218
219 // Apply the default settings (if empty values) in all settings sections
220 return (array) $alerts + (array) $default_alerts;
221 }
222
223 /**
224 * Temporary hook
225 */
226 function legacy_support() {
227 global $permalink_manager_permastructs, $permalink_manager_options;
228
229 if(isset($permalink_manager_options['base-editor'])) {
230 $new_options['post_types'] = $permalink_manager_options['base-editor'];
231 update_option('permalink-manager-permastructs', $new_options);
232 }
233 else if(empty($permalink_manager_permastructs['post_types']) && empty($permalink_manager_permastructs['taxonomies']) && count($permalink_manager_permastructs) > 0) {
234 $new_options['post_types'] = $permalink_manager_permastructs;
235 update_option('permalink-manager-permastructs', $new_options);
236 }
237
238 // Adjust options structure
239 if(!empty($permalink_manager_options['miscellaneous'])) {
240 // Combine general & miscellaneous options
241 $permalink_manager_unfiltered_options['general'] = array_merge($permalink_manager_unfiltered_options['general'], $permalink_manager_unfiltered_options['miscellaneous']);
242
243 // Move licence key to different section
244 $permalink_manager_unfiltered_options['licence']['licence_key'] = (!empty($permalink_manager_unfiltered_options['miscellaneous']['license_key'])) ? $permalink_manager_unfiltered_options['miscellaneous']['license_key'] : "";
245 }
246
247 // Separate "Trailing slashes" & "Trailing slashes redirect" setting fields
248 if(!empty($permalink_manager_options['general']['trailing_slashes']) && $permalink_manager_options['general']['trailing_slashes'] >= 10) {
249 $permalink_manager_unfiltered_options = $permalink_manager_options;
250
251 $permalink_manager_unfiltered_options['general']['trailing_slashes_redirect'] = 1;
252 $permalink_manager_unfiltered_options['general']['trailing_slashes'] = ($permalink_manager_options['general']['trailing_slashes'] == 10) ? 1 : 2;
253 }
254
255 // Save the settings in database
256 if(!empty($permalink_manager_unfiltered_options)) {
257 update_option('permalink-manager', $permalink_manager_unfiltered_options);
258 }
259 }
260
261 /**
262 * Support deprecated hooks
263 */
264 function deprecated_hooks_list($filters = true) {
265 $deprecated_filters = array(
266 'permalink_manager_default_options' => 'permalink-manager-default-options',
267 'permalink_manager_options' => 'permalink-manager-options',
268 'permalink_manager_uris' => 'permalink-manager-uris',
269 'permalink_manager_alerts' => 'permalink-manager-alerts',
270 'permalink_manager_redirects' => 'permalink-manager-redirects',
271 'permalink_manager_external_redirects' => 'permalink-manager-external-redirects',
272 'permalink_manager_permastructs' => 'permalink-manager-permastructs',
273
274 'permalink_manager_alerts' => 'permalink-manager-alerts',
275 'permalink_manager_before_sections' => 'permalink-manager-before-sections',
276 'permalink_manager_sections' => 'permalink-manager-sections',
277 'permalink_manager_after_sections' => 'permalink-manager-after-sections',
278
279 'permalink_manager_field_args' => 'permalink-manager-field-args',
280 'permalink_manager_field_output' => 'permalink-manager-field-output',
281
282 'permalink_manager_deep_uri_detect' => 'permalink-manager-deep-uri-detect',
283 'permalink_manager_detect_uri' => 'permalink-manager-detect-uri',
284 'permalink_manager_detected_element_id' => 'permalink-manager-detected-initial-id',
285 'permalink_manager_detected_term_id' => 'permalink-manager-detected-term-id',
286 'permalink_manager_detected_post_id' => 'permalink-manager-detected-post-id',
287
288 'permalink_manager_primary_term' => 'permalink-manager-primary-term',
289 'permalink_manager_disabled_post_types' => 'permalink-manager-disabled-post-types',
290 'permalink_manager_disabled_taxonomies' => 'permalink-manager-disabled-taxonomies',
291 'permalink_manager_endpoints' => 'permalink-manager-endpoints',
292 'permalink_manager_filter_permalink_base' => 'permalink_manager-filter-permalink-base',
293 'permalink_manager_force_lowercase_uris' => 'permalink-manager-force-lowercase-uris',
294
295 'permalink_manager_uri_editor_extra_info' => 'permalink-manager-uri-editor-extra-info',
296 'permalink_manager_debug_fields' => 'permalink-manager-debug-fields',
297 'permalink_manager_permastructs_fields' => 'permalink-manager-permastructs-fields',
298 'permalink_manager_settings_fields' => 'permalink-manager-settings-fields',
299 'permalink_manager_tools_fields' => 'permalink-manager-tools-fields',
300
301 'permalink_manager_uri_editor_columns' => 'permalink-manager-uri-editor-columns',
302 'permalink_manager_uri_editor_column_content' => 'permalink-manager-uri-editor-column-content',
303 );
304
305 return ($filters) ? $deprecated_filters : array();
306 }
307
308 function deprecated_hooks() {
309 $deprecated_filters = (array) $this->deprecated_hooks_list(true);
310 foreach($deprecated_filters as $new => $old) {
311 add_filter($new, array($this, 'deprecated_hooks_mapping'), -1000, 8);
312 }
313 }
314
315 function deprecated_hooks_mapping($data) {
316 $deprecated_filters = $this->deprecated_hooks_list(true);
317 $filter = current_filter();
318
319 if(isset($deprecated_filters[$filter])) {
320 if(has_filter($deprecated_filters[$filter])) {
321 $args = func_get_args();
322 $data = apply_filters_ref_array($deprecated_filters[$filter], $args);
323 }
324 }
325
326 return $data;
327 }
328
329 /**
330 * Deactivate Permalink Manager Lite if Permalink Manager Pro is enabled
331 */
332 function is_pro_activated() {
333 if(function_exists('is_plugin_active') && is_plugin_active('permalink-manager/permalink-manager.php') && is_plugin_active('permalink-manager-pro/permalink-manager.php')) {
334 deactivate_plugins('permalink-manager/permalink-manager.php');
335 }
336 }
337
338 }
339
340 /**
341 * Begins execution of the plugin.
342 */
343 function run_permalink_manager() {
344 global $permalink_manager;
345
346 // Do not run when Elementor is opened
347 if((!empty($_REQUEST['action']) && strpos($_REQUEST['action'], 'elementor') !== false) || isset($_REQUEST['elementor-preview'])) { return; }
348
349 $permalink_manager = new Permalink_Manager_Class();
350 }
351 run_permalink_manager();
352
353 }
354