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