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 +254 -122 2.6.0 → 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,79 +11,119 @@
13 11 }
14 12
15 13 if ( ! class_exists( 'WINP_Plugin' ) ) {
16 14
17 - class WINP_Plugin extends Wbcr_Factory475_Plugin {
15 + class WINP_Plugin {
18 16
19 17 /**
20 - * @var Wbcr_Factory475_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 }
48 - add_action( 'init', function () {
49 - if(WINP_Plugin::app()->premium->is_active()){
50 - update_option( 'insert_php_logger_flag', 'yes' );
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 + }
51 77 }
52 - } );
53 - add_filter( 'themeisle_sdk_products', [ __CLASS__, 'register_sdk' ] );
54 - add_filter( 'themeisle_sdk_ran_promos', [ __CLASS__, 'sdk_hide_promo_notice' ] );
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' ] );
55 82 }
56 83
57 84 /**
58 - * Hide SDK promo notice for pro uses.
85 + * Get plugin instance
59 86 *
60 - * @access public
87 + * @return WINP_Plugin
61 88 */
62 - public static function sdk_hide_promo_notice( $should_show ) {
63 - return WINP_Plugin::app()->premium->is_active();
89 + public static function app() {
90 + return self::$app;
64 91 }
92 +
65 93 /**
66 - * Register product into SDK.
94 + * Survey data.
67 95 *
68 - * @param array $products All products.
69 - *
70 - * @return array Registered product.
96 + * @return array<string, mixed>
71 97 */
72 - public static function register_sdk( $products ) {
73 - $products[] = WINP_PLUGIN_FILE;
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;
74 103
75 - return $products;
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;
76 120 }
77 - /**
78 - * @return WINP_Plugin
79 - */
80 - public static function app() {
81 - return self::$app;
82 - }
83 121
84 122 /**
85 123 * @return bool
86 124 */
87 - public function currentUserCan() {
125 + public function current_user_car() {
88 126 return current_user_can( 'manage_options' );
89 127 }
90 128
91 129 /**
@@ -92,12 +130,12 @@
92 130 * Get Execute_Snippet object
93 131 *
94 132 * @return WINP_Execute_Snippet
95 133 */
96 - public function getExecuteObject() {
134 + public function get_execute_object() {
97 135 require_once WINP_PLUGIN_DIR . '/includes/class.execute.snippet.php';
98 136
99 - return new WINP_Execute_Snippet();
137 + return WINP_Execute_Snippet::app();
100 138 }
101 139
102 140 /**
103 141 * Get WINP_Api object
@@ -104,8 +142,9 @@
104 142 *
105 143 * @return WINP_Api
106 144 */
107 145 public function get_api_object() {
146 + require_once WINP_PLUGIN_DIR . '/admin/includes/class.request.php';
108 147 require_once WINP_PLUGIN_DIR . '/admin/includes/class.api.php';
109 148
110 149 return new WINP_Api();
111 150 }
@@ -121,69 +160,76 @@
121 160 return new WINP_Common_Snippet();
122 161 }
123 162
124 163 /**
125 - * @throws \Exception
126 - * @since 2.2.0
127 - * @author Alexander Kovalev <[email protected]>
164 + * Plugin activation hook.
165 + * Creates demo snippets on first activation and sets up capabilities.
166 + *
167 + * @return void
128 168 */
129 - /*
130 - public function plugins_loaded() {
131 - $this->register_pages();
132 - }*/
169 + public function activation_hook() {
170 + // Add custom capabilities to administrator role.
171 + $this->get_snippets_type()->add_capabilities();
133 172
134 - protected function initActivation() {
135 - include_once WINP_PLUGIN_DIR . '/admin/activation.php';
136 - $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();
137 179 }
138 180
139 181 /**
140 - * @throws \Exception
141 - * @since 2.2.0
142 - * @author Alexander Kovalev <[email protected]>
182 + * Plugin deactivation hook.
183 + * Removes custom capabilities.
184 + *
185 + * @return void
143 186 */
144 - public function register_pages() {
145 - require_once WINP_PLUGIN_DIR . '/admin/pages/page.php';
146 -
147 - $this->registerPage( 'WINP_NewItemPage', WINP_PLUGIN_DIR . '/admin/pages/new-item.php' );
148 - $this->registerPage( 'WINP_SettingsPage', WINP_PLUGIN_DIR . '/admin/pages/settings.php' );
149 - $this->registerPage( 'WINP_SnippetLibraryPage', WINP_PLUGIN_DIR . '/admin/pages/snippet-library.php' );
150 - $this->registerPage( 'WINP_License_Page', WINP_PLUGIN_DIR . '/admin/pages/license.php' );
151 - $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();
152 190 }
153 191
154 192 /**
155 - * @throws \Exception
156 - * @since 2.2.0
157 - * @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
158 200 */
159 - public function register_depence_pages() {
160 - 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 + }
161 207
162 - if ( ! ( defined( 'WASP_PLUGIN_ACTIVE' ) && WASP_PLUGIN_ACTIVE ) ) {
163 - $this->registerPage( 'WINP_ImportPage', WINP_PLUGIN_DIR . '/admin/pages/import.php' );
164 - }
208 + return $this->snippets_type;
165 209 }
166 210
167 211 /**
168 - * @throws \Exception
212 + * Register custom post types and taxonomies.
213 + *
214 + * @throws \Exception Exception.
169 215 * @since 2.2.0
170 - * @author Alexander Kovalev <[email protected]>
171 216 */
172 217 private function register_types() {
173 218 require_once WINP_PLUGIN_DIR . '/admin/types/snippets-post-types.php';
174 - Wbcr_FactoryTypes415::register( 'WINP_SnippetsType', $this );
219 + $this->snippets_type = new WINP_SnippetsType();
175 220
176 221 require_once WINP_PLUGIN_DIR . '/admin/types/snippets-taxonomy.php';
177 - Wbcr_FactoryTaxonomies335::register( 'WINP_SnippetsTaxonomy', $this );
222 + new WINP_SnippetsTaxonomy();
178 223 }
179 224
180 225 /**
181 - * @author Alexander Kovalev <[email protected]>
226 + * Register shortcodes.
227 + *
182 228 * @since 2.2.0
183 229 */
184 230 private function register_shortcodes() {
185 - $action = self::app()->request->get( 'action', '' );
231 + $action = WINP_HTTP::get( 'action', '' );
186 232 if ( ! ( 'edit' == $action && is_admin() ) ) {
187 233 require_once WINP_PLUGIN_DIR . '/includes/shortcodes/shortcodes.php';
188 234 require_once WINP_PLUGIN_DIR . '/includes/shortcodes/shortcode-php.php';
189 235 require_once WINP_PLUGIN_DIR . '/includes/shortcodes/shortcode-text.php';
@@ -205,35 +251,19 @@
205 251
206 252 /**
207 253 * Initialization and require files for backend and frontend.
208 254 *
209 - * @author Alexander Kovalev <[email protected]>
210 255 * @since 2.2.0
211 256 */
212 257 private function load_global() {
213 258 require_once WINP_PLUGIN_DIR . '/admin/includes/class.gutenberg.snippet.php';
259 + require_once WINP_PLUGIN_DIR . '/includes/class.admin-bar.php';
214 260
215 261 new WINP_Gutenberg_Snippet();
262 + WINP_Admin_Bar::instance();
216 263
217 - $this->getExecuteObject()->registerHooks();
264 + $this->get_execute_object()->register_hooks();
218 265 $this->register_shortcodes();
219 -
220 - /**
221 - * Enables/Disable safe mode, in which the php code will not be executed.
222 - */
223 - add_action( 'plugins_loaded', function () {
224 - if ( isset( $_GET['wbcr-php-snippets-safe-mode'] ) ) {
225 - WINP_Helper::enable_safe_mode();
226 - wp_safe_redirect( esc_url( remove_query_arg( [ 'wbcr-php-snippets-safe-mode' ] ) ) );
227 - die();
228 - }
229 -
230 - if ( isset( $_GET['wbcr-php-snippets-disable-safe-mode'] ) ) {
231 - WINP_Helper::disable_safe_mode();
232 - wp_safe_redirect( esc_url( remove_query_arg( [ 'wbcr-php-snippets-disable-safe-mode' ] ) ) );
233 - die();
234 - }
235 - }, - 1 );
236 266 }
237 267
238 268 /**
239 269 * Initialization and require files for backend.
@@ -239,46 +269,40 @@
239 269 * Initialization and require files for backend.
240 270 *
241 271 * @throws \Exception
242 272 * @since 2.2.0
243 - * @author Alexander Kovalev <[email protected]>
244 273 */
245 274 private function load_backend() {
246 275 require_once WINP_PLUGIN_DIR . '/admin/includes/class.snippets.viewtable.php';
247 276 require_once WINP_PLUGIN_DIR . '/admin/includes/class.filter.snippet.php';
248 277 require_once WINP_PLUGIN_DIR . '/admin/includes/class.actions.snippet.php';
249 - require_once WINP_PLUGIN_DIR . '/admin/includes/class.import.snippet.php';
250 278 require_once WINP_PLUGIN_DIR . '/admin/includes/class.notices.php';
279 + require_once WINP_PLUGIN_DIR . '/admin/includes/class.admin.notices.php';
251 280 require_once WINP_PLUGIN_DIR . '/admin/includes/class.request.php';
252 - require_once WINP_PLUGIN_DIR . '/admin/metaboxes/metabox.php';
253 281 require_once WINP_PLUGIN_DIR . '/admin/boot.php';
254 282
255 - $this->get_common_object()->registerHooks();
256 -
283 + $this->get_common_object()->register_hooks();
257 284 $this->register_types();
258 285
259 286 new WINP_Filter_List();
260 - new WINP_Export_Snippet();
261 - new WINP_Import_Snippet();
262 - new WINP_WarningNotices();
287 + new WINP_Actions_Snippet();
288 + WINP_Notices::instance();
289 + new WINP_Admin_Notices();
263 290
264 - # Required for i18n to be loaded properly
265 - 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 + }
266 298
267 - # Required for compatibility with the premium plugin.
268 - # We set the priority to 30 to wait for the premium plugin to load.
269 - add_action( 'plugins_loaded', [ $this, 'register_depence_pages' ], 30 );
270 -
271 - add_action( 'wbcr_factory_forms_475_register_controls', function () {
272 - $colorControls = [
273 - [
274 - 'type' => 'winp-dropdown',
275 - 'class' => 'WINP_FactoryForms_Dropdown',
276 - 'include' => WINP_PLUGIN_DIR . '/includes/controls/class.dropdown.php',
277 - ],
278 - ];
279 - $this->forms->registerControls( $colorControls );
280 - } );
299 + return $this->get_survey_data();
300 + },
301 + 10,
302 + 2
303 + );
304 + }
281 305 }
282 306
283 307 /**
284 308 * Метод проверяет активацию премиум плагина и наличие действующего лицензионного ключа
@@ -285,14 +309,122 @@
285 309 *
286 310 * @return bool
287 311 */
288 312 public function is_premium() {
289 - if ( $this->premium->is_active() && $this->premium->is_activate() //&& $this->premium->is_install_package()
290 - ) {
291 - 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' );
292 400 } else {
293 - 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%' );
294 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;
295 428 }
296 -
297 429 }
298 430 }