PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.10
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.10
4.0.8 4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 All 149 releases
← All changes | classes/Visualizer/Module/Admin.php +104 -1139 4.0.43.0.10 View file →
@@ -29,10 +29,8 @@
29 29 class Visualizer_Module_Admin extends Visualizer_Module {
30 30
31 31 const NAME = __CLASS__;
32 32
33 - const OPTION_GLOBAL_SETTINGS = 'visualizer_global_settings';
34 -
35 33 /**
36 34 * Library page suffix.
37 35 *
38 36 * @since 1.0.0
@@ -42,24 +40,8 @@
42 40 */
43 41 private $_libraryPage;
44 42
45 43 /**
46 - * Support page suffix.
47 - *
48 - * @access private
49 - * @var string
50 - */
51 - private $_supportPage;
52 -
53 - /**
54 - * Settings page suffix.
55 - *
56 - * @access private
57 - * @var string
58 - */
59 - private $_settingsPage;
60 -
61 - /**
62 44 * Constructor.
63 45 *
64 46 * @since 1.0.0
65 47 *
@@ -70,139 +52,26 @@
70 52 public function __construct( Visualizer_Plugin $plugin ) {
71 53 parent::__construct( $plugin );
72 54 $this->_addAction( 'load-post.php', 'enqueueMediaScripts' );
73 55 $this->_addAction( 'load-post-new.php', 'enqueueMediaScripts' );
74 - $this->_addAction( 'enqueue_block_editor_assets', 'enqueueMediaScripts' );
75 - $this->_addAction( 'admin_footer', 'renderTemplates' );
76 - $this->_addAction( 'admin_enqueue_scripts', 'enqueueLibraryScripts', null, 0 );
77 - $this->_addAction( 'admin_enqueue_scripts', 'enqueue_support_page' );
78 - $this->_addAction( 'admin_enqueue_scripts', 'enqueueSettingsScripts' );
79 - $this->_addAction( 'admin_post_visualizer_save_global_settings', 'saveGlobalSettings' );
56 + $this->_addAction( 'admin_footer', 'renderTempaltes' );
57 + $this->_addAction( 'admin_enqueue_scripts', 'enqueueLibraryScripts', null, 8 );
80 58 $this->_addAction( 'admin_menu', 'registerAdminMenu' );
81 59 $this->_addFilter( 'media_view_strings', 'setupMediaViewStrings' );
82 60 $this->_addFilter( 'plugin_action_links', 'getPluginActionLinks', 10, 2 );
83 - $this->_addFilter( 'plugin_row_meta', 'getPluginMetaLinks', 10, 2 );
84 61 $this->_addFilter( 'visualizer_logger_data', 'getLoggerData' );
62 + $this->_addFilter( 'visualizer_get_chart_counts', 'getChartCountsByTypeAndMeta' );
85 63 $this->_addFilter( 'visualizer_feedback_review_trigger', 'feedbackReviewTrigger' );
86 - $this->_addFilter( 'themeisle_sdk_blackfriday_data', 'add_black_friday_data' );
87 64
88 - // screen pagination
89 - $this->_addFilter( 'set-screen-option', 'setScreenOptions', 10, 3 );
90 -
91 65 // revision support.
92 66 $this->_addFilter( 'wp_revisions_to_keep', 'limitRevisions', null, 10, 2 );
93 67 $this->_addAction( '_wp_put_post_revision', 'addRevision', null, 10, 1 );
94 68 $this->_addAction( 'wp_restore_post_revision', 'restoreRevision', null, 10, 2 );
95 69
96 - $this->_addAction( 'visualizer_chart_schedules_spl', 'addSplChartSchedules', null, 10, 3 );
97 -
98 70 $this->_addAction( 'admin_init', 'init' );
99 -
100 - $this->_addAction( 'visualizer_chart_languages', 'addMultilingualSupport' );
101 -
102 - $this->_addFilter( 'admin_footer_text', 'render_review_notice' );
103 -
104 - if ( ! defined( 'TI_E2E_TESTING' ) ) {
105 - $this->_addFilter( 'themeisle-sdk/survey/' . VISUALIZER_DIRNAME, 'get_survey_metadata', 10, 2 );
106 - }
107 -
108 - if ( defined( 'TI_E2E_TESTING' ) ) {
109 - $this->load_cypress_hooks();
110 - }
111 71 }
112 - /**
113 - * Display review notice.
114 - */
115 - public function render_review_notice( $footer_text ) {
116 - $current_screen = get_current_screen();
117 72
118 - $visualizer_page_ids = array( 'toplevel_page_visualizer', 'visualizer_page_viz-support', 'visualizer_page_ti-about-visualizer' );
119 -
120 - if ( ! empty( $current_screen ) && isset( $current_screen->id ) ) {
121 - foreach ( $visualizer_page_ids as $page_to_check ) {
122 - if ( strpos( $current_screen->id, $page_to_check ) !== false ) {
123 - $footer_text = sprintf(
124 - // translators: %1$s - the name of the plugin (Visualizer), %2$s - message (You can help us by leaving a), %3$s - HTML entity code.
125 - __( 'Enjoying %1$s? %2$s %3$s rating. Thank you for being so supportive!', 'visualizer' ),
126 - '<b>Visualizer</b>',
127 - esc_html__( 'You can help us by leaving a', 'visualizer' ),
128 - '<a href="https://wordpress.org/support/plugin/visualizer/reviews/#new-post" target="_blank">&#9733;&#9733;&#9733;&#9733;&#9733;</a>'
129 - );
130 - break;
131 - }
132 - }
133 - }
134 -
135 - return $footer_text;
136 - }
137 -
138 -
139 73 /**
140 - * Define the hooks that are needed for cypress.
141 - *
142 - * @since 3.4.0
143 - * @access private
144 - */
145 - private function load_cypress_hooks() {
146 - // all charts should load on the same page without pagination.
147 - add_filter(
148 - 'visualizer_query_args', function ( $args ) {
149 - $args['posts_per_page'] = 20;
150 - return $args;
151 - }, 10, 1
152 - );
153 - }
154 -
155 - /**
156 - * Add disabled `optgroup` schedules to the drop downs.
157 - *
158 - * @since ?
159 - *
160 - * @access public
161 - *
162 - * @param string $feature The feature for which to add schedules.
163 - * @param int $chart_id The chart ID.
164 - * @param int $plan The plan number.
165 - */
166 - public function addSplChartSchedules( $feature, $chart_id, $plan ) {
167 - if ( apply_filters( 'visualizer_is_business', false ) ) {
168 - return;
169 - }
170 -
171 - $is_new_personal = apply_filters( 'visualizer_is_new_personal', false );
172 -
173 - $hours = array(
174 - '0.16' => __( '10 minutes', 'visualizer' ),
175 - '1' => __( 'Each hour', 'visualizer' ),
176 - '12' => __( 'Each 12 hours', 'visualizer' ),
177 - '24' => __( 'Each day', 'visualizer' ),
178 - '72' => __( 'Each 3 days', 'visualizer' ),
179 - );
180 -
181 - switch ( $feature ) {
182 - case 'json':
183 - case 'csv':
184 - // no more schedules if pro is already active.
185 - if ( Visualizer_Module::is_pro() && ! $is_new_personal ) {
186 - return;
187 - }
188 - break;
189 - case 'wp':
190 - // fall-through.
191 - case 'db':
192 - break;
193 - default:
194 - return;
195 - }
196 -
197 - echo '<optgroup disabled label="' . __( 'Upgrade required', 'visualizer' ) . '">';
198 - foreach ( $hours as $hour => $desc ) {
199 - echo '<option disabled>' . $desc . '</option>';
200 - }
201 - echo '</optgroup>';
202 - }
203 -
204 - /**
205 74 * No limits on revisions.
206 75 */
207 76 public function limitRevisions( $num, $post ) {
208 77 if ( Visualizer_Plugin::CPT_VISUALIZER === $post->post_type ) {
@@ -263,30 +132,16 @@
263 132 *
264 133 * @access public
265 134 */
266 135 public function init() {
267 - if ( current_user_can( 'edit_posts' ) && current_user_can( 'edit_pages' ) && 'true' === get_user_option( 'rich_editing' ) ) {
136 + if ( current_user_can( 'edit_posts' ) && current_user_can( 'edit_pages' ) && 'true' == get_user_option( 'rich_editing' ) ) {
268 137 $this->_addFilter( 'mce_external_languages', 'add_tinymce_lang', 10, 1 );
269 138 $this->_addFilter( 'mce_external_plugins', 'tinymce_plugin', 10, 1 );
270 139 $this->_addFilter( 'mce_buttons', 'register_mce_button', 10, 1 );
271 - $this->_addFilter( 'tiny_mce_before_init', 'get_strings_for_block', 10, 1 );
272 140 }
273 141 }
274 142
275 143 /**
276 - * Add the strings required for the TinyMCE buttons for the classic block (not the classic editor).
277 - *
278 - * @since ?
279 - * @access friendly
280 - */
281 - public function get_strings_for_block( $settings ) {
282 - $class = new Visualizer_Module_Language();
283 - $strings = $class->get_strings();
284 - $array = array( 'visualizer_tinymce_plugin' => json_encode( $strings ) );
285 - return array_merge( $settings, $array );
286 - }
287 -
288 - /**
289 144 * Load plugin translation for - TinyMCE API
290 145 *
291 146 * @access public
292 147 * @param array $arr The tinymce_lang array.
@@ -355,52 +210,20 @@
355 210 * @access public
356 211 */
357 212 public function enqueueMediaScripts() {
358 213 global $typenow;
359 - global $current_screen;
360 -
361 - if ( post_type_supports( $typenow, 'editor' ) || $current_screen->id === 'widgets' || $current_screen->id === 'customize' ) {
214 + if ( post_type_supports( $typenow, 'editor' ) ) {
362 215 wp_enqueue_style( 'visualizer-media', VISUALIZER_ABSURL . 'css/media.css', array( 'media-views' ), Visualizer_Plugin::VERSION );
363 -
364 - $d3_renderer_asset = VISUALIZER_ABSPATH . '/classes/Visualizer/D3Renderer/build/index.asset.php';
365 - if ( file_exists( $d3_renderer_asset ) && ! wp_script_is( 'visualizer-d3-renderer', 'registered' ) ) {
366 - // @phpstan-ignore-next-line
367 - $d3_asset = include $d3_renderer_asset;
368 - wp_register_script(
369 - 'visualizer-d3-renderer',
370 - VISUALIZER_ABSURL . 'classes/Visualizer/D3Renderer/build/index.js',
371 - array_merge( $d3_asset['dependencies'], array( 'jquery' ) ),
372 - $d3_asset['version'],
373 - true
374 - );
375 - }
376 - if ( wp_script_is( 'visualizer-d3-renderer', 'registered' ) ) {
377 - wp_enqueue_script( 'visualizer-d3-renderer' );
378 - wp_localize_script(
379 - 'visualizer-d3-renderer',
380 - 'vizD3Renderer',
381 - array(
382 - 'iframeJsUrl' => VISUALIZER_ABSURL . 'classes/Visualizer/D3Renderer/build/iframe.js',
383 - )
384 - );
385 - }
386 -
387 - // Load all the assets for the different libraries we support.
388 - $deps = array(
389 - Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) ),
390 - Visualizer_Render_Sidebar_Type_DataTable_Tabular::enqueue_assets( array( 'media-editor' ) ),
391 - );
392 -
393 - wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', $deps, Visualizer_Plugin::VERSION, true );
216 + wp_enqueue_script( 'visualizer-google-jsapi-new', '//www.gstatic.com/charts/loader.js', array( 'media-editor' ), null, true );
217 + wp_enqueue_script( 'visualizer-google-jsapi-old', '//www.google.com/jsapi', array( 'visualizer-google-jsapi-new' ), null, true );
218 + wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', array( 'visualizer-google-jsapi-old' ), Visualizer_Plugin::VERSION, true );
394 219 wp_enqueue_script( 'visualizer-media-collection', VISUALIZER_ABSURL . 'js/media/collection.js', array( 'visualizer-media-model' ), Visualizer_Plugin::VERSION, true );
395 220 wp_enqueue_script( 'visualizer-media-controller', VISUALIZER_ABSURL . 'js/media/controller.js', array( 'visualizer-media-collection' ), Visualizer_Plugin::VERSION, true );
396 221 wp_enqueue_script( 'visualizer-media-view', VISUALIZER_ABSURL . 'js/media/view.js', array( 'visualizer-media-controller' ), Visualizer_Plugin::VERSION, true );
397 222 wp_localize_script(
398 - 'visualizer-media-view',
399 - 'visualizer',
400 - array(
223 + 'visualizer-media-view', 'visualizer', array(
401 224 'i10n' => array(
402 - 'insert' => __( 'Insert Chart', 'visualizer' ),
225 + 'insert' => __( 'Insert', 'visualizer' ),
403 226 ),
404 227 )
405 228 );
406 229 wp_enqueue_script( 'visualizer-media-toolbar', VISUALIZER_ABSURL . 'js/media/toolbar.js', array( 'visualizer-media-view' ), Visualizer_Plugin::VERSION, true );
@@ -429,9 +252,9 @@
429 252 'controller' => array(
430 253 'title' => esc_html__( 'Visualizations', 'visualizer' ),
431 254 ),
432 255 'routers' => array(
433 - 'library' => esc_html__( 'Insert from Library', 'visualizer' ),
256 + 'library' => esc_html__( 'From Library', 'visualizer' ),
434 257 'create' => esc_html__( 'Create New', 'visualizer' ),
435 258 ),
436 259 'library' => array(
437 260 'filters' => $chart_types,
@@ -437,9 +260,9 @@
437 260 'filters' => $chart_types,
438 261 'types' => array_keys( $chart_types ),
439 262 ),
440 263 'nonce' => wp_create_nonce(),
441 - 'buildurl' => esc_url( add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ) ),
264 + 'buildurl' => add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ),
442 265 );
443 266
444 267 return $strings;
445 268 }
@@ -452,9 +275,9 @@
452 275 * @static
453 276 * @access private
454 277 * @return array The associated array of chart types with localized names.
455 278 */
456 - public static function _getChartTypesLocalized( $enabledOnly = false, $get2Darray = false, $add_select = false, $where = null ) {
279 + public static function _getChartTypesLocalized( $enabledOnly = false, $get2Darray = false, $add_select = false ) {
457 280 $additional = array();
458 281 if ( $add_select ) {
459 282 $additional['select'] = array(
460 283 'name' => esc_html__( 'All', 'visualizer' ),
@@ -461,102 +284,59 @@
461 284 'enabled' => true,
462 285 );
463 286 }
464 287
465 - $enabled = self::proFeaturesEnabled();
466 -
467 288 $types = array_merge(
468 - $additional,
469 - array(
470 - 'tabular' => array(
471 - 'name' => esc_html__( 'Table', 'visualizer' ),
472 - 'enabled' => true,
473 - 'supports' => $enabled ? array( 'Google Charts', 'DataTable' ) : array( 'DataTable' ),
474 - ),
289 + $additional, array(
475 290 'pie' => array(
476 - 'name' => esc_html__( 'Pie/Donut', 'visualizer' ),
291 + 'name' => esc_html__( 'Pie', 'visualizer' ),
477 292 'enabled' => true,
478 - 'supports' => array( 'Google Charts', 'ChartJS' ),
479 293 ),
480 294 'line' => array(
481 295 'name' => esc_html__( 'Line', 'visualizer' ),
482 296 'enabled' => true,
483 - 'supports' => array( 'Google Charts', 'ChartJS' ),
484 297 ),
485 - 'bar' => array(
486 - 'name' => esc_html__( 'Bar', 'visualizer' ),
487 - 'enabled' => true,
488 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
489 - ),
490 298 'area' => array(
491 299 'name' => esc_html__( 'Area', 'visualizer' ),
492 - 'enabled' => $enabled,
493 - // in ChartJS, the fill option is used to make Line chart an area: https://www.chartjs.org/docs/latest/charts/area.html
494 - 'supports' => array( 'Google Charts' ),
495 - 'demo_url' => 'https://demo.themeisle.com/visualizer/area-chart/',
300 + 'enabled' => true,
496 301 ),
497 302 'geo' => array(
498 303 'name' => esc_html__( 'Geo', 'visualizer' ),
499 - 'enabled' => $enabled,
500 - 'supports' => array( 'Google Charts' ),
501 - 'demo_url' => 'https://demo.themeisle.com/visualizer/geo-chart/',
304 + 'enabled' => true,
502 305 ),
306 + 'bar' => array(
307 + 'name' => esc_html__( 'Bar', 'visualizer' ),
308 + 'enabled' => true,
309 + ),
503 310 'column' => array(
504 311 'name' => esc_html__( 'Column', 'visualizer' ),
505 - 'enabled' => $enabled,
506 - 'supports' => array( 'Google Charts', 'ChartJS' ),
507 - 'demo_url' => 'https://demo.themeisle.com/visualizer/column-chart/',
312 + 'enabled' => true,
508 313 ),
509 - 'bubble' => array(
510 - 'name' => esc_html__( 'Bubble', 'visualizer' ),
511 - 'enabled' => $enabled,
512 - // chartjs' bubble is ugly looking (and it won't work off the default bubble.csv) so it is being excluded for the time being.
513 - 'supports' => array( 'Google Charts' ),
514 - 'demo_url' => 'https://demo.themeisle.com/visualizer/bubble-chart/',
314 + 'gauge' => array(
315 + 'name' => esc_html__( 'Gauge', 'visualizer' ),
316 + 'enabled' => true,
515 317 ),
516 318 'scatter' => array(
517 319 'name' => esc_html__( 'Scatter', 'visualizer' ),
518 - 'enabled' => $enabled,
519 - 'supports' => array( 'Google Charts' ),
520 - 'demo_url' => 'https://demo.themeisle.com/visualizer/scatter-chart/',
320 + 'enabled' => true,
521 321 ),
522 - 'gauge' => array(
523 - 'name' => esc_html__( 'Gauge', 'visualizer' ),
524 - 'enabled' => $enabled,
525 - 'supports' => array( 'Google Charts' ),
526 - 'demo_url' => 'https://demo.themeisle.com/visualizer/gauge-chart/',
527 - ),
528 322 'candlestick' => array(
529 323 'name' => esc_html__( 'Candlestick', 'visualizer' ),
530 - 'enabled' => $enabled,
531 - 'supports' => array( 'Google Charts' ),
532 - 'demo_url' => 'https://demo.themeisle.com/visualizer/candlestick-chart/',
324 + 'enabled' => true,
533 325 ),
534 326 // pro types
327 + 'table' => array(
328 + 'name' => esc_html__( 'Table', 'visualizer' ),
329 + 'enabled' => false,
330 + ),
535 331 'timeline' => array(
536 332 'name' => esc_html__( 'Timeline', 'visualizer' ),
537 333 'enabled' => false,
538 - 'supports' => array( 'Google Charts', 'ChartJS' ),
539 - 'demo_url' => 'https://demo.themeisle.com/visualizer/timeline-chart/',
540 334 ),
541 335 'combo' => array(
542 336 'name' => esc_html__( 'Combo', 'visualizer' ),
543 337 'enabled' => false,
544 - 'supports' => array( 'Google Charts' ),
545 - 'demo_url' => 'https://demo.themeisle.com/visualizer/combo-chart/',
546 338 ),
547 - 'polarArea' => array(
548 - 'name' => esc_html__( 'Polar Area', 'visualizer' ),
549 - 'enabled' => false,
550 - 'supports' => array( 'ChartJS' ),
551 - 'demo_url' => 'https://demo.themeisle.com/visualizer/polar-area-chart/',
552 - ),
553 - 'radar' => array(
554 - 'name' => esc_html__( 'Radar/Spider', 'visualizer' ),
555 - 'enabled' => false,
556 - 'supports' => array( 'ChartJS' ),
557 - 'demo_url' => 'https://demo.themeisle.com/visualizer/radar-spider-chart/',
558 - ),
559 339 )
560 340 );
561 341 $types = apply_filters( 'visualizer_pro_chart_types', $types );
562 342 if ( $enabledOnly ) {
@@ -565,12 +345,8 @@
565 345 if ( ! is_array( $array ) ) {
566 346 // support for old pro
567 347 $array = array( 'enabled' => true, 'name' => $array );
568 348 }
569 - // backward compatibility for PRO before v1.9.0
570 - if ( ! array_key_exists( 'supports', $array ) ) {
571 - $array['supports'] = array( 'Google Charts' );
572 - }
573 349 if ( ! $array['enabled'] ) {
574 350 continue;
575 351 }
576 352 $filtered[ $type ] = $array;
@@ -583,74 +359,13 @@
583 359 if ( ! is_array( $array ) ) {
584 360 // support for old pro
585 361 $array = array( 'enabled' => true, 'name' => $array );
586 362 }
587 - // backward compatibility for PRO before v1.9.0
588 - if ( ! array_key_exists( 'supports', $array ) ) {
589 - $array['supports'] = array( 'Google Charts' );
590 - }
591 363 $doubleD[ $type ] = $array['name'];
592 364 }
593 365 $types = $doubleD;
594 366 }
595 367
596 - return self::handleDeprecatedCharts( $types, $enabledOnly, $get2Darray, $where );
597 - }
598 -
599 - /**
600 - * Handle (soon-to-be) deprecated charts.
601 - */
602 - private static function handleDeprecatedCharts( $types, $enabledOnly, $get2Darray, $where ) {
603 - $deprecated = array();
604 -
605 - switch ( $where ) {
606 - case 'types':
607 - // fall-through
608 - case 'library':
609 - // if a user has a Gauge/Candlestick chart, then let them keep using it.
610 - if ( ! Visualizer_Module::is_pro() ) {
611 - if ( ! self::hasChartType( 'gauge' ) ) {
612 - if ( $get2Darray ) {
613 - $deprecated[] = 'gauge';
614 - } else {
615 - $types['gauge']['enabled'] = false;
616 - }
617 - }
618 - if ( ! self::hasChartType( 'candlestick' ) ) {
619 - if ( $get2Darray ) {
620 - $deprecated[] = 'candlestick';
621 - } else {
622 - $types['candlestick']['enabled'] = false;
623 - }
624 - }
625 - }
626 - break;
627 - default:
628 - // if a user has a Gauge/Candlestick chart, then let them keep using it.
629 - if ( ! Visualizer_Module::is_pro() ) {
630 - if ( ! self::hasChartType( 'gauge' ) ) {
631 - if ( $get2Darray ) {
632 - $deprecated[] = 'gauge';
633 - } else {
634 - $types['gauge']['enabled'] = false;
635 - }
636 - }
637 - if ( ! self::hasChartType( 'candlestick' ) ) {
638 - if ( $get2Darray ) {
639 - $deprecated[] = 'candlestick';
640 - } else {
641 - $types['candlestick']['enabled'] = false;
642 - }
643 - }
644 - }
645 - }
646 -
647 - if ( $deprecated ) {
648 - foreach ( $deprecated as $type ) {
649 - unset( $types[ $type ] );
650 - }
651 - }
652 -
653 368 return $types;
654 369 }
655 370
656 371 /**
@@ -660,11 +375,11 @@
660 375 * @global string $pagenow The name of the current page.
661 376 *
662 377 * @access public
663 378 */
664 - public function renderTemplates() {
379 + public function renderTempaltes() {
665 380 global $pagenow;
666 - if ( 'post.php' !== $pagenow && 'post-new.php' !== $pagenow ) {
381 + if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
667 382 return;
668 383 }
669 384 $render = new Visualizer_Render_Templates();
670 385 $render->render();
@@ -682,159 +397,30 @@
682 397 *
683 398 * @param string $suffix The current page suffix.
684 399 */
685 400 public function enqueueLibraryScripts( $suffix ) {
686 - if ( $suffix !== $this->_libraryPage ) {
687 - return;
688 - }
689 -
690 - wp_enqueue_style( 'visualizer-library', VISUALIZER_ABSURL . 'css/library.css', array(), Visualizer_Plugin::VERSION );
691 - $this->_addFilter( 'media_upload_tabs', 'setupVisualizerTab' );
692 - wp_enqueue_media();
693 - wp_enqueue_script(
694 - 'visualizer-library',
695 - VISUALIZER_ABSURL . 'js/library.js',
696 - array(
697 - 'jquery',
698 - 'media-views',
699 - 'clipboard',
700 - ),
701 - Visualizer_Plugin::VERSION,
702 - true
703 - );
704 -
705 - wp_enqueue_script( 'visualizer-customization', $this->get_user_customization_js(), array(), null, true );
706 -
707 - $has_d3 = false;
708 - $query = $this->getQuery();
709 - while ( $query->have_posts() ) {
710 - $chart = $query->next_post();
711 - $library = $this->load_chart_type( $chart->ID );
712 - if ( is_null( $library ) ) {
713 - continue;
714 - }
401 + if ( $suffix == $this->_libraryPage ) {
402 + wp_enqueue_style( 'visualizer-library', VISUALIZER_ABSURL . 'css/library.css', array(), Visualizer_Plugin::VERSION );
403 + $this->_addFilter( 'media_upload_tabs', 'setupVisualizerTab' );
404 + wp_enqueue_media();
715 405 wp_enqueue_script(
716 - "visualizer-render-$library",
717 - VISUALIZER_ABSURL . 'js/render-facade.js',
718 - apply_filters( 'visualizer_assets_render', array( 'visualizer-library', 'visualizer-customization' ), true ),
719 - Visualizer_Plugin::VERSION,
720 - true
406 + 'visualizer-library', VISUALIZER_ABSURL . 'js/library.js', array(
407 + 'jquery',
408 + 'media-views',
409 + ), Visualizer_Plugin::VERSION, true
721 410 );
722 - if ( 'd3' === $library ) {
723 - $has_d3 = true;
724 - }
725 - }
726 -
727 - if ( $has_d3 ) {
728 - $d3_renderer_asset = VISUALIZER_ABSPATH . '/classes/Visualizer/D3Renderer/build/index.asset.php';
729 - if ( file_exists( $d3_renderer_asset ) && ! wp_script_is( 'visualizer-d3-renderer', 'registered' ) ) {
730 - /**
731 - * Ignore missing build asset in source checkout.
732 - *
733 - * @phpstan-ignore-next-line
734 - */
735 - $d3_asset = include $d3_renderer_asset;
736 - wp_register_script(
737 - 'visualizer-d3-renderer',
738 - VISUALIZER_ABSURL . 'classes/Visualizer/D3Renderer/build/index.js',
739 - array_merge( $d3_asset['dependencies'], array( 'jquery' ) ),
740 - $d3_asset['version'],
741 - true
742 - );
743 - wp_enqueue_script( 'visualizer-d3-renderer' );
744 - }
745 - wp_localize_script(
746 - 'visualizer-d3-renderer',
747 - 'vizD3Renderer',
748 - array(
749 - 'iframeJsUrl' => VISUALIZER_ABSURL . 'classes/Visualizer/D3Renderer/build/iframe.js',
750 - )
751 - );
752 - }
753 -
754 - $chart_builder_asset = VISUALIZER_ABSPATH . '/classes/Visualizer/ChartBuilder/build/index.asset.php';
755 - if ( file_exists( $chart_builder_asset ) ) {
756 - /**
757 - * Ignore missing build asset in source checkout.
758 - *
759 - * @phpstan-ignore-next-line
760 - */
761 - $asset = include $chart_builder_asset;
762 - $chart_builder_deps = $asset['dependencies'];
763 - if ( ! wp_script_is( 'visualizer-handsontable', 'registered' ) && defined( 'Visualizer_Pro_ABSURL' ) && defined( 'VISUALIZER_PRO_VERSION' ) ) {
764 - wp_register_script(
765 - 'visualizer-handsontable',
766 - Visualizer_Pro_ABSURL . 'vendor/handsontable/dist/handsontable.full.min.js',
767 - array(),
768 - VISUALIZER_PRO_VERSION,
769 - true
770 - );
771 - }
772 - if ( ! wp_style_is( 'visualizer-handsontable', 'registered' ) && defined( 'Visualizer_Pro_ABSURL' ) && defined( 'VISUALIZER_PRO_VERSION' ) ) {
773 - wp_register_style(
774 - 'visualizer-handsontable',
775 - Visualizer_Pro_ABSURL . 'vendor/handsontable/dist/handsontable.full.min.css',
776 - array(),
777 - VISUALIZER_PRO_VERSION
778 - );
779 - }
780 - if ( wp_script_is( 'visualizer-handsontable', 'registered' ) ) {
781 - wp_enqueue_script( 'visualizer-handsontable' );
782 - $chart_builder_deps = array_unique( array_merge( $chart_builder_deps, array( 'visualizer-handsontable' ) ) );
783 - }
784 - if ( wp_style_is( 'visualizer-handsontable', 'registered' ) ) {
785 - wp_enqueue_style( 'visualizer-handsontable' );
786 - }
411 + wp_enqueue_script( 'google-jsapi-new', '//www.gstatic.com/charts/loader.js', array(), null, true );
412 + wp_enqueue_script( 'google-jsapi-old', '//www.google.com/jsapi', array( 'google-jsapi-new' ), null, true );
787 413 wp_enqueue_script(
788 - 'visualizer-chart-builder',
789 - VISUALIZER_ABSURL . 'classes/Visualizer/ChartBuilder/build/index.js',
790 - $chart_builder_deps,
791 - $asset['version'],
792 - true
414 + 'visualizer-render', VISUALIZER_ABSURL . 'js/render.js', array(
415 + 'google-jsapi-old',
416 + 'visualizer-library',
417 + ), Visualizer_Plugin::VERSION, true
793 418 );
794 - wp_enqueue_style(
795 - 'visualizer-chart-builder',
796 - VISUALIZER_ABSURL . 'classes/Visualizer/ChartBuilder/build/style-index.css',
797 - array(),
798 - $asset['version']
799 - );
800 - $chart_builder_css = VISUALIZER_ABSPATH . '/classes/Visualizer/ChartBuilder/build/index.css';
801 - if ( file_exists( $chart_builder_css ) ) {
802 - wp_enqueue_style(
803 - 'visualizer-chart-builder-runtime',
804 - VISUALIZER_ABSURL . 'classes/Visualizer/ChartBuilder/build/index.css',
805 - array( 'visualizer-chart-builder' ),
806 - $asset['version']
807 - );
808 - }
809 - wp_localize_script(
810 - 'visualizer-chart-builder',
811 - 'vizAIBuilder',
812 - array(
813 - 'ajaxUrl' => admin_url( 'admin-ajax.php' ),
814 - 'nonce' => wp_create_nonce( 'visualizer-ai-builder' ),
815 - 'isPro' => Visualizer_Module::is_pro(),
816 - 'upgradeUrl' => tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'aiBuilderUpgrade', 'dataSource' ),
817 - )
818 - );
819 419 }
820 -
821 - do_action( 'themeisle_internal_page', VISUALIZER_DIRNAME, 'library' );
822 420 }
823 421
824 422 /**
825 - * Enqueue script for support page.
826 - *
827 - * @param string $hook_suffix Current hook.
828 - */
829 - public function enqueue_support_page( $hook_suffix ) {
830 - if ( $this->_supportPage !== $hook_suffix ) {
831 - return;
832 - }
833 - do_action( 'themeisle_internal_page', VISUALIZER_DIRNAME, 'support' );
834 - }
835 -
836 - /**
837 423 * Adds visualizer tab for media upload tabs array.
838 424 *
839 425 * @since 1.0.0
840 426 *
@@ -857,201 +443,24 @@
857 443 *
858 444 * @access public
859 445 */
860 446 public function registerAdminMenu() {
861 - $svg_base64_icon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNzdweCIgaGVpZ2h0PSI3N3B4IiB2aWV3Qm94PSIwIDAgNzcgNzciIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjYgKDY3NDkxKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5Db21iaW5lZCBTaGFwZTwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQcm9kdWN0LVBhZ2UiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJXb3JkUHJlc3MtcGx1Z2lucyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE5MC4wMDAwMDAsIC00MzUuMDAwMDAwKSIgZmlsbD0iIzM5QzNEMiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMjguNSw1MTIgQzIwNy4yMzcwMzcsNTEyIDE5MCw0OTQuNzYyOTYzIDE5MCw0NzMuNSBDMTkwLDQ1Mi4yMzcwMzcgMjA3LjIzNzAzNyw0MzUgMjI4LjUsNDM1IEMyNDkuNzYyOTYzLDQzNSAyNjcsNDUyLjIzNzAzNyAyNjcsNDczLjUgQzI2Nyw0OTQuNzYyOTYzIDI0OS43NjI5NjMsNTEyIDIyOC41LDUxMiBaIE0yNDYuODQzNzUsNDgzLjU5MjA1OSBMMjE1LjYyNSw0ODMuNTkyMDU5IEwyMTUuNjI1LDQ2MC44MjY1NDQgQzIxNS42MjUsNDYwLjE2NDU0NyAyMTUuMTA3NTc4LDQ1OS42MjgzNTkgMjE0LjQ2ODc1LDQ1OS42MjgzNTkgTDIxMi4xNTYyNSw0NTkuNjI4MzU5IEMyMTEuNTE3NDIyLDQ1OS42MjgzNTkgMjExLDQ2MC4xNjQ1NDcgMjExLDQ2MC44MjY1NDQgTDIxMSw0ODUuOTg4NDI5IEMyMTEsNDg3LjMxMTY3NCAyMTIuMDM1NTY2LDQ4OC4zODQ3OTggMjEzLjMxMjUsNDg4LjM4NDc5OCBMMjQ2Ljg0Mzc1LDQ4OC4zODQ3OTggQzI0Ny40ODI1NzgsNDg4LjM4NDc5OCAyNDgsNDg3Ljg0ODYxMSAyNDgsNDg3LjE4NjYxMyBMMjQ4LDQ4NC43OTAyNDQgQzI0OCw0ODQuMTI4MjQ2IDI0Ny40ODI1NzgsNDgzLjU5MjA1OSAyNDYuODQzNzUsNDgzLjU5MjA1OSBaIE0yNDQuNTMxMjUsNDYyLjAyNDcyOSBMMjM1Ljk5OTU3LDQ2Mi4wMjQ3MjkgQzIzNC40NTQ1MzEsNDYyLjAyNDcyOSAyMzMuNjgwNTY2LDQ2My45NjA1NDcgMjM0Ljc3MzIyMyw0NjUuMDkyODMyIEwyMzcuMTE0NjI5LDQ2Ny41MTkxNTYgTDIzMS44MTI1LDQ3My4wMTQzMzIgTDIyNi41MTAzNzEsNDY3LjUxOTkwNSBDMjI1LjYwNzA1MSw0NjYuNTgzODIzIDIyNC4xNDI5NDksNDY2LjU4MzgyMyAyMjMuMjQwMzUyLDQ2Ny41MTk5MDUgTDIxOC4yNzY0MjYsNDcyLjY2Mzg2MyBDMjE3LjgyNDc2Niw0NzMuMTMxOTA0IDIxNy44MjQ3NjYsNDczLjg5MDUwNSAyMTguMjc2NDI2LDQ3NC4zNTg1NDYgTDIxOS45MTEwNzQsNDc2LjA1MjQ4IEMyMjAuMzYyNzM0LDQ3Ni41MjA1MjEgMjIxLjA5NDc4NSw0NzYuNTIwNTIxIDIyMS41NDY0NDUsNDc2LjA1MjQ4IEwyMjQuODc1LDQ3Mi42MDI0NTYgTDIzMC4xNzcxMjksNDc4LjA5Njg4MyBDMjMxLjA4MDQ0OSw0NzkuMDMyOTY1IDIzMi41NDQ1NTEsNDc5LjAzMjk2NSAyMzMuNDQ3MTQ4LDQ3OC4wOTY4ODMgTDI0MC4zODQ2NDgsNDcwLjkwNzc3MyBMMjQyLjcyNjA1NSw0NzMuMzM0MDk4IEMyNDMuODE4NzExLDQ3NC40NjYzODIgMjQ1LjY4Njc3Nyw0NzMuNjY0MzQ3IDI0NS42ODY3NzcsNDcyLjA2MzI3MyBMMjQ1LjY4Njc3Nyw0NjMuMjIyOTE0IEMyNDUuNjg3NSw0NjIuNTYwOTE3IDI0NS4xNzAwNzgsNDYyLjAyNDcyOSAyNDQuNTMxMjUsNDYyLjAyNDcyOSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==';
862 -
863 - $this->_libraryPage = add_menu_page( __( 'Visualizer', 'visualizer' ), __( 'Visualizer', 'visualizer' ), 'edit_posts', Visualizer_Plugin::NAME, array( $this, 'renderLibraryPage' ), $svg_base64_icon, 99.7666 );
864 -
865 - add_submenu_page(
866 - Visualizer_Plugin::NAME,
867 - __( 'Chart Library', 'visualizer' ),
868 - __( 'Chart Library', 'visualizer' ),
869 - 'edit_posts',
870 - 'admin.php?page=' . Visualizer_Plugin::NAME
871 - );
872 - add_submenu_page(
873 - Visualizer_Plugin::NAME,
874 - __( 'Add New Chart', 'visualizer' ),
875 - __( 'Add New Chart', 'visualizer' ),
876 - 'edit_posts',
877 - 'admin.php?page=' . Visualizer_Plugin::NAME . '&vaction=addnew'
878 - );
879 -
880 - $this->_settingsPage = add_submenu_page(
881 - Visualizer_Plugin::NAME,
882 - __( 'Settings', 'visualizer' ),
883 - __( 'Settings', 'visualizer' ),
884 - 'manage_options',
885 - 'viz-settings',
886 - array( $this, 'renderSettingsPage' )
887 - );
888 -
889 - $this->_supportPage = add_submenu_page(
890 - Visualizer_Plugin::NAME,
891 - __( 'Support', 'visualizer' ),
892 - __( 'Support', 'visualizer' ) . '<span class="dashicons dashicons-editor-help more-features-icon" style="width: 17px; height: 17px; margin-left: 4px; color: #ffca54; font-size: 17px; vertical-align: -3px;"></span>',
893 - 'edit_posts',
894 - 'viz-support',
895 - array( $this, 'renderSupportPage' )
896 - );
897 -
898 - remove_submenu_page( Visualizer_Plugin::NAME, Visualizer_Plugin::NAME );
899 -
900 - add_action( "load-{$this->_libraryPage}", array( $this, 'addScreenOptions' ) );
901 - add_action( 'admin_footer', array( $this, 'handleGetProSubMenu' ) );
447 + $title = esc_html__( 'Visualizer Library', 'visualizer' );
448 + $callback = array( $this, 'renderLibraryPage' );
449 + $this->_libraryPage = add_submenu_page( 'upload.php', $title, $title, 'edit_posts', Visualizer_Plugin::NAME, $callback );
902 450 }
903 451
904 452 /**
905 - * Handle get pro plugin submenu.
453 + * Renders visualizer library page.
454 + *
455 + * @since 1.0.0
456 + *
457 + * @access public
906 458 */
907 - public function handleGetProSubMenu() {
908 - if ( ! Visualizer_Module::is_pro() ) {
909 - ?>
910 - <style type="text/css">
911 - #toplevel_page_visualizer ul.wp-submenu li:last-child {
912 - background: #FF7E65;
913 - font-size: 14px;
914 - font-weight: 600;
915 - color: #fff;
916 - }
917 - #toplevel_page_visualizer ul.wp-submenu li:last-child > a > span {
918 - color: #fff !important;
919 - }
920 - #toplevel_page_visualizer ul.wp-submenu li:last-child > a:hover {
921 - box-shadow: inherit;
922 - }
923 - </style>
924 - <?php
925 - if ( get_option( 'visualizer_fresh_install', false ) ) {
926 - ?>
927 - <style type="text/css">
928 - #toplevel_page_visualizer ul.wp-submenu li.wp-first-item + li + li + li {
929 - display: none;
930 - }
931 - </style>
932 - <?php
933 - }
934 - }
935 - }
936 -
937 - /**
938 - * Adds the screen options for pagination.
939 - */
940 - public function addScreenOptions() {
941 - $screen = get_current_screen();
942 -
943 - // bail if it's some other page.
944 - if ( ! is_object( $screen ) || $screen->id !== $this->_libraryPage ) {
945 - return;
946 - }
947 -
948 - $args = array(
949 - 'label' => __( 'Number of charts per page:', 'visualizer' ),
950 - 'default' => 6,
951 - 'option' => 'visualizer_library_per_page',
952 - );
953 - add_screen_option( 'per_page', $args );
954 - }
955 -
956 - /**
957 - * Returns the screen option for pagination.
958 - */
959 - public function setScreenOptions( $status, $option, $value ) {
960 - if ( 'visualizer_library_per_page' === $option ) {
961 - return $value;
962 - }
963 - }
964 -
965 - /**
966 - * Adds the display filters to be used in the meta_query while displaying the charts.
967 - */
968 - private function getDisplayFilters( &$query_args ) {
969 - $query = array();
970 - global $sitepress;
971 - if ( Visualizer_Module::is_pro() && ( function_exists( 'icl_get_languages' ) && $sitepress instanceof \SitePress ) ) {
972 - $current_lang = icl_get_current_language();
973 - if ( in_array( $current_lang, array( 'all', icl_get_default_language() ), true ) ) {
974 - $query[] = array(
975 - 'key' => 'chart_lang',
976 - 'compare' => 'NOT EXISTS',
977 - );
978 - } else {
979 - $query[] = array(
980 - 'key' => 'chart_lang',
981 - 'value' => $current_lang,
982 - 'compare' => '=',
983 - );
984 - }
985 - }
986 -
987 - // add chart type filter to the query arguments
988 - $type = filter_input( INPUT_GET, 'type' );
989 - if ( $type && in_array( $type, Visualizer_Plugin::getChartTypes(), true ) ) {
990 - $query[] = array(
991 - 'key' => Visualizer_Plugin::CF_CHART_TYPE,
992 - 'value' => $type,
993 - 'compare' => '=',
994 - );
995 - }
996 -
997 - // add chart library filter to the query arguments
998 - $library = filter_input( INPUT_GET, 'library' );
999 - if ( $library ) {
1000 - $query[] = array(
1001 - 'key' => Visualizer_Plugin::CF_CHART_LIBRARY,
1002 - 'value' => $library,
1003 - 'compare' => '=',
1004 - );
1005 - }
1006 -
1007 - // add date filter to the query arguments
1008 - $date = filter_input( INPUT_GET, 'date' );
1009 - $possible = array_keys( Visualizer_Plugin::getSupportedDateFilter() );
1010 - if ( $date && in_array( $date, $possible, true ) ) {
1011 - $query_args['date_query'] = array(
1012 - 'after' => "$date -1 day",
1013 - 'inclusive' => true,
1014 - );
1015 - }
1016 -
1017 - // add source filter to the query arguments
1018 - $source = filter_input( INPUT_GET, 'source' );
1019 - if ( $source ) {
1020 - $source = ucwords( $source );
1021 - $source = "Visualizer_Source_{$source}";
1022 - $query[] = array(
1023 - 'key' => Visualizer_Plugin::CF_SOURCE,
1024 - 'value' => $source,
1025 - 'compare' => '=',
1026 - );
1027 - }
1028 -
1029 - $query_args['meta_query'] = $query;
1030 -
1031 - $orderby = filter_input( INPUT_GET, 'orderby' );
1032 - $order = filter_input( INPUT_GET, 'order' );
1033 - if ( $orderby ) {
1034 - $query_args['order_by'] = $orderby;
1035 - }
1036 - $query_args['order'] = empty( $order ) ? 'desc' : $order;
1037 - }
1038 -
1039 - /**
1040 - * Get the instance of WP_Query that fetches the charts as per the given criteria.
1041 - */
1042 - private function getQuery() {
1043 - static $q;
1044 - if ( ! is_null( $q ) ) {
1045 - return $q;
1046 - }
1047 -
459 + public function renderLibraryPage() {
1048 460 // get current page
1049 461 $page = filter_input(
1050 - INPUT_GET,
1051 - 'vpage',
1052 - FILTER_VALIDATE_INT,
1053 - array(
462 + INPUT_GET, 'vpage', FILTER_VALIDATE_INT, array(
1054 463 'options' => array(
1055 464 'min_range' => 1,
1056 465 'default' => 1,
1057 466 ),
@@ -1056,34 +465,29 @@
1056 465 'default' => 1,
1057 466 ),
1058 467 )
1059 468 );
1060 -
1061 - $per_page = 6;
1062 - $screen = get_current_screen();
1063 - if ( $screen ) {
1064 - // retrieve the per_page option
1065 - $screen_option = $screen->get_option( 'per_page', 'option' );
1066 - // retrieve the value stored for the current user
1067 - $user = get_current_user_id();
1068 - $per_page = get_user_meta( $user, $screen_option, true );
1069 - if ( empty( $per_page ) || $per_page < 1 ) {
1070 - // nothing set, get the default value
1071 - $per_page = $screen->get_option( 'per_page', 'default' );
1072 - }
1073 - }
1074 -
1075 469 // the initial query arguments to fetch charts
1076 470 $query_args = array(
1077 471 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
1078 - 'posts_per_page' => $per_page,
472 + 'posts_per_page' => 6,
1079 473 'paged' => $page,
1080 474 );
1081 -
1082 - $this->getDisplayFilters( $query_args );
1083 -
475 + // add chart type filter to the query arguments
476 + $filter = filter_input( INPUT_GET, 'type' );
477 + if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
478 + $query_args['meta_query'] = array(
479 + array(
480 + 'key' => Visualizer_Plugin::CF_CHART_TYPE,
481 + 'value' => $filter,
482 + 'compare' => '=',
483 + ),
484 + );
485 + } else {
486 + $filter = 'all';
487 + }
1084 488 // Added by Ash/Upwork
1085 - $filterByMeta = ! empty( $_GET['s'] ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : null; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
489 + $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
1086 490 if ( $filterByMeta ) {
1087 491 $query = array(
1088 492 'key' => Visualizer_Plugin::CF_SETTINGS,
1089 493 'value' => $filterByMeta,
@@ -1092,246 +496,56 @@
1092 496 $meta = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : array();
1093 497 $meta[] = $query;
1094 498 $query_args['meta_query'] = $meta;
1095 499 }
1096 - $q = new WP_Query( apply_filters( 'visualizer_query_args', $query_args ) );
1097 - return $q;
1098 - }
1099 -
1100 - /**
1101 - * Renders support page.
1102 - *
1103 - * @since 3.3.0
1104 - *
1105 - * @access public
1106 - */
1107 - public function renderSupportPage() {
1108 - wp_enqueue_style( 'visualizer-upsell', VISUALIZER_ABSURL . 'css/upsell.css', array(), Visualizer_Plugin::VERSION );
1109 - include_once VISUALIZER_ABSPATH . '/templates/support.php';
1110 - }
1111 -
1112 - /**
1113 - * Enqueues scripts/styles for the Settings page.
1114 - *
1115 - * @access public
1116 - */
1117 - public function enqueueSettingsScripts( string $hook_suffix ): void {
1118 - if ( $this->_settingsPage !== $hook_suffix ) {
1119 - return;
1120 - }
1121 - wp_enqueue_style( 'wp-color-picker' );
1122 - wp_enqueue_script( 'wp-color-picker' );
1123 - }
1124 -
1125 - /**
1126 - * Renders the global style settings page.
1127 - *
1128 - * @access public
1129 - */
1130 - public function renderSettingsPage(): void {
1131 - if ( ! current_user_can( 'manage_options' ) ) {
1132 - wp_die( esc_html__( 'You do not have sufficient permissions to access this page.', 'visualizer' ) );
1133 - }
1134 - $settings = self::getGlobalSettings();
1135 - include_once VISUALIZER_ABSPATH . '/templates/global-settings.php';
1136 - }
1137 -
1138 - /**
1139 - * Returns the global style settings option.
1140 - *
1141 - * @return array<string, string>
1142 - * @access public
1143 - * @static
1144 - */
1145 - public static function getGlobalSettings(): array {
1146 - $defaults = array(
1147 - 'color_primary' => '',
1148 - 'color_secondary' => '',
1149 - 'apply_existing' => '0',
1150 - );
1151 - $saved = get_option( self::OPTION_GLOBAL_SETTINGS, array() );
1152 - return wp_parse_args( $saved, $defaults );
1153 - }
1154 -
1155 - /**
1156 - * Handles saving of the global style settings.
1157 - *
1158 - * @access public
1159 - */
1160 - public function saveGlobalSettings(): void {
1161 - if ( ! current_user_can( 'manage_options' ) ) {
1162 - wp_die( esc_html__( 'You do not have sufficient permissions to access this page.', 'visualizer' ) );
1163 - }
1164 -
1165 - check_admin_referer( 'visualizer_save_global_settings' );
1166 -
1167 - $color_primary = sanitize_hex_color( wp_unslash( $_POST['visualizer_color_primary'] ?? '' ) );
1168 - $color_secondary = sanitize_hex_color( wp_unslash( $_POST['visualizer_color_secondary'] ?? '' ) );
1169 - $apply_existing = ! empty( $_POST['visualizer_apply_existing'] ) ? '1' : '0';
1170 - $clear = ! empty( $_POST['visualizer_clear_settings'] );
1171 -
1172 - if ( $clear ) {
1173 - delete_option( self::OPTION_GLOBAL_SETTINGS );
1174 - } else {
1175 - $settings = array(
1176 - 'color_primary' => $color_primary ? $color_primary : '',
1177 - 'color_secondary' => $color_secondary ? $color_secondary : '',
1178 - 'apply_existing' => $apply_existing,
1179 - );
1180 - update_option( self::OPTION_GLOBAL_SETTINGS, $settings );
1181 - }
1182 -
1183 - wp_safe_redirect(
1184 - add_query_arg(
1185 - array(
1186 - 'page' => 'viz-settings',
1187 - 'updated' => $clear ? 'cleared' : 'true',
1188 - ),
1189 - admin_url( 'admin.php' )
1190 - )
1191 - );
1192 - exit;
1193 - }
1194 -
1195 - /**
1196 - * Renders visualizer library page.
1197 - *
1198 - * @since 1.0.0
1199 - *
1200 - * @access public
1201 - */
1202 - public function renderLibraryPage() {
500 + // Added by Ash/Upwork
501 + // fetch charts
1203 502 $charts = array();
1204 - $query = $this->getQuery();
1205 -
1206 - // get current page
1207 - $page = filter_input(
1208 - INPUT_GET,
1209 - 'vpage',
1210 - FILTER_VALIDATE_INT,
1211 - array(
1212 - 'options' => array(
1213 - 'min_range' => 1,
1214 - 'default' => 1,
1215 - ),
1216 - )
1217 - );
1218 - // add chart type filter to the query arguments
1219 - $filter = filter_input( INPUT_GET, 'type' );
1220 - if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes(), true ) ) ) {
1221 - $filter = 'all';
1222 - }
1223 -
1224 - $css = '';
503 + $query = new WP_Query( $query_args );
1225 504 while ( $query->have_posts() ) {
1226 505 $chart = $query->next_post();
1227 506
1228 507 // if the user has updated a chart and instead of saving it, has closed the modal. If the user refreshes, they should get the original chart.
1229 508 $chart = $this->handleExistingRevisions( $chart->ID, $chart );
1230 - // refresh a "live" db query chart.
1231 - $chart = apply_filters( 'visualizer_schedule_refresh_chart', $chart, $chart->ID, false );
1232 509
1233 - $type = get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
1234 -
1235 510 // fetch and update settings
1236 511 $settings = get_post_meta( $chart->ID, Visualizer_Plugin::CF_SETTINGS, true );
1237 -
1238 - $settings = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SETTINGS, $settings, $chart->ID, $type );
1239 - if ( ! empty( $atts['settings'] ) ) {
1240 - $settings = apply_filters( $atts['settings'], $settings, $chart->ID, $type );
1241 - }
1242 -
1243 - if ( $settings ) {
1244 - unset( $settings['height'], $settings['width'], $settings['chartArea'] );
1245 - }
1246 -
512 + unset( $settings['height'], $settings['width'] );
513 + $type = get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
1247 514 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
1248 - $data = self::get_chart_data( $chart, $type );
1249 -
1250 - // Set default setting series when add manual chart data - Only during first creation.
1251 - if ( isset( $settings['series'] ) && ! empty( $series ) ) {
1252 - $count_series = count( $series ) - count( $settings['series'] );
1253 - if ( $count_series > 1 ) {
1254 - $clone_last_series = end( $settings['series'] );
1255 - $clone_last_series = array_fill_keys( array_keys( $clone_last_series ), '' );
1256 - foreach ( range( 1, $count_series ) as $item ) {
1257 - $settings['series'][] = $clone_last_series;
1258 - }
1259 - }
1260 - }
1261 -
1262 - $library = $this->load_chart_type( $chart->ID );
1263 -
1264 - $id = 'visualizer-' . $chart->ID;
1265 - $arguments = $this->get_inline_custom_css( $id, $settings );
1266 - if ( ! empty( $arguments ) ) {
1267 - $css .= $arguments[0];
1268 - $settings = $arguments[1];
1269 - }
1270 -
1271 - if ( isset( $settings['controls']['ui']['labelStacking'] ) ) {
1272 - unset( $settings['controls']['ui']['labelStacking'] );
1273 - }
1274 - if ( isset( $settings['controls']['ui']['orientation'] ) ) {
1275 - unset( $settings['controls']['ui']['orientation'] );
1276 - }
1277 -
515 + $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( $chart->post_content ) ), $chart->ID, $type );
1278 516 // add chart to the array
1279 - $charts[ $id ] = array(
517 + $charts[ 'visualizer-' . $chart->ID ] = array(
1280 518 'id' => $chart->ID,
1281 - 'title' => $chart->post_title,
1282 519 'type' => $type,
1283 520 'series' => $series,
1284 521 'settings' => $settings,
1285 522 'data' => $data,
1286 - 'library' => $library,
1287 523 );
1288 - if ( 'd3' === $library ) {
1289 - $charts[ $id ]['code'] = get_post_meta( $chart->ID, Visualizer_Module_AIBuilder::CF_D3_CODE, true );
1290 - }
1291 524 }
1292 525 // enqueue charts array
1293 526 $ajaxurl = admin_url( 'admin-ajax.php' );
1294 -
1295 527 wp_localize_script(
1296 - 'visualizer-library',
1297 - 'visualizer',
1298 - array(
528 + 'visualizer-library', 'visualizer', array(
1299 529 'language' => $this->get_language(),
1300 530 'map_api_key' => get_option( 'visualizer-map-api-key' ),
1301 531 'charts' => $charts,
1302 532 'urls' => array(
1303 - 'base' => esc_url( add_query_arg( array( 'vpage' => false, 'vaction' => false ) ) ),
1304 - 'create' => esc_url(
1305 - add_query_arg(
1306 - array(
1307 - 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
1308 - 'library' => 'yes',
1309 - 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
1310 - 'chart-library' => isset( $_GET['chart-library'] ) ? $_GET['chart-library'] : '',
1311 - 'vaction' => false,
1312 - ),
1313 - $ajaxurl
1314 - )
533 + 'base' => add_query_arg( 'vpage', false ),
534 + 'create' => add_query_arg(
535 + array(
536 + 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
537 + 'library' => 'yes',
538 + 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
539 + ), $ajaxurl
1315 540 ),
1316 - 'edit' => esc_url(
1317 - add_query_arg(
1318 - array(
1319 - 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
1320 - 'library' => 'yes',
1321 - 'vaction' => false,
1322 - ),
1323 - $ajaxurl
1324 - )
541 + 'edit' => add_query_arg(
542 + array(
543 + 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
544 + 'library' => 'yes',
545 + ), $ajaxurl
1325 546 ),
1326 547 ),
1327 - 'page_type' => 'library',
1328 - 'is_front' => false,
1329 - 'i10n' => array(
1330 - 'copied' => __( 'The shortcode has been copied to your clipboard. Hit Ctrl-V/Cmd-V to paste it.', 'visualizer' ),
1331 - 'conflict' => __( 'We have detected a potential conflict with another component that prevents Visualizer from functioning properly. Please disable any of the following components if they are activated on your instance: Modern Events Calendar plugin, Acronix plugin. In case the aforementioned components are not activated or you continue to see this error message, please disable all other plugins and enable them one by one to find out the component that is causing the conflict.', 'visualizer' ),
1332 - ),
1333 - 'is_pro_user' => Visualizer_Module::is_pro(),
1334 548 )
1335 549 );
1336 550 // render library page
1337 551 $render = new Visualizer_Render_Library();
@@ -1336,13 +550,12 @@
1336 550 // render library page
1337 551 $render = new Visualizer_Render_Library();
1338 552 $render->charts = $charts;
1339 553 $render->type = $filter;
1340 - $render->types = self::_getChartTypesLocalized( false, false, false, true );
1341 - $render->custom_css = $css;
554 + $render->types = self::_getChartTypesLocalized();
1342 555 $render->pagination = paginate_links(
1343 556 array(
1344 - 'base' => add_query_arg( array( 'vpage' => '%#%', 'vaction' => false ) ),
557 + 'base' => add_query_arg( 'vpage', '%#%' ),
1345 558 'format' => '',
1346 559 'current' => $page,
1347 560 'total' => $query->max_num_pages,
1348 561 'type' => 'array',
@@ -1347,9 +560,8 @@
1347 560 'total' => $query->max_num_pages,
1348 561 'type' => 'array',
1349 562 )
1350 563 );
1351 -
1352 564 $render->render();
1353 565 }
1354 566
1355 567 /**
@@ -1364,14 +576,14 @@
1364 576 *
1365 577 * @return array Updated array of action links.
1366 578 */
1367 579 public function getPluginActionLinks( $links, $file ) {
1368 - if ( $file === plugin_basename( VISUALIZER_BASEFILE ) ) {
580 + if ( $file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1369 581 array_unshift(
1370 582 $links,
1371 583 sprintf(
1372 584 '<a href="%s">%s</a>',
1373 - admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME ),
585 + admin_url( 'upload.php?page=' . Visualizer_Plugin::NAME ),
1374 586 esc_html__( 'Library', 'visualizer' )
1375 587 )
1376 588 );
1377 589 }
@@ -1391,268 +603,21 @@
1391 603 *
1392 604 * @return array Updated array of plugin meta links.
1393 605 */
1394 606 public function getPluginMetaLinks( $plugin_meta, $plugin_file ) {
1395 - if ( Visualizer_Module::is_pro() ) {
1396 - return $plugin_meta;
1397 - }
1398 -
1399 - // Also suppress the upsell when Pro is installed but not currently active.
1400 - if ( ! function_exists( 'get_plugins' ) ) {
1401 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
1402 - }
1403 - foreach ( array_keys( get_plugins() ) as $installed_plugin ) {
1404 - if ( false !== strpos( $installed_plugin, 'visualizer-pro' ) ) {
1405 - return $plugin_meta;
1406 - }
1407 - }
1408 -
1409 - if ( $plugin_file === plugin_basename( VISUALIZER_BASEFILE ) ) {
1410 - $is_black_friday = apply_filters( 'themeisle_sdk_is_black_friday_sale', false );
607 + if ( $plugin_file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1411 608 // knowledge base link
1412 609 $plugin_meta[] = sprintf(
1413 - '<a href="' . VISUALIZER_MAIN_DOC . '" target="_blank">%s</a>',
1414 - esc_html__( 'Docs', 'visualizer' )
610 + '<a href="https://github.com/codeinwp/visualizer/wiki" target="_blank">%s</a>',
611 + esc_html__( 'Knowledge Base', 'visualizer' )
1415 612 );
1416 - if ( ! $is_black_friday ) {
1417 - // flattr link
1418 - $plugin_meta[] = sprintf(
1419 - '<a style="color:red" href="' . tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'pluginrow' ) . '" target="_blank">%s</a>',
1420 - esc_html__( 'Get Visualizer Pro', 'visualizer' )
1421 - );
1422 - }
613 + // flattr link
614 + $plugin_meta[] = sprintf(
615 + '<a style="color:red" href="https://themeisle.com/plugins/visualizer-charts-and-graphs-pro-addon/" target="_blank">%s</a>',
616 + esc_html__( 'Pro Addon', 'visualizer' )
617 + );
1423 618 }
1424 619
1425 620 return $plugin_meta;
1426 621 }
1427 622
1428 - /**
1429 - * Returns true when premium chart types should be enabled for the current user.
1430 - *
1431 - * Pro 1.9.0+ hooks the 'visualizer_is_pro' filter and returns true only when
1432 - * the license is valid. Pre-1.9.0 Pro defined a Visualizer_Pro class instead;
1433 - * we detect that as a fallback so those legacy installs still work.
1434 - *
1435 - * Passing false as the filter default ensures the constant VISUALIZER_PRO
1436 - * (which is set to true whenever the Pro class exists, regardless of license
1437 - * state) cannot bypass the license check.
1438 - *
1439 - * @return bool
1440 - */
1441 - public static function proFeaturesEnabled() {
1442 - $is_pro_filter = apply_filters( 'visualizer_is_pro', false );
1443 -
1444 - // Pro 1.9.0+: filter is hooked and returns true only with a valid license.
1445 - if ( $is_pro_filter ) {
1446 - return true;
1447 - }
1448 -
1449 - // Pro is installed (active) but the license check above did not pass.
1450 - // Do NOT fall through to the legacy "old user" path — that path exists
1451 - // only for sites that never had Pro installed. If Pro is present but
1452 - // the license is inactive we should lock, regardless of chart history.
1453 - if ( class_exists( 'Visualizer_Pro', false ) ) {
1454 - return false;
1455 - }
1456 -
1457 - // No Pro installed at all: grant legacy access to existing users so
1458 - // their charts are not suddenly broken when they upgrade the free plugin.
1459 - return 'yes' === get_option( 'visualizer-new-user' ) ? false : true;
1460 - }
1461 -
1462 - /**
1463 - * Multilingual Support.
1464 - *
1465 - * @param int $chart_id Chart ID.
1466 - * @return bool Default false
1467 - */
1468 - public function addMultilingualSupport( $chart_id ) {
1469 - global $sitepress;
1470 - if ( Visualizer_Module::is_pro() ) {
1471 - return;
1472 - }
1473 - if ( function_exists( 'icl_get_languages' ) && $sitepress instanceof \SitePress ) {
1474 - $language = icl_get_languages();
1475 - $current_lang = icl_get_current_language();
1476 - $default_lang = icl_get_default_language();
1477 - $post_info = wpml_get_language_information( null, $chart_id );
1478 - $translations = array();
1479 - if ( ! empty( $post_info ) && ( $default_lang === $post_info['language_code'] ) ) {
1480 - $trid = $sitepress->get_element_trid( $chart_id, 'post_' . Visualizer_Plugin::CPT_VISUALIZER );
1481 - $translations = $sitepress->get_element_translations( $trid );
1482 - }
1483 - if ( empty( $translations ) ) {
1484 - return;
1485 - }
1486 - ?>
1487 - <hr><div class="visualizer-languages-list only-pro">
1488 - <?php
1489 - foreach ( $language as $lang ) {
1490 - $lang_code = $lang['code'];
1491 - if ( $current_lang !== $lang_code ) {
1492 - ?>
1493 - <a href="javascript:;">
1494 - <img src="<?php echo esc_url( $lang['country_flag_url'] ); ?>" alt="<?php echo esc_attr( $lang['translated_name'] ); ?>">
1495 - </a>
1496 - <?php
1497 - }
1498 - }
1499 - ?>
1500 - <a href="<?php echo tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'wpml-support', 'visualizer_render_char' ); ?>"target="_blank"><?php esc_html_e( 'Upgrade to PRO to active this translation for charts', 'visualizer' ); ?></a>
1501 - </div>
1502 - <?php
1503 - }
1504 - }
1505 -
1506 - /**
1507 - * Check chart is enabled or not.
1508 - *
1509 - * @param string $type Chart ID.
1510 - *
1511 - * @return bool Default false
1512 - */
1513 - public static function checkChartStatus( $type ) {
1514 - $types = self::_getChartTypesLocalized( false, false, false, true );
1515 - if ( isset( $types[ $type ] ) ) {
1516 - return ! empty( $types[ $type ]['enabled'] );
1517 - }
1518 - return false;
1519 - }
1520 -
1521 - /**
1522 - * Get the survey metadata.
1523 - *
1524 - * @param array $data The data for survey in Formbricks format.
1525 - * @param string $page_slug The slug of the loaded page.
1526 - *
1527 - * @return array The survey metadata.
1528 - */
1529 - public function get_survey_metadata( $data, $page_slug ) {
1530 - $install_date = get_option( 'visualizer_install', time() );
1531 - $install_days_number = intval( ( time() - $install_date ) / DAY_IN_SECONDS );
1532 -
1533 - $license_status = apply_filters( 'product_visualizer_license_status', 'invalid' );
1534 - $license_plan = apply_filters( 'product_visualizer_license_plan', false );
1535 - $license_key = apply_filters( 'product_visualizer_license_key', false );
1536 -
1537 - $plugin_data = get_plugin_data( VISUALIZER_BASEFILE, false, false );
1538 - $plugin_version = '';
1539 -
1540 - if ( ! empty( $plugin_data['Version'] ) ) {
1541 - $plugin_version = $plugin_data['Version'];
1542 - }
1543 -
1544 - $count_charts_cache_key = 'visualizer_count_charts';
1545 - $charts_number = get_transient( $count_charts_cache_key );
1546 -
1547 - if ( false === $charts_number ) {
1548 - $charts_number = $this->count_charts( 100 );
1549 - set_transient( $count_charts_cache_key, $charts_number, 100 === $charts_number ? WEEK_IN_SECONDS : 6 * HOUR_IN_SECONDS );
1550 - } else {
1551 - $charts_number = strval( $charts_number );
1552 - }
1553 -
1554 - $data = array(
1555 - 'environmentId' => 'cltef8cut1s7wyyfxy3rlxzs5',
1556 - 'attributes' => array(
1557 - 'free_version' => $plugin_version,
1558 - 'pro_version' => defined( 'VISUALIZER_PRO_VERSION' ) ? VISUALIZER_PRO_VERSION : '',
1559 - 'license_status' => $license_status,
1560 - 'install_days_number' => $install_days_number,
1561 - 'charts_number' => $charts_number,
1562 - ),
1563 - );
1564 -
1565 - if ( ! empty( $license_plan ) ) {
1566 - $data['attributes']['plan'] = $license_plan;
1567 - }
1568 -
1569 - if ( ! empty( $license_key ) ) {
1570 - $data['attributes']['license_key'] = apply_filters( 'themeisle_sdk_secret_masking', $license_key );
1571 - }
1572 -
1573 - return $data;
1574 - }
1575 -
1576 - /**
1577 - * Count the charts.
1578 - *
1579 - * @param int $limit The count limit (optional).
1580 - *
1581 - * @return int The number of charts.
1582 - */
1583 - public function count_charts( $limit = -1 ) {
1584 - $args = array(
1585 - 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
1586 - 'post_status' => 'publish',
1587 - 'posts_per_page' => $limit,
1588 - 'fields' => 'ids',
1589 - );
1590 -
1591 - $query = new WP_Query( $args);
1592 - return $query->post_count;
1593 - }
1594 -
1595 - /**
1596 - * Set the black friday data.
1597 - *
1598 - * @param array $configs The configuration array for the loaded products.
1599 - * @return array
1600 - */
1601 - public function add_black_friday_data( $configs ) {
1602 - $config = $configs['default'];
1603 -
1604 - $message = __( 'Database queries, private charts, auto-sync. Go beyond basic charts. Exclusively for existing Visualizer users.', 'visualizer' );
1605 - $cta_label = __( 'Get Visualizer Pro', 'visualizer' );
1606 -
1607 - $plan = apply_filters( 'product_visualizer_license_plan', 0 );
1608 - $license = apply_filters( 'product_visualizer_license_key', false );
1609 - $status = apply_filters( 'product_visualizer_license_status', false );
1610 - $pro_product_slug = defined( 'VISUALIZER_PRO_BASEFILE' ) ? basename( dirname( VISUALIZER_PRO_BASEFILE ) ) : '';
1611 -
1612 - $is_pro = 'valid' === $status;
1613 - $is_expired = 'expired' === $status || 'active-expired' === $status;
1614 -
1615 - if ( $is_pro ) {
1616 - // translators: %s is the discount percentage.
1617 - $config['plugin_meta_message'] = sprintf( __( 'Black Friday Sale - up to %s off', 'visualizer' ), '30%' );
1618 - // translators: %1$s - discount, %2$s - discount.
1619 - $message = sprintf( __( 'Upgrade your Visualizer Pro plan: %1$s off this week. Already on the plan you need? Renew early and save up to %2$s.', 'visualizer' ), '30%', '20%' );
1620 - $cta_label = __( 'See your options', 'visualizer' );
1621 - } elseif ( $is_expired ) {
1622 - // translators: %s is the discount percentage.
1623 - $config['upgrade_menu_text'] = sprintf( __( 'BF Sale - %s off', 'visualizer' ), '50%' );
1624 - // translators: %s is the discount percentage.
1625 - $config['plugin_meta_message'] = sprintf( __( 'Black Friday Sale - %s off', 'visualizer' ), '50%' );
1626 - $message = __( 'Your Visualizer Pro features are still here, just locked. Renew at a reduced rate this week.', 'visualizer' );
1627 - $cta_label = __( 'Reactivate now', 'visualizer' );
1628 - } else {
1629 - // translators: %s is the discount percentage.
1630 - $config['plugin_meta_message'] = sprintf( __( 'Black Friday Sale - %s off', 'visualizer' ), '60%' );
1631 - $config['title'] = __( 'Visualizer Pro: 60% off this week', 'visualizer' );
1632 - // translators: %s is the discount percentage.
1633 - $config['upgrade_menu_text'] = sprintf( __( 'BF Sale - %s off', 'visualizer' ), '60%' );
1634 - }
1635 -
1636 - $url_params = array(
1637 - 'utm_term' => $is_pro ? 'plan-' . $plan : 'free',
1638 - 'lkey' => ! empty( $license ) ? $license : false,
1639 - 'expired' => $is_expired ? '1' : false,
1640 - );
1641 -
1642 - if ( ( $is_pro || $is_expired ) && ! empty( $pro_product_slug ) ) {
1643 - $config['plugin_meta_targets'] = array( $pro_product_slug );
1644 - }
1645 -
1646 - $config['message'] = $message;
1647 - $config['cta_label'] = $cta_label;
1648 -
1649 - $config['sale_url'] = add_query_arg(
1650 - $url_params,
1651 - tsdk_translate_link( tsdk_utmify( 'https://themeisle.link/vizualizer-bf', 'bfcm', 'visualizer' ) )
1652 - );
1653 -
1654 - $configs[ VISUALIZER_DIRNAME ] = $config;
1655 -
1656 - return $configs;
1657 - }
1658 623 }