PluginProbe
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts / 2.7.8
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts v2.7.8
2.7.9 2.7.8 2.7.7 2.7.6 2.7.5 2.7.4 trunk 1.3 2.0.4 2.0.6 2.1.91 2.2.4 2.2.7 2.2.9 2.3.1 2.3.10 2.4.10 2.4.2 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8 2.4.9 2.6.0 All 30 releases
← All changes | includes/class.plugin.php +258 -104 2.4.6 → 2.7.8 View file →
@@ -1,11 +1,9 @@
1 1 <?php
2 2 /**
3 3 * PHP snippets plugin base
4 4 *
5 - * @author Webcraftic <[email protected]>
6 - * @copyright (c) 19.02.2018, Webcraftic
7 - * @version 1.0
5 + * @package Woody_Code_Snippets
8 6 */
9 7
10 8 // Exit if accessed directly
11 9 if ( ! defined( 'ABSPATH' ) ) {
@@ -13,42 +11,80 @@
13 11 }
14 12
15 13 if ( ! class_exists( 'WINP_Plugin' ) ) {
16 14
17 - class WINP_Plugin extends Wbcr_Factory457_Plugin {
15 + class WINP_Plugin {
18 16
19 17 /**
20 - * @var Wbcr_Factory457_Plugin
18 + * Custom license provider (overrides parent's premium property)
19 + *
20 + * @var WINP_License
21 21 */
22 + public $premium;
23 +
24 + /**
25 + * @var WINP_Plugin
26 + */
22 27 private static $app;
23 28
24 29 /**
25 - * @param string $plugin_path
26 - * @param array $data
30 + * Snippets custom post type instance.
27 31 *
32 + * @var WINP_SnippetsType|null
33 + */
34 + private $snippets_type;
35 +
36 + /**
28 37 * @throws Exception
29 38 */
30 - public function __construct( $plugin_path, $data ) {
31 - parent::__construct( $plugin_path, $data );
39 + public function __construct() {
40 + self::$app = $this;
32 41
33 - self::$app = $this;
42 + // Initialize custom license provider.
43 + require_once WINP_PLUGIN_DIR . '/includes/class.license.php';
44 + $this->premium = new WINP_License();
34 45
46 + require_once WINP_PLUGIN_DIR . '/includes/class.rest.php';
47 + new WINP_Rest();
48 +
49 + require_once WINP_PLUGIN_DIR . '/includes/class.abilities.php';
50 + new WINP_Abilities();
51 +
52 + require_once WINP_PLUGIN_DIR . '/admin/pages/class.settings.php';
53 + require_once WINP_PLUGIN_DIR . '/admin/pages/class.new-item.php';
54 + require_once WINP_PLUGIN_DIR . '/admin/pages/class.snippet-library.php';
55 +
56 + WINP_Settings::get_instance();
57 + WINP_NewItem::get_instance();
58 + WINP_SnippetLibrary::get_instance();
59 +
35 60 $this->load_global();
36 61
37 - if ( is_admin() ) {
38 - $this->initActivation();
62 + if ( is_admin() || WINP_Helper::doing_rest_api() ) {
39 63
40 64 if ( WINP_Helper::doing_ajax() ) {
41 65 require WINP_PLUGIN_DIR . '/admin/ajax/ajax.php';
42 - require WINP_PLUGIN_DIR . '/admin/ajax/check-license.php';
43 66 require WINP_PLUGIN_DIR . '/admin/ajax/snippet-library.php';
44 67 }
45 68
46 69 $this->load_backend();
47 70 }
71 + add_action(
72 + 'init',
73 + function () {
74 + if ( WINP_Plugin::app()->premium->is_active() ) {
75 + update_option( WINP_PLUGIN_NAMESPACE . '_logger_flag', 'yes' );
76 + }
77 + }
78 + );
79 +
80 + add_filter( WINP_PLUGIN_NAMESPACE . '_logger_data', [ $this, 'get_logger_data' ] );
81 + add_filter( 'themeisle_sdk_blackfriday_data', [ $this, 'add_black_friday_data' ] );
48 82 }
49 83
50 84 /**
85 + * Get plugin instance
86 + *
51 87 * @return WINP_Plugin
52 88 */
53 89 public static function app() {
54 90 return self::$app;
@@ -54,11 +90,40 @@
54 90 return self::$app;
55 91 }
56 92
57 93 /**
94 + * Survey data.
95 + *
96 + * @return array<string, mixed>
97 + */
98 + public function get_survey_data() {
99 + $install_time = get_option( WINP_PLUGIN_NAMESPACE . '_install', time() );
100 + $days_since_install = round( ( time() - $install_time ) / DAY_IN_SECONDS );
101 + $total_snippets = wp_count_posts( WINP_SNIPPETS_POST_TYPE );
102 + $total_snippets = isset( $total_snippets->publish ) ? $total_snippets->publish : 0;
103 +
104 + $data = [
105 + 'environmentId' => 'cmiooosih4vm0ad01eihjub64',
106 + 'attributes' => [
107 + 'free_version' => WINP_PLUGIN_VERSION,
108 + 'pro_version' => defined( 'WASP_PLUGIN_VERSION' ) ? WASP_PLUGIN_VERSION : '',
109 + 'install_days_number' => $days_since_install,
110 + 'license_status' => self::app()->premium->is_active(),
111 + 'total_snippets' => $total_snippets,
112 + ],
113 + ];
114 +
115 + if ( self::app()->premium->is_active() ) {
116 + $data['attributes']['license_key'] = apply_filters( 'themeisle_sdk_secret_masking', self::app()->premium->get_key() );
117 + }
118 +
119 + return $data;
120 + }
121 +
122 + /**
58 123 * @return bool
59 124 */
60 - public function currentUserCan() {
125 + public function current_user_car() {
61 126 return current_user_can( 'manage_options' );
62 127 }
63 128
64 129 /**
@@ -65,12 +130,12 @@
65 130 * Get Execute_Snippet object
66 131 *
67 132 * @return WINP_Execute_Snippet
68 133 */
69 - public function getExecuteObject() {
134 + public function get_execute_object() {
70 135 require_once WINP_PLUGIN_DIR . '/includes/class.execute.snippet.php';
71 136
72 - return new WINP_Execute_Snippet();
137 + return WINP_Execute_Snippet::app();
73 138 }
74 139
75 140 /**
76 141 * Get WINP_Api object
@@ -77,8 +142,9 @@
77 142 *
78 143 * @return WINP_Api
79 144 */
80 145 public function get_api_object() {
146 + require_once WINP_PLUGIN_DIR . '/admin/includes/class.request.php';
81 147 require_once WINP_PLUGIN_DIR . '/admin/includes/class.api.php';
82 148
83 149 return new WINP_Api();
84 150 }
@@ -94,75 +160,77 @@
94 160 return new WINP_Common_Snippet();
95 161 }
96 162
97 163 /**
98 - * @throws \Exception
99 - * @since 2.2.0
100 - * @author Alexander Kovalev <[email protected]>
164 + * Plugin activation hook.
165 + * Creates demo snippets on first activation and sets up capabilities.
166 + *
167 + * @return void
101 168 */
102 - /*
103 - public function plugins_loaded() {
104 - $this->register_pages();
105 - }*/
169 + public function activation_hook() {
170 + // Add custom capabilities to administrator role.
171 + $this->get_snippets_type()->add_capabilities();
106 172
107 - protected function initActivation() {
108 - include_once WINP_PLUGIN_DIR . '/admin/activation.php';
109 - $this->registerActivation( 'WINP_Activation' );
173 + // Create demo snippets with examples of use.
174 + if ( ! get_option( 'wbcr_inp_demo_snippets_created' ) ) {
175 + WINP_Helper::create_demo_snippets();
176 + }
177 +
178 + WINP_Helper::flush_page_cache();
110 179 }
111 180
112 181 /**
113 - * @throws \Exception
114 - * @since 2.2.0
115 - * @author Alexander Kovalev <[email protected]>
182 + * Plugin deactivation hook.
183 + * Removes custom capabilities.
184 + *
185 + * @return void
116 186 */
117 - public function register_pages() {
118 - require_once WINP_PLUGIN_DIR . '/admin/pages/page.php';
119 -
120 - $this->registerPage( 'WINP_NewItemPage', WINP_PLUGIN_DIR . '/admin/pages/new-item.php' );
121 - $this->registerPage( 'WINP_SettingsPage', WINP_PLUGIN_DIR . '/admin/pages/settings.php' );
122 - $this->registerPage( 'WINP_SnippetLibraryPage', WINP_PLUGIN_DIR . '/admin/pages/snippet-library.php' );
123 - $this->registerPage( 'WINP_License_Page', WINP_PLUGIN_DIR . '/admin/pages/license.php' );
124 - $this->registerPage( 'WINP_AboutPage', WINP_PLUGIN_DIR . '/admin/pages/about.php' );
187 + public function deactivation_hook() {
188 + // Remove custom capabilities from administrator role.
189 + $this->get_snippets_type()->remove_capabilities();
125 190 }
126 191
127 192 /**
128 - * @throws \Exception
129 - * @since 2.2.0
130 - * @author Alexander Kovalev <[email protected]>
193 + * Get the snippets post type handler, loading it on demand.
194 + *
195 + * The (de)activation hooks can run outside of admin/REST requests
196 + * (e.g. `wp plugin activate` via WP-CLI), where load_backend() and
197 + * therefore register_types() never ran.
198 + *
199 + * @return WINP_SnippetsType
131 200 */
132 - public function register_depence_pages() {
133 - require_once WINP_PLUGIN_DIR . '/admin/pages/page.php';
201 + private function get_snippets_type() {
202 + if ( is_null( $this->snippets_type ) ) {
203 + require_once WINP_PLUGIN_DIR . '/admin/includes/class.snippets.viewtable.php';
204 + require_once WINP_PLUGIN_DIR . '/admin/types/snippets-post-types.php';
205 + $this->snippets_type = new WINP_SnippetsType();
206 + }
134 207
135 - if ( ! ( defined( 'WASP_PLUGIN_ACTIVE' ) && WASP_PLUGIN_ACTIVE ) ) {
136 - $this->registerPage( 'WINP_ImportPage', WINP_PLUGIN_DIR . '/admin/pages/import.php' );
137 - }
208 + return $this->snippets_type;
138 209 }
139 210
140 211 /**
141 - * @throws \Exception
212 + * Register custom post types and taxonomies.
213 + *
214 + * @throws \Exception Exception.
142 215 * @since 2.2.0
143 - * @author Alexander Kovalev <[email protected]>
144 216 */
145 217 private function register_types() {
146 218 require_once WINP_PLUGIN_DIR . '/admin/types/snippets-post-types.php';
147 - Wbcr_FactoryTypes413::register( 'WINP_SnippetsType', $this );
219 + $this->snippets_type = new WINP_SnippetsType();
148 220
149 221 require_once WINP_PLUGIN_DIR . '/admin/types/snippets-taxonomy.php';
150 - Wbcr_FactoryTaxonomies333::register( 'WINP_SnippetsTaxonomy', $this );
222 + new WINP_SnippetsTaxonomy();
151 223 }
152 224
153 225 /**
154 - * @author Alexander Kovalev <[email protected]>
226 + * Register shortcodes.
227 + *
155 228 * @since 2.2.0
156 229 */
157 230 private function register_shortcodes() {
158 - $action = self::app()->request->get( 'action', '' );
231 + $action = WINP_HTTP::get( 'action', '' );
159 232 if ( ! ( 'edit' == $action && is_admin() ) ) {
160 - if ( self::app()->getOption( 'support_old_shortcodes' ) ) {
161 - // todo: Deprecated
162 - require_once WINP_PLUGIN_DIR . '/includes/shortcodes/shortcode-insert-php.php';
163 - }
164 -
165 233 require_once WINP_PLUGIN_DIR . '/includes/shortcodes/shortcodes.php';
166 234 require_once WINP_PLUGIN_DIR . '/includes/shortcodes/shortcode-php.php';
167 235 require_once WINP_PLUGIN_DIR . '/includes/shortcodes/shortcode-text.php';
168 236 require_once WINP_PLUGIN_DIR . '/includes/shortcodes/shortcode-universal.php';
@@ -183,35 +251,19 @@
183 251
184 252 /**
185 253 * Initialization and require files for backend and frontend.
186 254 *
187 - * @author Alexander Kovalev <[email protected]>
188 255 * @since 2.2.0
189 256 */
190 257 private function load_global() {
191 258 require_once WINP_PLUGIN_DIR . '/admin/includes/class.gutenberg.snippet.php';
259 + require_once WINP_PLUGIN_DIR . '/includes/class.admin-bar.php';
192 260
193 261 new WINP_Gutenberg_Snippet();
262 + WINP_Admin_Bar::instance();
194 263
195 - $this->getExecuteObject()->registerHooks();
264 + $this->get_execute_object()->register_hooks();
196 265 $this->register_shortcodes();
197 -
198 - /**
199 - * Enables/Disable safe mode, in which the php code will not be executed.
200 - */
201 - add_action( 'plugins_loaded', function () {
202 - if ( isset( $_GET['wbcr-php-snippets-safe-mode'] ) ) {
203 - WINP_Helper::enable_safe_mode();
204 - wp_safe_redirect( esc_url( remove_query_arg( [ 'wbcr-php-snippets-safe-mode' ] ) ) );
205 - die();
206 - }
207 -
208 - if ( isset( $_GET['wbcr-php-snippets-disable-safe-mode'] ) ) {
209 - WINP_Helper::disable_safe_mode();
210 - wp_safe_redirect( esc_url( remove_query_arg( [ 'wbcr-php-snippets-disable-safe-mode' ] ) ) );
211 - die();
212 - }
213 - }, - 1 );
214 266 }
215 267
216 268 /**
217 269 * Initialization and require files for backend.
@@ -217,46 +269,40 @@
217 269 * Initialization and require files for backend.
218 270 *
219 271 * @throws \Exception
220 272 * @since 2.2.0
221 - * @author Alexander Kovalev <[email protected]>
222 273 */
223 274 private function load_backend() {
224 275 require_once WINP_PLUGIN_DIR . '/admin/includes/class.snippets.viewtable.php';
225 276 require_once WINP_PLUGIN_DIR . '/admin/includes/class.filter.snippet.php';
226 277 require_once WINP_PLUGIN_DIR . '/admin/includes/class.actions.snippet.php';
227 - require_once WINP_PLUGIN_DIR . '/admin/includes/class.import.snippet.php';
228 278 require_once WINP_PLUGIN_DIR . '/admin/includes/class.notices.php';
279 + require_once WINP_PLUGIN_DIR . '/admin/includes/class.admin.notices.php';
229 280 require_once WINP_PLUGIN_DIR . '/admin/includes/class.request.php';
230 - require_once WINP_PLUGIN_DIR . '/admin/metaboxes/metabox.php';
231 281 require_once WINP_PLUGIN_DIR . '/admin/boot.php';
232 282
233 - $this->get_common_object()->registerHooks();
234 -
283 + $this->get_common_object()->register_hooks();
235 284 $this->register_types();
236 285
237 286 new WINP_Filter_List();
238 - new WINP_Export_Snippet();
239 - new WINP_Import_Snippet();
240 - new WINP_WarningNotices();
287 + new WINP_Actions_Snippet();
288 + WINP_Notices::instance();
289 + new WINP_Admin_Notices();
241 290
242 - # Required for i18n to be loaded properly
243 - add_action( 'plugins_loaded', [ $this, 'register_pages' ] );
291 + if ( ! defined( 'E2E_TESTING' ) ) {
292 + add_filter(
293 + 'themeisle-sdk/survey/' . WINP_PLUGIN_SLUG,
294 + function ( $data, $page_slug ) {
295 + if ( empty( $page_slug ) ) {
296 + return $data;
297 + }
244 298
245 - # Required for compatibility with the premium plugin.
246 - # We set the priority to 30 to wait for the premium plugin to load.
247 - add_action( 'plugins_loaded', [ $this, 'register_depence_pages' ], 30 );
248 -
249 - add_action( 'wbcr_factory_forms_454_register_controls', function () {
250 - $colorControls = [
251 - [
252 - 'type' => 'winp-dropdown',
253 - 'class' => 'WINP_FactoryForms_Dropdown',
254 - 'include' => WINP_PLUGIN_DIR . '/includes/controls/class.dropdown.php',
255 - ],
256 - ];
257 - $this->forms->registerControls( $colorControls );
258 - } );
299 + return $this->get_survey_data();
300 + },
301 + 10,
302 + 2
303 + );
304 + }
259 305 }
260 306
261 307 /**
262 308 * Метод проверяет активацию премиум плагина и наличие действующего лицензионного ключа
@@ -263,14 +309,122 @@
263 309 *
264 310 * @return bool
265 311 */
266 312 public function is_premium() {
267 - if ( $this->premium->is_active() && $this->premium->is_activate() //&& $this->premium->is_install_package()
268 - ) {
269 - return true;
313 + return $this->premium->is_active();
314 + }
315 +
316 + /**
317 + * Logger data.
318 + *
319 + * @return array<string, mixed>
320 + */
321 + public function get_logger_data() {
322 + $settings = WINP_Settings::get_instance()->get_settings();
323 +
324 + // Each settings has a lot of keys, we only want name and value items. So map them.
325 + $settings = array_map(
326 + function ( $setting ) {
327 + return [
328 + 'name' => isset( $setting['name'] ) ? $setting['name'] : '',
329 + 'value' => isset( $setting['value'] ) ? $setting['value'] : '',
330 + ];
331 + },
332 + $settings
333 + );
334 +
335 + $total_snippets = wp_count_posts( WINP_SNIPPETS_POST_TYPE );
336 + $total_snippets = isset( $total_snippets->publish ) ? $total_snippets->publish : 0;
337 +
338 + // Count snippets by type.
339 + $snippet_types = [ 'php', 'css', 'js', 'text', 'html', 'advert', 'universal' ];
340 + $types_count = [];
341 +
342 + foreach ( $snippet_types as $type ) {
343 + $count = get_posts(
344 + [
345 + 'post_type' => WINP_SNIPPETS_POST_TYPE,
346 + 'post_status' => 'publish',
347 + 'meta_key' => 'wbcr_inp_snippet_type',
348 + 'meta_value' => $type,
349 + 'posts_per_page' => -1,
350 + 'fields' => 'ids',
351 + ]
352 + );
353 +
354 + if ( ! empty( $count ) ) {
355 + $types_count[ $type ] = count( $count );
356 + }
357 + }
358 +
359 + return [
360 + 'settings' => $settings,
361 + 'stats' => [
362 + 'total_snippets' => $total_snippets,
363 + 'types' => $types_count,
364 + ],
365 + ];
366 + }
367 +
368 + /**
369 + * Set the black friday data.
370 + *
371 + * @param array<string, mixed> $configs The configuration array for the loaded products.
372 + *
373 + * @return array<string, mixed> The configurations.
374 + */
375 + public function add_black_friday_data( $configs ) {
376 + $config = $configs['default'];
377 +
378 + $message = __( 'Conditional logic, revision history, import/export. Manage your custom code properly. Exclusively for existing Woody users.', 'insert-php' );
379 + $cta_label = __( 'Get Woody Pro', 'insert-php' );
380 +
381 + $plan = apply_filters( 'product_woody_license_plan', 0 );
382 + $status = apply_filters( 'product_woody_license_status', 'invalid' );
383 + $license = apply_filters( 'product_woody_license_key', false );
384 + $pro_product_slug = defined( 'WASP_PLUGIN_FILE' ) ? basename( dirname( WASP_PLUGIN_FILE ) ) : '';
385 +
386 + $is_pro = 'valid' === $status;
387 + $is_expired = 'expired' === $status || 'active-expired' === $status;
388 +
389 + if ( $is_pro ) {
390 + // translators: %s is the discount percentage.
391 + $config['plugin_meta_message'] = sprintf( __( 'Black Friday Sale - up to %s off', 'insert-php' ), '30%' );
392 + // translators: %1$s - discount, %2$s - discount.
393 + $message = sprintf( __( 'Upgrade your Woody Pro plan: %1$s off this week. Already on the plan you need? Renew early and save up to %2$s.', 'insert-php' ), '30%', '20%' );
394 + $cta_label = __( 'See your options', 'insert-php' );
395 + } elseif ( $is_expired ) {
396 + // translators: %s is the discount percentage.
397 + $config['plugin_meta_message'] = sprintf( __( 'Black Friday Sale - %s off', 'insert-php' ), '50%' );
398 + $message = __( 'Your Woody Pro features are still here, just locked. Renew at a reduced rate this week.', 'insert-php' );
399 + $cta_label = __( 'Reactivate now', 'insert-php' );
270 400 } else {
271 - return false;
401 + // translators: %s - discount.
402 + $config['title'] = sprintf( __( 'Woody Pro: %s off this week', 'insert-php' ), '60%' );
403 + // translators: %s is the discount percentage.
404 + $config['plugin_meta_message'] = sprintf( __( 'Black Friday Sale - %s off', 'insert-php' ), '60%' );
272 405 }
406 +
407 + $url_params = [
408 + 'utm_term' => $is_pro ? 'plan-' . $plan : 'free',
409 + 'lkey' => ! empty( $license ) ? $license : false,
410 + 'expired' => $is_expired ? '1' : false,
411 + ];
412 +
413 + if ( ( $is_pro || $is_expired ) && ! empty( $pro_product_slug ) ) {
414 + $config['plugin_meta_targets'] = [ $pro_product_slug ];
415 + }
416 +
417 + $config['cta_label'] = $cta_label;
418 + $config['message'] = $message;
419 +
420 + $config['sale_url'] = add_query_arg(
421 + $url_params,
422 + tsdk_translate_link( tsdk_utmify( 'https://themeisle.link/woody-bf', 'bfcm', 'woody' ) )
423 + );
424 +
425 + $configs[ WINP_PLUGIN_SLUG ] = $config;
426 +
427 + return $configs;
273 428 }
274 -
275 429 }
276 430 }