PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.11.10
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.11.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 +638 -99 3.1.03.11.10 View file →
@@ -52,26 +52,135 @@
52 52 public function __construct( Visualizer_Plugin $plugin ) {
53 53 parent::__construct( $plugin );
54 54 $this->_addAction( 'load-post.php', 'enqueueMediaScripts' );
55 55 $this->_addAction( 'load-post-new.php', 'enqueueMediaScripts' );
56 + $this->_addAction( 'enqueue_block_editor_assets', 'enqueueMediaScripts' );
56 57 $this->_addAction( 'admin_footer', 'renderTemplates' );
57 - $this->_addAction( 'admin_enqueue_scripts', 'enqueueLibraryScripts', null, 8 );
58 + $this->_addAction( 'admin_enqueue_scripts', 'enqueueLibraryScripts', null, 0 );
58 59 $this->_addAction( 'admin_menu', 'registerAdminMenu' );
59 60 $this->_addFilter( 'media_view_strings', 'setupMediaViewStrings' );
60 61 $this->_addFilter( 'plugin_action_links', 'getPluginActionLinks', 10, 2 );
62 + $this->_addFilter( 'plugin_row_meta', 'getPluginMetaLinks', 10, 2 );
61 63 $this->_addFilter( 'visualizer_logger_data', 'getLoggerData' );
62 - $this->_addFilter( 'visualizer_get_chart_counts', 'getChartCountsByTypeAndMeta' );
63 64 $this->_addFilter( 'visualizer_feedback_review_trigger', 'feedbackReviewTrigger' );
64 65
66 + // screen pagination
67 + $this->_addFilter( 'set-screen-option', 'setScreenOptions', 10, 3 );
68 +
65 69 // revision support.
66 70 $this->_addFilter( 'wp_revisions_to_keep', 'limitRevisions', null, 10, 2 );
67 71 $this->_addAction( '_wp_put_post_revision', 'addRevision', null, 10, 1 );
68 72 $this->_addAction( 'wp_restore_post_revision', 'restoreRevision', null, 10, 2 );
69 73
74 + $this->_addAction( 'visualizer_chart_schedules_spl', 'addSplChartSchedules', null, 10, 3 );
75 +
70 76 $this->_addAction( 'admin_init', 'init' );
77 +
78 + $this->_addAction( 'visualizer_chart_languages', 'addMultilingualSupport' );
79 +
80 + $this->_addFilter( 'admin_footer_text', 'render_review_notice' );
81 +
82 + if ( ! defined( 'TI_CYPRESS_TESTING' ) ) {
83 + $this->_addFilter( 'themeisle-sdk/survey/' . VISUALIZER_DIRNAME, 'get_survey_metadata', 10, 2 );
84 + }
85 +
86 + if ( defined( 'TI_CYPRESS_TESTING' ) ) {
87 + $this->load_cypress_hooks();
88 + }
89 +
71 90 }
91 + /**
92 + * Display review notice.
93 + */
94 + public function render_review_notice( $footer_text ) {
95 + $current_screen = get_current_screen();
72 96
97 + $visualizer_page_ids = ['toplevel_page_visualizer', 'visualizer_page_viz-support', 'visualizer_page_ti-about-visualizer' ];
98 +
99 + if ( ! empty( $current_screen ) && isset( $current_screen->id ) ) {
100 + foreach ( $visualizer_page_ids as $page_to_check ) {
101 + if ( strpos( $current_screen->id, $page_to_check ) !== false ) {
102 + $footer_text = sprintf(
103 + __( 'Enjoying %1$s? %2$s %3$s rating. Thank you for being so supportive!', 'visualizer' ),
104 + '<b>Visualizer</b>',
105 + esc_html__( 'You can help us by leaving a', 'visualizer' ),
106 + '<a href="https://wordpress.org/support/plugin/visualizer/reviews/" target="_blank">&#9733;&#9733;&#9733;&#9733;&#9733;</a>'
107 + );
108 + break;
109 + }
110 + }
111 + }
112 +
113 + return $footer_text;
114 + }
115 +
116 +
73 117 /**
118 + * Define the hooks that are needed for cypress.
119 + *
120 + * @since 3.4.0
121 + * @access private
122 + */
123 + private function load_cypress_hooks() {
124 + // all charts should load on the same page without pagination.
125 + add_filter(
126 + 'visualizer_query_args', function( $args ) {
127 + $args['posts_per_page'] = 20;
128 + return $args;
129 + }, 10, 1
130 + );
131 + }
132 +
133 + /**
134 + * Add disabled `optgroup` schedules to the drop downs.
135 + *
136 + * @since ?
137 + *
138 + * @access public
139 + *
140 + * @param string $feature The feature for which to add schedules.
141 + * @param int $chart_id The chart ID.
142 + * @param int $plan The plan number.
143 + */
144 + public function addSplChartSchedules( $feature, $chart_id, $plan ) {
145 + if ( apply_filters( 'visualizer_is_business', false ) ) {
146 + return;
147 + }
148 +
149 + $is_new_personal = apply_filters( 'visualizer_is_new_personal', false );
150 +
151 + $hours = array(
152 + '0.16' => __( '10 minutes', 'visualizer' ),
153 + '1' => __( 'Each hour', 'visualizer' ),
154 + '12' => __( 'Each 12 hours', 'visualizer' ),
155 + '24' => __( 'Each day', 'visualizer' ),
156 + '72' => __( 'Each 3 days', 'visualizer' ),
157 + );
158 +
159 + switch ( $feature ) {
160 + case 'json':
161 + case 'csv':
162 + // no more schedules if pro is already active.
163 + if ( Visualizer_Module::is_pro() && ! $is_new_personal ) {
164 + return;
165 + }
166 + break;
167 + case 'wp':
168 + // fall-through.
169 + case 'db':
170 + break;
171 + default:
172 + return;
173 + }
174 +
175 + echo '<optgroup disabled label="' . __( 'Upgrade required', 'visualizer' ) . '">';
176 + foreach ( $hours as $hour => $desc ) {
177 + echo '<option disabled>' . $desc . '</option>';
178 + }
179 + echo '</optgroup>';
180 + }
181 +
182 + /**
74 183 * No limits on revisions.
75 184 */
76 185 public function limitRevisions( $num, $post ) {
77 186 if ( Visualizer_Plugin::CPT_VISUALIZER === $post->post_type ) {
@@ -132,16 +241,31 @@
132 241 *
133 242 * @access public
134 243 */
135 244 public function init() {
245 + // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
136 246 if ( current_user_can( 'edit_posts' ) && current_user_can( 'edit_pages' ) && 'true' == get_user_option( 'rich_editing' ) ) {
137 247 $this->_addFilter( 'mce_external_languages', 'add_tinymce_lang', 10, 1 );
138 248 $this->_addFilter( 'mce_external_plugins', 'tinymce_plugin', 10, 1 );
139 249 $this->_addFilter( 'mce_buttons', 'register_mce_button', 10, 1 );
250 + $this->_addFilter( 'tiny_mce_before_init', 'get_strings_for_block', 10, 1 );
140 251 }
141 252 }
142 253
143 254 /**
255 + * Add the strings required for the TinyMCE buttons for the classic block (not the classic editor).
256 + *
257 + * @since ?
258 + * @access friendly
259 + */
260 + function get_strings_for_block( $settings ) {
261 + $class = new Visualizer_Module_Language();
262 + $strings = $class->get_strings();
263 + $array = array( 'visualizer_tinymce_plugin' => json_encode( $strings ) );
264 + return array_merge( $settings, $array );
265 + }
266 +
267 + /**
144 268 * Load plugin translation for - TinyMCE API
145 269 *
146 270 * @access public
147 271 * @param array $arr The tinymce_lang array.
@@ -210,14 +334,18 @@
210 334 * @access public
211 335 */
212 336 public function enqueueMediaScripts() {
213 337 global $typenow;
214 - if ( post_type_supports( $typenow, 'editor' ) ) {
338 + global $current_screen;
339 +
340 + if ( post_type_supports( $typenow, 'editor' ) || $current_screen->id === 'widgets' || $current_screen->id === 'customize' ) {
215 341 wp_enqueue_style( 'visualizer-media', VISUALIZER_ABSURL . 'css/media.css', array( 'media-views' ), Visualizer_Plugin::VERSION );
216 342
217 343 // Load all the assets for the different libraries we support.
218 - $deps = Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) );
219 - $deps += Visualizer_Render_Sidebar_Type_DataTable::enqueue_assets( array( 'media-editor' ) );
344 + $deps = array(
345 + Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) ),
346 + Visualizer_Render_Sidebar_Type_DataTable_Tabular::enqueue_assets( array( 'media-editor' ) ),
347 + );
220 348
221 349 wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', $deps, Visualizer_Plugin::VERSION, true );
222 350 wp_enqueue_script( 'visualizer-media-collection', VISUALIZER_ABSURL . 'js/media/collection.js', array( 'visualizer-media-model' ), Visualizer_Plugin::VERSION, true );
223 351 wp_enqueue_script( 'visualizer-media-controller', VISUALIZER_ABSURL . 'js/media/controller.js', array( 'visualizer-media-collection' ), Visualizer_Plugin::VERSION, true );
@@ -265,9 +393,9 @@
265 393 'filters' => $chart_types,
266 394 'types' => array_keys( $chart_types ),
267 395 ),
268 396 'nonce' => wp_create_nonce(),
269 - 'buildurl' => add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ),
397 + 'buildurl' => esc_url( add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ) ),
270 398 );
271 399
272 400 return $strings;
273 401 }
@@ -289,64 +417,102 @@
289 417 'enabled' => true,
290 418 );
291 419 }
292 420
421 + $enabled = self::proFeaturesLocked();
422 +
293 423 $types = array_merge(
294 424 $additional,
295 425 array(
296 - 'dataTable' => array(
297 - 'name' => esc_html__( 'Table (New)', 'visualizer' ),
426 + 'tabular' => array(
427 + 'name' => esc_html__( 'Table', 'visualizer' ),
298 428 'enabled' => true,
429 + 'supports' => $enabled ? array( 'Google Charts', 'DataTable' ) : array( 'DataTable' ),
299 430 ),
300 431 'pie' => array(
301 - 'name' => esc_html__( 'Pie', 'visualizer' ),
432 + 'name' => esc_html__( 'Pie/Donut', 'visualizer' ),
302 433 'enabled' => true,
434 + 'supports' => array( 'Google Charts', 'ChartJS' ),
303 435 ),
304 436 'line' => array(
305 437 'name' => esc_html__( 'Line', 'visualizer' ),
306 438 'enabled' => true,
439 + 'supports' => array( 'Google Charts', 'ChartJS' ),
307 440 ),
441 + 'bar' => array(
442 + 'name' => esc_html__( 'Bar', 'visualizer' ),
443 + 'enabled' => true,
444 + 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
445 + ),
308 446 'area' => array(
309 447 'name' => esc_html__( 'Area', 'visualizer' ),
310 - 'enabled' => true,
448 + 'enabled' => $enabled,
449 + // in ChartJS, the fill option is used to make Line chart an area: https://www.chartjs.org/docs/latest/charts/area.html
450 + 'supports' => array( 'Google Charts' ),
451 + 'demo_url' => 'https://demo.themeisle.com/visualizer/area-chart/',
311 452 ),
312 453 'geo' => array(
313 454 'name' => esc_html__( 'Geo', 'visualizer' ),
314 - 'enabled' => true,
455 + 'enabled' => $enabled,
456 + 'supports' => array( 'Google Charts' ),
457 + 'demo_url' => 'https://demo.themeisle.com/visualizer/geo-chart/',
315 458 ),
316 - 'bar' => array(
317 - 'name' => esc_html__( 'Bar', 'visualizer' ),
318 - 'enabled' => true,
319 - ),
320 459 'column' => array(
321 460 'name' => esc_html__( 'Column', 'visualizer' ),
322 - 'enabled' => true,
461 + 'enabled' => $enabled,
462 + 'supports' => array( 'Google Charts', 'ChartJS' ),
463 + 'demo_url' => 'https://demo.themeisle.com/visualizer/column-chart/',
323 464 ),
324 - 'gauge' => array(
325 - 'name' => esc_html__( 'Gauge', 'visualizer' ),
326 - 'enabled' => true,
465 + 'bubble' => array(
466 + 'name' => esc_html__( 'Bubble', 'visualizer' ),
467 + 'enabled' => $enabled,
468 + // chartjs' bubble is ugly looking (and it won't work off the default bubble.csv) so it is being excluded for the time being.
469 + 'supports' => array( 'Google Charts' ),
470 + 'demo_url' => 'https://demo.themeisle.com/visualizer/bubble-chart/',
327 471 ),
328 472 'scatter' => array(
329 473 'name' => esc_html__( 'Scatter', 'visualizer' ),
330 - 'enabled' => true,
474 + 'enabled' => $enabled,
475 + 'supports' => array( 'Google Charts' ),
476 + 'demo_url' => 'https://demo.themeisle.com/visualizer/scatter-chart/',
331 477 ),
478 + 'gauge' => array(
479 + 'name' => esc_html__( 'Gauge', 'visualizer' ),
480 + 'enabled' => $enabled,
481 + 'supports' => array( 'Google Charts' ),
482 + 'demo_url' => 'https://demo.themeisle.com/visualizer/gauge-chart/',
483 + ),
332 484 'candlestick' => array(
333 485 'name' => esc_html__( 'Candlestick', 'visualizer' ),
334 - 'enabled' => true,
486 + 'enabled' => $enabled,
487 + 'supports' => array( 'Google Charts' ),
488 + 'demo_url' => 'https://demo.themeisle.com/visualizer/candlestick-chart/',
335 489 ),
336 490 // pro types
337 - 'table' => array(
338 - 'name' => esc_html__( 'Table (Deprecated)', 'visualizer' ),
339 - 'enabled' => false,
340 - ),
341 491 'timeline' => array(
342 492 'name' => esc_html__( 'Timeline', 'visualizer' ),
343 493 'enabled' => false,
494 + 'supports' => array( 'Google Charts', 'ChartJS' ),
495 + 'demo_url' => 'https://demo.themeisle.com/visualizer/timeline-chart/',
344 496 ),
345 497 'combo' => array(
346 498 'name' => esc_html__( 'Combo', 'visualizer' ),
347 499 'enabled' => false,
500 + 'supports' => array( 'Google Charts' ),
501 + 'demo_url' => 'https://demo.themeisle.com/visualizer/combo-chart/',
348 502 ),
503 + 'polarArea' => array(
504 + 'name' => esc_html__( 'Polar Area', 'visualizer' ),
505 + 'enabled' => false,
506 + 'supports' => array( 'ChartJS' ),
507 + 'demo_url' => 'https://demo.themeisle.com/visualizer/polar-area-chart/',
508 + ),
509 + 'radar' => array(
510 + 'name' => esc_html__( 'Radar/Spider', 'visualizer' ),
511 + 'enabled' => false,
512 + 'supports' => array( 'ChartJS' ),
513 + 'demo_url' => 'https://demo.themeisle.com/visualizer/radar-spider-chart/',
514 + ),
349 515 )
350 516 );
351 517 $types = apply_filters( 'visualizer_pro_chart_types', $types );
352 518 if ( $enabledOnly ) {
@@ -355,8 +521,12 @@
355 521 if ( ! is_array( $array ) ) {
356 522 // support for old pro
357 523 $array = array( 'enabled' => true, 'name' => $array );
358 524 }
525 + // backward compatibility for PRO before v1.9.0
526 + if ( ! array_key_exists( 'supports', $array ) ) {
527 + $array['supports'] = array( 'Google Charts' );
528 + }
359 529 if ( ! $array['enabled'] ) {
360 530 continue;
361 531 }
362 532 $filtered[ $type ] = $array;
@@ -369,8 +539,12 @@
369 539 if ( ! is_array( $array ) ) {
370 540 // support for old pro
371 541 $array = array( 'enabled' => true, 'name' => $array );
372 542 }
543 + // backward compatibility for PRO before v1.9.0
544 + if ( ! array_key_exists( 'supports', $array ) ) {
545 + $array['supports'] = array( 'Google Charts' );
546 + }
373 547 $doubleD[ $type ] = $array['name'];
374 548 }
375 549 $types = $doubleD;
376 550 }
@@ -384,49 +558,45 @@
384 558 private static function handleDeprecatedCharts( $types, $enabledOnly, $get2Darray, $where ) {
385 559 $deprecated = array();
386 560
387 561 switch ( $where ) {
562 + case 'types':
563 + // fall-through
388 564 case 'library':
389 - // if the user has a Google Table chart, show it as deprecated otherwise remove the option from the library.
390 - if ( ! self::hasChartType( 'table' ) ) {
391 - $deprecated[] = 'table';
392 - if ( $get2Darray ) {
393 - $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
394 - } else {
395 - $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
396 - }
397 - }
398 -
399 565 // if a user has a Gauge/Candlestick chart, then let them keep using it.
400 - if ( ! VISUALIZER_PRO ) {
566 + if ( ! Visualizer_Module::is_pro() ) {
401 567 if ( ! self::hasChartType( 'gauge' ) ) {
402 - $deprecated[] = 'gauge';
568 + if ( $get2Darray ) {
569 + $deprecated[] = 'gauge';
570 + } else {
571 + $types['gauge']['enabled'] = false;
572 + }
403 573 }
404 574 if ( ! self::hasChartType( 'candlestick' ) ) {
405 - $deprecated[] = 'candlestick';
575 + if ( $get2Darray ) {
576 + $deprecated[] = 'candlestick';
577 + } else {
578 + $types['candlestick']['enabled'] = false;
579 + }
406 580 }
407 581 }
408 582 break;
409 583 default:
410 - // remove the option to create a Google Table chart.
411 - $deprecated[] = 'table';
412 -
413 - // rename the new table chart type.
414 - if ( self::hasChartType( 'table' ) ) {
415 - if ( $get2Darray ) {
416 - $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
417 - } else {
418 - $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
419 - }
420 - }
421 -
422 584 // if a user has a Gauge/Candlestick chart, then let them keep using it.
423 - if ( ! VISUALIZER_PRO ) {
585 + if ( ! Visualizer_Module::is_pro() ) {
424 586 if ( ! self::hasChartType( 'gauge' ) ) {
425 - $deprecated[] = 'gauge';
587 + if ( $get2Darray ) {
588 + $deprecated[] = 'gauge';
589 + } else {
590 + $types['gauge']['enabled'] = false;
591 + }
426 592 }
427 593 if ( ! self::hasChartType( 'candlestick' ) ) {
428 - $deprecated[] = 'candlestick';
594 + if ( $get2Darray ) {
595 + $deprecated[] = 'candlestick';
596 + } else {
597 + $types['candlestick']['enabled'] = false;
598 + }
429 599 }
430 600 }
431 601 }
432 602
@@ -448,9 +618,9 @@
448 618 * @access public
449 619 */
450 620 public function renderTemplates() {
451 621 global $pagenow;
452 - if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
622 + if ( 'post.php' !== $pagenow && 'post-new.php' !== $pagenow ) {
453 623 return;
454 624 }
455 625 $render = new Visualizer_Render_Templates();
456 626 $render->render();
@@ -468,9 +638,9 @@
468 638 *
469 639 * @param string $suffix The current page suffix.
470 640 */
471 641 public function enqueueLibraryScripts( $suffix ) {
472 - if ( $suffix == $this->_libraryPage ) {
642 + if ( $suffix === $this->_libraryPage ) {
473 643 wp_enqueue_style( 'visualizer-library', VISUALIZER_ABSURL . 'css/library.css', array(), Visualizer_Plugin::VERSION );
474 644 $this->_addFilter( 'media_upload_tabs', 'setupVisualizerTab' );
475 645 wp_enqueue_media();
476 646 wp_enqueue_script(
@@ -478,8 +648,9 @@
478 648 VISUALIZER_ABSURL . 'js/library.js',
479 649 array(
480 650 'jquery',
481 651 'media-views',
652 + 'clipboard',
482 653 ),
483 654 Visualizer_Plugin::VERSION,
484 655 true
485 656 );
@@ -528,14 +699,177 @@
528 699 *
529 700 * @access public
530 701 */
531 702 public function registerAdminMenu() {
532 - $title = esc_html__( 'Visualizer Library', 'visualizer' );
533 - $callback = array( $this, 'renderLibraryPage' );
534 - $this->_libraryPage = add_submenu_page( 'upload.php', $title, $title, 'edit_posts', Visualizer_Plugin::NAME, $callback );
703 + $svg_base64_icon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNzdweCIgaGVpZ2h0PSI3N3B4IiB2aWV3Qm94PSIwIDAgNzcgNzciIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjYgKDY3NDkxKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5Db21iaW5lZCBTaGFwZTwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQcm9kdWN0LVBhZ2UiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJXb3JkUHJlc3MtcGx1Z2lucyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE5MC4wMDAwMDAsIC00MzUuMDAwMDAwKSIgZmlsbD0iIzM5QzNEMiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMjguNSw1MTIgQzIwNy4yMzcwMzcsNTEyIDE5MCw0OTQuNzYyOTYzIDE5MCw0NzMuNSBDMTkwLDQ1Mi4yMzcwMzcgMjA3LjIzNzAzNyw0MzUgMjI4LjUsNDM1IEMyNDkuNzYyOTYzLDQzNSAyNjcsNDUyLjIzNzAzNyAyNjcsNDczLjUgQzI2Nyw0OTQuNzYyOTYzIDI0OS43NjI5NjMsNTEyIDIyOC41LDUxMiBaIE0yNDYuODQzNzUsNDgzLjU5MjA1OSBMMjE1LjYyNSw0ODMuNTkyMDU5IEwyMTUuNjI1LDQ2MC44MjY1NDQgQzIxNS42MjUsNDYwLjE2NDU0NyAyMTUuMTA3NTc4LDQ1OS42MjgzNTkgMjE0LjQ2ODc1LDQ1OS42MjgzNTkgTDIxMi4xNTYyNSw0NTkuNjI4MzU5IEMyMTEuNTE3NDIyLDQ1OS42MjgzNTkgMjExLDQ2MC4xNjQ1NDcgMjExLDQ2MC44MjY1NDQgTDIxMSw0ODUuOTg4NDI5IEMyMTEsNDg3LjMxMTY3NCAyMTIuMDM1NTY2LDQ4OC4zODQ3OTggMjEzLjMxMjUsNDg4LjM4NDc5OCBMMjQ2Ljg0Mzc1LDQ4OC4zODQ3OTggQzI0Ny40ODI1NzgsNDg4LjM4NDc5OCAyNDgsNDg3Ljg0ODYxMSAyNDgsNDg3LjE4NjYxMyBMMjQ4LDQ4NC43OTAyNDQgQzI0OCw0ODQuMTI4MjQ2IDI0Ny40ODI1NzgsNDgzLjU5MjA1OSAyNDYuODQzNzUsNDgzLjU5MjA1OSBaIE0yNDQuNTMxMjUsNDYyLjAyNDcyOSBMMjM1Ljk5OTU3LDQ2Mi4wMjQ3MjkgQzIzNC40NTQ1MzEsNDYyLjAyNDcyOSAyMzMuNjgwNTY2LDQ2My45NjA1NDcgMjM0Ljc3MzIyMyw0NjUuMDkyODMyIEwyMzcuMTE0NjI5LDQ2Ny41MTkxNTYgTDIzMS44MTI1LDQ3My4wMTQzMzIgTDIyNi41MTAzNzEsNDY3LjUxOTkwNSBDMjI1LjYwNzA1MSw0NjYuNTgzODIzIDIyNC4xNDI5NDksNDY2LjU4MzgyMyAyMjMuMjQwMzUyLDQ2Ny41MTk5MDUgTDIxOC4yNzY0MjYsNDcyLjY2Mzg2MyBDMjE3LjgyNDc2Niw0NzMuMTMxOTA0IDIxNy44MjQ3NjYsNDczLjg5MDUwNSAyMTguMjc2NDI2LDQ3NC4zNTg1NDYgTDIxOS45MTEwNzQsNDc2LjA1MjQ4IEMyMjAuMzYyNzM0LDQ3Ni41MjA1MjEgMjIxLjA5NDc4NSw0NzYuNTIwNTIxIDIyMS41NDY0NDUsNDc2LjA1MjQ4IEwyMjQuODc1LDQ3Mi42MDI0NTYgTDIzMC4xNzcxMjksNDc4LjA5Njg4MyBDMjMxLjA4MDQ0OSw0NzkuMDMyOTY1IDIzMi41NDQ1NTEsNDc5LjAzMjk2NSAyMzMuNDQ3MTQ4LDQ3OC4wOTY4ODMgTDI0MC4zODQ2NDgsNDcwLjkwNzc3MyBMMjQyLjcyNjA1NSw0NzMuMzM0MDk4IEMyNDMuODE4NzExLDQ3NC40NjYzODIgMjQ1LjY4Njc3Nyw0NzMuNjY0MzQ3IDI0NS42ODY3NzcsNDcyLjA2MzI3MyBMMjQ1LjY4Njc3Nyw0NjMuMjIyOTE0IEMyNDUuNjg3NSw0NjIuNTYwOTE3IDI0NS4xNzAwNzgsNDYyLjAyNDcyOSAyNDQuNTMxMjUsNDYyLjAyNDcyOSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==';
704 +
705 + $this->_libraryPage = add_menu_page( __( 'Visualizer', 'visualizer' ), __( 'Visualizer', 'visualizer' ), 'edit_posts', Visualizer_Plugin::NAME, array( $this, 'renderLibraryPage' ), $svg_base64_icon, 99.7666 );
706 +
707 + add_submenu_page(
708 + Visualizer_Plugin::NAME,
709 + __( 'Chart Library', 'visualizer' ),
710 + __( 'Chart Library', 'visualizer' ),
711 + 'edit_posts',
712 + 'admin.php?page=' . Visualizer_Plugin::NAME
713 + );
714 + add_submenu_page(
715 + Visualizer_Plugin::NAME,
716 + __( 'Add New Chart', 'visualizer' ),
717 + __( 'Add New Chart', 'visualizer' ),
718 + 'edit_posts',
719 + 'admin.php?page=' . Visualizer_Plugin::NAME . '&vaction=addnew'
720 + );
721 + add_submenu_page(
722 + Visualizer_Plugin::NAME,
723 + __( 'Support', 'visualizer' ),
724 + __( '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>',
725 + 'edit_posts',
726 + 'viz-support',
727 + array( $this, 'renderSupportPage' )
728 + );
729 +
730 + remove_submenu_page( Visualizer_Plugin::NAME, Visualizer_Plugin::NAME );
731 +
732 + add_action( "load-{$this->_libraryPage}", array( $this, 'addScreenOptions' ) );
733 + add_action( 'admin_footer', array( $this, 'handleGetProSubMenu' ) );
535 734 }
536 735
537 736 /**
737 + * Handle get pro plugin submenu.
738 + */
739 + public function handleGetProSubMenu() {
740 + if ( ! Visualizer_Module::is_pro() ) {
741 + ?>
742 + <style type="text/css">
743 + #toplevel_page_visualizer ul.wp-submenu li:last-child {
744 + background: #FF7E65;
745 + font-size: 14px;
746 + font-weight: 600;
747 + color: #fff;
748 + }
749 + #toplevel_page_visualizer ul.wp-submenu li:last-child > a > span {
750 + color: #fff !important;
751 + }
752 + #toplevel_page_visualizer ul.wp-submenu li:last-child > a:hover {
753 + box-shadow: inherit;
754 + }
755 + </style>
756 + <?php
757 + if ( get_option( 'visualizer_fresh_install', false ) ) {
758 + ?>
759 + <style type="text/css">
760 + #toplevel_page_visualizer ul.wp-submenu li.wp-first-item + li + li + li {
761 + display: none;
762 + }
763 + </style>
764 + <?php
765 + }
766 + }
767 + }
768 +
769 + /**
770 + * Adds the screen options for pagination.
771 + */
772 + function addScreenOptions() {
773 + $screen = get_current_screen();
774 +
775 + // bail if it's some other page.
776 + if ( ! is_object( $screen ) || $screen->id !== $this->_libraryPage ) {
777 + return;
778 + }
779 +
780 + $args = array(
781 + 'label' => __( 'Number of charts per page:', 'visualizer' ),
782 + 'default' => 6,
783 + 'option' => 'visualizer_library_per_page',
784 + );
785 + add_screen_option( 'per_page', $args );
786 + }
787 +
788 + /**
789 + * Returns the screen option for pagination.
790 + */
791 + function setScreenOptions( $status, $option, $value ) {
792 + if ( 'visualizer_library_per_page' === $option ) {
793 + return $value;
794 + }
795 + }
796 +
797 + /**
798 + * Adds the display filters to be used in the meta_query while displaying the charts.
799 + */
800 + private function getDisplayFilters( &$query_args ) {
801 + $query = array();
802 + global $sitepress;
803 + if ( Visualizer_Module::is_pro() && ( function_exists( 'icl_get_languages' ) && $sitepress instanceof \SitePress ) ) {
804 + $current_lang = icl_get_current_language();
805 + if ( in_array( $current_lang, array( 'all', icl_get_default_language() ), true ) ) {
806 + $query[] = array(
807 + 'key' => 'chart_lang',
808 + 'compare' => 'NOT EXISTS',
809 + );
810 + } else {
811 + $query[] = array(
812 + 'key' => 'chart_lang',
813 + 'value' => $current_lang,
814 + 'compare' => '=',
815 + );
816 + }
817 + }
818 +
819 + // add chart type filter to the query arguments
820 + $type = filter_input( INPUT_GET, 'type' );
821 + if ( $type && in_array( $type, Visualizer_Plugin::getChartTypes(), true ) ) {
822 + $query[] = array(
823 + 'key' => Visualizer_Plugin::CF_CHART_TYPE,
824 + 'value' => $type,
825 + 'compare' => '=',
826 + );
827 + }
828 +
829 + // add chart library filter to the query arguments
830 + $library = filter_input( INPUT_GET, 'library' );
831 + if ( $library ) {
832 + $query[] = array(
833 + 'key' => Visualizer_Plugin::CF_CHART_LIBRARY,
834 + 'value' => $library,
835 + 'compare' => '=',
836 + );
837 + }
838 +
839 + // add date filter to the query arguments
840 + $date = filter_input( INPUT_GET, 'date' );
841 + $possible = array_keys( Visualizer_Plugin::getSupportedDateFilter() );
842 + if ( $date && in_array( $date, $possible, true ) ) {
843 + $query_args['date_query'] = array(
844 + 'after' => "$date -1 day",
845 + 'inclusive' => true,
846 + );
847 + }
848 +
849 + // add source filter to the query arguments
850 + $source = filter_input( INPUT_GET, 'source' );
851 + if ( $source ) {
852 + $source = ucwords( $source );
853 + $source = "Visualizer_Source_{$source}";
854 + $query[] = array(
855 + 'key' => Visualizer_Plugin::CF_SOURCE,
856 + 'value' => $source,
857 + 'compare' => '=',
858 + );
859 + }
860 +
861 + $query_args['meta_query'] = $query;
862 +
863 + $orderby = filter_input( INPUT_GET, 'orderby' );
864 + $order = filter_input( INPUT_GET, 'order' );
865 + if ( $orderby ) {
866 + $query_args['order_by'] = $orderby;
867 + }
868 + $query_args['order'] = empty( $order ) ? 'desc' : $order;
869 + }
870 +
871 + /**
538 872 * Get the instance of WP_Query that fetches the charts as per the given criteria.
539 873 */
540 874 private function getQuery() {
541 875 static $q;
@@ -554,29 +888,34 @@
554 888 'default' => 1,
555 889 ),
556 890 )
557 891 );
892 +
893 + $per_page = 6;
894 + $screen = get_current_screen();
895 + if ( $screen ) {
896 + // retrieve the per_page option
897 + $screen_option = $screen->get_option( 'per_page', 'option' );
898 + // retrieve the value stored for the current user
899 + $user = get_current_user_id();
900 + $per_page = get_user_meta( $user, $screen_option, true );
901 + if ( empty( $per_page ) || $per_page < 1 ) {
902 + // nothing set, get the default value
903 + $per_page = $screen->get_option( 'per_page', 'default' );
904 + }
905 + }
906 +
558 907 // the initial query arguments to fetch charts
559 908 $query_args = array(
560 909 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
561 - 'posts_per_page' => 6,
910 + 'posts_per_page' => $per_page,
562 911 'paged' => $page,
563 912 );
564 - // add chart type filter to the query arguments
565 - $filter = filter_input( INPUT_GET, 'type' );
566 - if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
567 - $query_args['meta_query'] = array(
568 - array(
569 - 'key' => Visualizer_Plugin::CF_CHART_TYPE,
570 - 'value' => $filter,
571 - 'compare' => '=',
572 - ),
573 - );
574 - } else {
575 - $filter = 'all';
576 - }
913 +
914 + $this->getDisplayFilters( $query_args );
915 +
577 916 // Added by Ash/Upwork
578 - $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
917 + $filterByMeta = ! empty( $_GET['s'] ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : null; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
579 918 if ( $filterByMeta ) {
580 919 $query = array(
581 920 'key' => Visualizer_Plugin::CF_SETTINGS,
582 921 'value' => $filterByMeta,
@@ -585,13 +924,26 @@
585 924 $meta = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : array();
586 925 $meta[] = $query;
587 926 $query_args['meta_query'] = $meta;
588 927 }
589 - $q = new WP_Query( $query_args );
928 + $q = new WP_Query( apply_filters( 'visualizer_query_args', $query_args ) );
590 929 return $q;
591 930 }
592 931
593 932 /**
933 + * Renders support page.
934 + *
935 + * @since 3.3.0
936 + *
937 + * @access public
938 + */
939 + public function renderSupportPage() {
940 + wp_enqueue_style( 'visualizer-upsell', VISUALIZER_ABSURL . 'css/upsell.css', array(), Visualizer_Plugin::VERSION );
941 + do_action( 'themeisle_internal_page', VISUALIZER_DIRNAME, 'support' );
942 + include_once VISUALIZER_ABSPATH . '/templates/support.php';
943 + }
944 +
945 + /**
594 946 * Renders visualizer library page.
595 947 *
596 948 * @since 1.0.0
597 949 *
@@ -614,9 +966,9 @@
614 966 )
615 967 );
616 968 // add chart type filter to the query arguments
617 969 $filter = filter_input( INPUT_GET, 'type' );
618 - if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) ) {
970 + if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes(), true ) ) ) {
619 971 $filter = 'all';
620 972 }
621 973
622 974 $css = '';
@@ -637,12 +989,27 @@
637 989 if ( ! empty( $atts['settings'] ) ) {
638 990 $settings = apply_filters( $atts['settings'], $settings, $chart->ID, $type );
639 991 }
640 992
641 - unset( $settings['height'], $settings['width'] );
993 + if ( $settings ) {
994 + unset( $settings['height'], $settings['width'], $settings['chartArea'] );
995 + }
996 +
642 997 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
643 - $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( $chart->post_content ) ), $chart->ID, $type );
998 + $data = self::get_chart_data( $chart, $type );
644 999
1000 + // Set default setting series when add manual chart data - Only during first creation.
1001 + if ( isset( $settings['series'] ) && ! empty( $series ) ) {
1002 + $count_series = count( $series ) - count( $settings['series'] );
1003 + if ( $count_series > 1 ) {
1004 + $clone_last_series = end( $settings['series'] );
1005 + $clone_last_series = array_fill_keys( array_keys( $clone_last_series ), '' );
1006 + foreach ( range( 1, $count_series ) as $item ) {
1007 + $settings['series'][] = $clone_last_series;
1008 + }
1009 + }
1010 + }
1011 +
645 1012 $library = $this->load_chart_type( $chart->ID );
646 1013
647 1014 $id = 'visualizer-' . $chart->ID;
648 1015 $arguments = $this->get_inline_custom_css( $id, $settings );
@@ -650,8 +1017,15 @@
650 1017 $css .= $arguments[0];
651 1018 $settings = $arguments[1];
652 1019 }
653 1020
1021 + if ( isset( $settings['controls']['ui']['labelStacking'] ) ) {
1022 + unset( $settings['controls']['ui']['labelStacking'] );
1023 + }
1024 + if ( isset( $settings['controls']['ui']['orientation'] ) ) {
1025 + unset( $settings['controls']['ui']['orientation'] );
1026 + }
1027 +
654 1028 // add chart to the array
655 1029 $charts[ $id ] = array(
656 1030 'id' => $chart->ID,
657 1031 'type' => $type,
@@ -662,8 +1036,9 @@
662 1036 );
663 1037 }
664 1038 // enqueue charts array
665 1039 $ajaxurl = admin_url( 'admin-ajax.php' );
1040 +
666 1041 wp_localize_script(
667 1042 'visualizer-library',
668 1043 'visualizer',
669 1044 array(
@@ -670,26 +1045,39 @@
670 1045 'language' => $this->get_language(),
671 1046 'map_api_key' => get_option( 'visualizer-map-api-key' ),
672 1047 'charts' => $charts,
673 1048 'urls' => array(
674 - 'base' => add_query_arg( 'vpage', false ),
675 - 'create' => add_query_arg(
676 - array(
677 - 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
678 - 'library' => 'yes',
679 - 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
680 - ),
681 - $ajaxurl
1049 + 'base' => esc_url( add_query_arg( array( 'vpage' => false, 'vaction' => false ) ) ),
1050 + 'create' => esc_url(
1051 + add_query_arg(
1052 + array(
1053 + 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
1054 + 'library' => 'yes',
1055 + 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
1056 + 'chart-library' => isset( $_GET['chart-library'] ) ? $_GET['chart-library'] : '',
1057 + 'vaction' => false,
1058 + ),
1059 + $ajaxurl
1060 + )
682 1061 ),
683 - 'edit' => add_query_arg(
684 - array(
685 - 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
686 - 'library' => 'yes',
687 - ),
688 - $ajaxurl
1062 + 'edit' => esc_url(
1063 + add_query_arg(
1064 + array(
1065 + 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
1066 + 'library' => 'yes',
1067 + 'vaction' => false,
1068 + ),
1069 + $ajaxurl
1070 + )
689 1071 ),
690 1072 ),
691 1073 'page_type' => 'library',
1074 + 'is_front' => false,
1075 + 'i10n' => array(
1076 + 'copied' => __( 'The shortcode has been copied to your clipboard. Hit Ctrl-V/Cmd-V to paste it.', 'visualizer' ),
1077 + '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' ),
1078 + ),
1079 + 'is_pro_user' => Visualizer_Module::is_pro(),
692 1080 )
693 1081 );
694 1082 // render library page
695 1083 $render = new Visualizer_Render_Library();
@@ -698,9 +1086,9 @@
698 1086 $render->types = self::_getChartTypesLocalized( false, false, false, true );
699 1087 $render->custom_css = $css;
700 1088 $render->pagination = paginate_links(
701 1089 array(
702 - 'base' => add_query_arg( 'vpage', '%#%' ),
1090 + 'base' => add_query_arg( array( 'vpage' => '%#%', 'vaction' => false ) ),
703 1091 'format' => '',
704 1092 'current' => $page,
705 1093 'total' => $query->max_num_pages,
706 1094 'type' => 'array',
@@ -705,8 +1093,15 @@
705 1093 'total' => $query->max_num_pages,
706 1094 'type' => 'array',
707 1095 )
708 1096 );
1097 +
1098 + do_action( 'themeisle_internal_page', VISUALIZER_DIRNAME, 'library' );
1099 +
1100 + if ( ! apply_filters( 'visualizer_is_business', false ) ) {
1101 + do_action( 'themeisle_sdk_load_banner', 'visualizer' );
1102 + }
1103 +
709 1104 $render->render();
710 1105 }
711 1106
712 1107 /**
@@ -721,14 +1116,14 @@
721 1116 *
722 1117 * @return array Updated array of action links.
723 1118 */
724 1119 public function getPluginActionLinks( $links, $file ) {
725 - if ( $file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1120 + if ( $file === plugin_basename( VISUALIZER_BASEFILE ) ) {
726 1121 array_unshift(
727 1122 $links,
728 1123 sprintf(
729 1124 '<a href="%s">%s</a>',
730 - admin_url( 'upload.php?page=' . Visualizer_Plugin::NAME ),
1125 + admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME ),
731 1126 esc_html__( 'Library', 'visualizer' )
732 1127 )
733 1128 );
734 1129 }
@@ -748,18 +1143,18 @@
748 1143 *
749 1144 * @return array Updated array of plugin meta links.
750 1145 */
751 1146 public function getPluginMetaLinks( $plugin_meta, $plugin_file ) {
752 - if ( $plugin_file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1147 + if ( $plugin_file === plugin_basename( VISUALIZER_BASEFILE ) ) {
753 1148 // knowledge base link
754 1149 $plugin_meta[] = sprintf(
755 - '<a href="https://github.com/codeinwp/visualizer/wiki" target="_blank">%s</a>',
756 - esc_html__( 'Knowledge Base', 'visualizer' )
1150 + '<a href="' . VISUALIZER_MAIN_DOC . '" target="_blank">%s</a>',
1151 + esc_html__( 'Docs', 'visualizer' )
757 1152 );
758 1153 // flattr link
759 1154 $plugin_meta[] = sprintf(
760 - '<a style="color:red" href="https://themeisle.com/plugins/visualizer-charts-and-graphs-pro-addon/" target="_blank">%s</a>',
761 - esc_html__( 'Pro Addon', 'visualizer' )
1155 + '<a style="color:red" href="' . tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'pluginrow' ) . '" target="_blank">%s</a>',
1156 + esc_html__( 'Get Visualizer Pro', 'visualizer' )
762 1157 );
763 1158 }
764 1159
765 1160 return $plugin_meta;
@@ -764,5 +1159,149 @@
764 1159
765 1160 return $plugin_meta;
766 1161 }
767 1162
1163 + /**
1164 + * If check is existing user.
1165 + *
1166 + * @return bool Default false
1167 + */
1168 + public static function proFeaturesLocked() {
1169 + if ( Visualizer_Module::is_pro() ) {
1170 + return true;
1171 + }
1172 + return 'yes' === get_option( 'visualizer-new-user', 'yes' ) ? false : true;
1173 + }
1174 +
1175 + /**
1176 + * Multilingual Support.
1177 + *
1178 + * @param int $chart_id Chart ID.
1179 + * @return bool Default false
1180 + */
1181 + public function addMultilingualSupport( $chart_id ) {
1182 + global $sitepress;
1183 + if ( Visualizer_Module::is_pro() ) {
1184 + return;
1185 + }
1186 + if ( function_exists( 'icl_get_languages' ) && $sitepress instanceof \SitePress ) {
1187 + $language = icl_get_languages();
1188 + $current_lang = icl_get_current_language();
1189 + $default_lang = icl_get_default_language();
1190 + $post_info = wpml_get_language_information( null, $chart_id );
1191 + $translations = array();
1192 + if ( ! empty( $post_info ) && ( $default_lang === $post_info['language_code'] ) ) {
1193 + $trid = $sitepress->get_element_trid( $chart_id, 'post_' . Visualizer_Plugin::CPT_VISUALIZER );
1194 + $translations = $sitepress->get_element_translations( $trid );
1195 + }
1196 + if ( empty( $translations ) ) {
1197 + return;
1198 + }
1199 + ?>
1200 + <hr><div class="visualizer-languages-list only-pro">
1201 + <?php
1202 + foreach ( $language as $lang ) {
1203 + $lang_code = $lang['code'];
1204 + if ( $current_lang !== $lang_code ) {
1205 + ?>
1206 + <a href="javascript:;">
1207 + <img src="<?php echo esc_url( $lang['country_flag_url'] ); ?>" alt="<?php echo esc_attr( $lang['translated_name'] ); ?>">
1208 + </a>
1209 + <?php
1210 + }
1211 + }
1212 + ?>
1213 + <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>
1214 + </div>
1215 + <?php
1216 + }
1217 + }
1218 +
1219 + /**
1220 + * Check chart is enabled or not.
1221 + *
1222 + * @param string $type Chart ID.
1223 + *
1224 + * @return bool Default false
1225 + */
1226 + public static function checkChartStatus( $type ) {
1227 + $types = self::_getChartTypesLocalized( false, false, false, true );
1228 + if ( isset( $types[ $type ] ) ) {
1229 + return ! empty( $types[ $type ]['enabled'] );
1230 + }
1231 + return false;
1232 + }
1233 +
1234 + /**
1235 + * Get the survey metadata.
1236 + *
1237 + * @param array $data The data for survey in Formbricks format.
1238 + * @param string $page_slug The slug of the loaded page.
1239 + *
1240 + * @return array The survey metadata.
1241 + */
1242 + public function get_survey_metadata( $data, $page_slug ) {
1243 + $install_date = get_option( 'visualizer_install', time() );
1244 + $install_days_number = intval( ( time() - $install_date ) / DAY_IN_SECONDS );
1245 +
1246 + $license_status = apply_filters( 'product_visualizer_license_status', 'invalid' );
1247 + $license_plan = apply_filters( 'product_visualizer_license_plan', false );
1248 + $license_key = apply_filters( 'product_visualizer_license_key', false );
1249 +
1250 + $plugin_data = get_plugin_data( VISUALIZER_BASEFILE, false, false );
1251 + $plugin_version = '';
1252 +
1253 + if ( ! empty( $plugin_data['Version'] ) ) {
1254 + $plugin_version = $plugin_data['Version'];
1255 + }
1256 +
1257 + $count_charts_cache_key = 'visualizer_count_charts';
1258 + $charts_number = get_transient( $count_charts_cache_key );
1259 +
1260 + if ( false === $charts_number ) {
1261 + $charts_number = $this->count_charts( 100 );
1262 + set_transient( $count_charts_cache_key, $charts_number, 100 === $charts_number ? WEEK_IN_SECONDS : 6 * HOUR_IN_SECONDS );
1263 + } else {
1264 + $charts_number = strval( $charts_number );
1265 + }
1266 +
1267 + $data = array(
1268 + 'environmentId' => 'cltef8cut1s7wyyfxy3rlxzs5',
1269 + 'attributes' => array(
1270 + 'free_version' => $plugin_version,
1271 + 'pro_version' => defined( 'VISUALIZER_PRO_VERSION' ) ? VISUALIZER_PRO_VERSION : '',
1272 + 'license_status' => $license_status,
1273 + 'install_days_number' => $install_days_number,
1274 + 'charts_number' => $charts_number,
1275 + ),
1276 + );
1277 +
1278 + if ( ! empty( $license_plan ) ) {
1279 + $data['attributes']['plan'] = $license_plan;
1280 + }
1281 +
1282 + if ( ! empty( $license_key ) ) {
1283 + $data['attributes']['license_key'] = apply_filters( 'themeisle_sdk_secret_masking', $license_key );
1284 + }
1285 +
1286 + return $data;
1287 + }
1288 +
1289 + /**
1290 + * Count the charts.
1291 + *
1292 + * @param int $limit The count limit (optional).
1293 + *
1294 + * @return int The number of charts.
1295 + */
1296 + public function count_charts( $limit = -1 ) {
1297 + $args = array(
1298 + 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
1299 + 'post_status' => 'publish',
1300 + 'posts_per_page' => $limit,
1301 + 'fields' => 'ids',
1302 + );
1303 +
1304 + $query = new WP_Query( $args);
1305 + return $query->post_count;
1306 + }
768 1307 }