PluginProbe ʕ •ᴥ•ʔ
Permalink Manager Lite / 2.2.7.6
Permalink Manager Lite v2.2.7.6
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
342 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.7.6
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: 3.8.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 // Define the directories used to load plugin files.
24 define( 'PERMALINK_MANAGER_PLUGIN_NAME', 'Permalink Manager' );
25 define( 'PERMALINK_MANAGER_PLUGIN_SLUG', 'permalink-manager' );
26 define( 'PERMALINK_MANAGER_VERSION', '2.2.7.6' );
27 define( 'PERMALINK_MANAGER_FILE', __FILE__ );
28 define( 'PERMALINK_MANAGER_DIR', untrailingslashit(dirname(__FILE__)) );
29 define( 'PERMALINK_MANAGER_BASENAME', plugin_basename(__FILE__));
30 define( 'PERMALINK_MANAGER_URL', untrailingslashit( plugins_url('', __FILE__) ) );
31 define( 'PERMALINK_MANAGER_WEBSITE', 'http://permalinkmanager.pro?utm_source=plugin' );
32 define( 'PERMALINK_MANAGER_DONATE', 'https://www.paypal.me/Bismit' );
33
34 class Permalink_Manager_Class {
35
36 public $permalink_manager_options_page, $permalink_manager_options;
37 public $sections, $functions, $permalink_manager_before_sections_html, $permalink_manager_after_sections_html;
38
39 /**
40 * Get options from DB, load subclasses & hooks
41 */
42 public function __construct() {
43 $this->include_subclassess();
44 $this->register_init_hooks();
45 }
46
47 /**
48 * Include back-end classess and set their instances
49 */
50 function include_subclassess() {
51 // WP_List_Table needed for post types & taxnomies editors
52 if( ! class_exists( 'WP_List_Table' ) ) {
53 require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
54 }
55
56 $classes = array(
57 'core' => array(
58 'helper-functions' => 'Permalink_Manager_Helper_Functions',
59 'uri-functions-post' => 'Permalink_Manager_URI_Functions_Post',
60 'uri-functions-tax' => 'Permalink_Manager_URI_Functions_Tax',
61 'admin-functions' => 'Permalink_Manager_Admin_Functions',
62 'actions' => 'Permalink_Manager_Actions',
63 'third-parties' => 'Permalink_Manager_Third_Parties',
64 'core-functions' => 'Permalink_Manager_Core_Functions',
65 'gutenberg' => 'Permalink_Manager_Gutenberg',
66 'debug' => 'Permalink_Manager_Debug_Functions',
67 'pro-functions' => 'Permalink_Manager_Pro_Functions'
68 ),
69 'views' => array(
70 'uri-editor' => 'Permalink_Manager_Uri_Editor',
71 'tools' => 'Permalink_Manager_Tools',
72 'permastructs' => 'Permalink_Manager_Permastructs',
73 'settings' => 'Permalink_Manager_Settings',
74 'debug' => 'Permalink_Manager_Debug',
75 'pro-addons' => 'Permalink_Manager_Pro_Addons',
76 'help' => 'Permalink_Manager_Help',
77 'uri-editor-tax' => false,
78 'uri-editor-post' => false
79 )
80 );
81
82 // Load classes and set-up their instances
83 foreach($classes as $class_type => $classes_array) {
84 foreach($classes_array as $class => $class_name) {
85 $filename = PERMALINK_MANAGER_DIR . "/includes/{$class_type}/permalink-manager-{$class}.php";
86
87 if(file_exists($filename)) {
88 require_once $filename;
89 if($class_name) { $this->functions[$class] = new $class_name(); }
90 }
91 }
92 }
93 }
94
95 /**
96 * Register general hooks
97 */
98 public function register_init_hooks() {
99 // Localize plugin
100 add_action( 'init', array($this, 'localize_me'), 1 );
101
102 // Support deprecated hooks
103 add_action( 'plugins_loaded', array($this, 'deprecated_hooks'), 9 );
104
105 // Load globals & options
106 add_action( 'plugins_loaded', array($this, 'get_options_and_globals'), 9 );
107
108 // Legacy support
109 add_action( 'init', array($this, 'legacy_support'), 2 );
110
111 // Default settings & alerts
112 add_filter( 'permalink_manager_options', array($this, 'default_settings'), 1 );
113 add_filter( 'permalink_manager_alerts', array($this, 'default_alerts'), 1 );
114 }
115
116 /**
117 * Localize this plugin
118 */
119 function localize_me() {
120 load_plugin_textdomain( 'permalink-manager', false, basename(dirname(__FILE__)) . "/languages" );
121 }
122
123 /**
124 * Get options values & set global
125 */
126 public function get_options_and_globals() {
127 // 1. Globals with data stored in DB
128 global $permalink_manager_options, $permalink_manager_uris, $permalink_manager_permastructs, $permalink_manager_redirects, $permalink_manager_external_redirects;
129
130 $this->permalink_manager_options = $permalink_manager_options = apply_filters('permalink_manager_options', get_option('permalink-manager', array()));
131 $this->permalink_manager_uris = $permalink_manager_uris = apply_filters('permalink_manager_uris', get_option('permalink-manager-uris', array()));
132 $this->permalink_manager_permastructs = $permalink_manager_permastructs = apply_filters('permalink_manager_permastructs', get_option('permalink-manager-permastructs', array()));
133 $this->permalink_manager_redirects = $permalink_manager_redirects = apply_filters('permalink_manager_redirects', get_option('permalink-manager-redirects', array()));
134 $this->permalink_manager_external_redirects = $permalink_manager_external_redirects = apply_filters('permalink_manager_external_redirects', get_option('permalink-manager-external-redirects', array()));
135
136 // 2. Globals used to display additional content (eg. alerts)
137 global $permalink_manager_alerts, $permalink_manager_before_sections_html, $permalink_manager_after_sections_html;
138
139 $this->permalink_manager_alerts = $permalink_manager_alerts = apply_filters('permalink_manager_alerts', get_option('permalink-manager-alerts', array()));
140 $this->permalink_manager_before_sections_html = $permalink_manager_before_sections_html = apply_filters('permalink_manager_before_sections', '');
141 $this->permalink_manager_after_sections_html = $permalink_manager_after_sections_html = apply_filters('permalink_manager_after_sections', '');
142 }
143
144 /**
145 * Set the initial/default settings (including "Screen Options")
146 */
147 public function default_settings($settings) {
148 $all_taxonomies = Permalink_Manager_Helper_Functions::get_taxonomies_array();
149 $all_post_types = Permalink_Manager_Helper_Functions::get_post_types_array();
150
151 $default_settings = apply_filters('permalink_manager_default_options', array(
152 'screen-options' => array(
153 'per_page' => 20,
154 'post_statuses' => array('publish'),
155 'group' => false,
156 ),
157 'general' => array(
158 'auto_update_uris' => 0,
159 'show_native_slug_field' => 0,
160 'pagination_redirect' => 0,
161 'sslwww_redirect' => 0,
162 'canonical_redirect' => 1,
163 'setup_redirects' => 1,
164 'redirect' => '301',
165 'trailing_slashes' => 0,
166 'auto_remove_duplicates' => 1,
167 'fix_language_mismatch' => 1,
168 'pmxi_import_support' => 0,
169 'yoast_breadcrumbs' => 0,
170 'force_custom_slugs' => 0,
171 'disable_slug_sanitization' => 0,
172 'keep_accents' => 0,
173 'partial_disable' => array(),
174 'deep_detect' => 1,
175 'edit_uris_cap' => 'publish_posts',
176 ),
177 'licence' => array()
178 ));
179
180 // Apply the default settings (if empty values) in all settings sections
181 foreach($default_settings as $group_name => $fields) {
182 foreach($fields as $field_name => $field) {
183 if(!isset($settings[$group_name][$field_name])) {
184 $settings[$group_name][$field_name] = $field;
185 }
186 }
187 }
188
189 return $settings;
190 }
191
192 /**
193 * Set the initial/default admin notices
194 */
195 public function default_alerts($alerts) {
196 $default_alerts = apply_filters('permalink_manager_default_alerts', array(
197 'jan20promo' => array(
198 'txt' => sprintf(
199 __("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"),
200 PERMALINK_MANAGER_WEBSITE . "&utm_campaign=discount_code",
201 '20&#37;',
202 'JAN20',
203 '30.01'
204 ),
205 'type' => 'notice-info',
206 'show' => 'pro_hide',
207 'plugin_only' => true,
208 'until' => '2020-01-31'
209 )
210 ));
211
212 // Apply the default settings (if empty values) in all settings sections
213 return (array) $alerts + (array) $default_alerts;
214 }
215
216 /**
217 * Temporary hook
218 */
219 function legacy_support() {
220 global $permalink_manager_permastructs, $permalink_manager_options;
221
222 if(isset($permalink_manager_options['base-editor'])) {
223 $new_options['post_types'] = $permalink_manager_options['base-editor'];
224 update_option('permalink-manager-permastructs', $new_options);
225 }
226 else if(empty($permalink_manager_permastructs['post_types']) && empty($permalink_manager_permastructs['taxonomies']) && count($permalink_manager_permastructs) > 0) {
227 $new_options['post_types'] = $permalink_manager_permastructs;
228 update_option('permalink-manager-permastructs', $new_options);
229 }
230
231 // Adjust options structure
232 if(!empty($permalink_manager_options['miscellaneous'])) {
233 // Combine general & general
234 $permalink_manager_unfiltered_options['general'] = array_merge($permalink_manager_unfiltered_options['general'], $permalink_manager_unfiltered_options['miscellaneous']);
235
236 // Move licence key to different section
237 $permalink_manager_unfiltered_options['licence']['licence_key'] = (!empty($permalink_manager_unfiltered_options['miscellaneous']['license_key'])) ? $permalink_manager_unfiltered_options['miscellaneous']['license_key'] : "";
238
239 // Remove redundant keys
240 unset($permalink_manager_unfiltered_options['general']['license_key']);
241 unset($permalink_manager_unfiltered_options['miscellaneous']);
242 unset($permalink_manager_unfiltered_options['permalink_manager_options']);
243 unset($permalink_manager_unfiltered_options['_wp_http_referer']);
244 }
245
246 // Adjust "Force Custom Slugs" + "Sanitize" settings
247 if(!empty($permalink_manager_options['general']['force_custom_slugs']) && $permalink_manager_options['general']['force_custom_slugs'] == 2) {
248 $permalink_manager_unfiltered_options = $permalink_manager_options;
249
250 $permalink_manager_unfiltered_options['general']['force_custom_slugs'] = 1;
251 $permalink_manager_unfiltered_options['general']['disable_slug_sanitization'] = 1;
252 }
253
254 // Save the settings in database
255 if(!empty($permalink_manager_unfiltered_options)) {
256 update_option('permalink-manager', $permalink_manager_unfiltered_options);
257 }
258 }
259
260 /**
261 * Support deprecated hooks
262 */
263 function deprecated_hooks_list($filters = true) {
264 $deprecated_filters = array(
265 'permalink_manager_default_options' => 'permalink-manager-default-options',
266 'permalink_manager_options' => 'permalink-manager-options',
267 'permalink_manager_uris' => 'permalink-manager-uris',
268 'permalink_manager_alerts' => 'permalink-manager-alerts',
269 'permalink_manager_redirects' => 'permalink-manager-redirects',
270 'permalink_manager_external_redirects' => 'permalink-manager-external-redirects',
271 'permalink_manager_permastructs' => 'permalink-manager-permastructs',
272
273 'permalink_manager_alerts' => 'permalink-manager-alerts',
274 'permalink_manager_before_sections' => 'permalink-manager-before-sections',
275 'permalink_manager_sections' => 'permalink-manager-sections',
276 'permalink_manager_after_sections' => 'permalink-manager-after-sections',
277
278 'permalink_manager_field_args' => 'permalink-manager-field-args',
279 'permalink_manager_field_output' => 'permalink-manager-field-output',
280
281 'permalink_manager_deep_uri_detect' => 'permalink-manager-deep-uri-detect',
282 'permalink_manager_detect_uri' => 'permalink-manager-detect-uri',
283 'permalink_manager_detected_element_id' => 'permalink-manager-detected-initial-id',
284 'permalink_manager_detected_term_id' => 'permalink-manager-detected-term-id',
285 'permalink_manager_detected_post_id' => 'permalink-manager-detected-post-id',
286
287 'permalink_manager_primary_term' => 'permalink-manager-primary-term',
288 'permalink_manager_disabled_post_types' => 'permalink-manager-disabled-post-types',
289 'permalink_manager_disabled_taxonomies' => 'permalink-manager-disabled-taxonomies',
290 'permalink_manager_endpoints' => 'permalink-manager-endpoints',
291 'permalink_manager_filter_permalink_base' => 'permalink_manager-filter-permalink-base',
292 'permalink_manager_force_lowercase_uris' => 'permalink-manager-force-lowercase-uris',
293
294 'permalink_manager_uri_editor_extra_info' => 'permalink-manager-uri-editor-extra-info',
295 'permalink_manager_debug_fields' => 'permalink-manager-debug-fields',
296 'permalink_manager_permastructs_fields' => 'permalink-manager-permastructs-fields',
297 'permalink_manager_settings_fields' => 'permalink-manager-settings-fields',
298 'permalink_manager_tools_fields' => 'permalink-manager-tools-fields',
299
300 'permalink_manager_uri_editor_columns' => 'permalink-manager-uri-editor-columns',
301 'permalink_manager_uri_editor_column_content' => 'permalink-manager-uri-editor-column-content',
302 );
303
304 return ($filters) ? $deprecated_filters : array();
305 }
306
307 function deprecated_hooks() {
308 $deprecated_filters = (array) $this->deprecated_hooks_list(true);
309 foreach($deprecated_filters as $new => $old) {
310 add_filter($new, array($this, 'deprecated_hooks_mapping'), -1000, 8);
311 }
312 }
313
314 function deprecated_hooks_mapping($data) {
315 $deprecated_filters = $this->deprecated_hooks_list(true);
316 $filter = current_filter();
317
318 if(isset($deprecated_filters[$filter])) {
319 if(has_filter($deprecated_filters[$filter])) {
320 $args = func_get_args();
321 $data = apply_filters_ref_array($deprecated_filters[$filter], $args);
322 }
323 }
324
325 return $data;
326 }
327
328 }
329
330 /**
331 * Begins execution of the plugin.
332 */
333 function run_permalink_manager() {
334 global $permalink_manager;
335
336 // Do not run when Elementor is opened
337 if((!empty($_REQUEST['action']) && strpos($_REQUEST['action'], 'elementor') !== false) || isset($_REQUEST['elementor-preview'])) { return; }
338
339 $permalink_manager = new Permalink_Manager_Class();
340 }
341 run_permalink_manager();
342