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 +616 -91 3.1.13.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 ),
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/',
471 + ),
324 472 'scatter' => array(
325 473 'name' => esc_html__( 'Scatter', 'visualizer' ),
326 - 'enabled' => true,
474 + 'enabled' => $enabled,
475 + 'supports' => array( 'Google Charts' ),
476 + 'demo_url' => 'https://demo.themeisle.com/visualizer/scatter-chart/',
327 477 ),
328 478 'gauge' => array(
329 479 'name' => esc_html__( 'Gauge', 'visualizer' ),
330 - 'enabled' => true,
480 + 'enabled' => $enabled,
481 + 'supports' => array( 'Google Charts' ),
482 + 'demo_url' => 'https://demo.themeisle.com/visualizer/gauge-chart/',
331 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,21 +558,13 @@
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 568 if ( $get2Darray ) {
403 569 $deprecated[] = 'gauge';
404 570 } else {
@@ -414,20 +580,10 @@
414 580 }
415 581 }
416 582 break;
417 583 default:
418 - // remove the option to create a Google Table chart.
419 - $deprecated[] = 'table';
420 -
421 - // rename the new table chart type.
422 - if ( $get2Darray ) {
423 - $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
424 - } else {
425 - $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
426 - }
427 -
428 584 // if a user has a Gauge/Candlestick chart, then let them keep using it.
429 - if ( ! VISUALIZER_PRO ) {
585 + if ( ! Visualizer_Module::is_pro() ) {
430 586 if ( ! self::hasChartType( 'gauge' ) ) {
431 587 if ( $get2Darray ) {
432 588 $deprecated[] = 'gauge';
433 589 } else {
@@ -462,9 +618,9 @@
462 618 * @access public
463 619 */
464 620 public function renderTemplates() {
465 621 global $pagenow;
466 - if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
622 + if ( 'post.php' !== $pagenow && 'post-new.php' !== $pagenow ) {
467 623 return;
468 624 }
469 625 $render = new Visualizer_Render_Templates();
470 626 $render->render();
@@ -482,9 +638,9 @@
482 638 *
483 639 * @param string $suffix The current page suffix.
484 640 */
485 641 public function enqueueLibraryScripts( $suffix ) {
486 - if ( $suffix == $this->_libraryPage ) {
642 + if ( $suffix === $this->_libraryPage ) {
487 643 wp_enqueue_style( 'visualizer-library', VISUALIZER_ABSURL . 'css/library.css', array(), Visualizer_Plugin::VERSION );
488 644 $this->_addFilter( 'media_upload_tabs', 'setupVisualizerTab' );
489 645 wp_enqueue_media();
490 646 wp_enqueue_script(
@@ -492,8 +648,9 @@
492 648 VISUALIZER_ABSURL . 'js/library.js',
493 649 array(
494 650 'jquery',
495 651 'media-views',
652 + 'clipboard',
496 653 ),
497 654 Visualizer_Plugin::VERSION,
498 655 true
499 656 );
@@ -542,14 +699,177 @@
542 699 *
543 700 * @access public
544 701 */
545 702 public function registerAdminMenu() {
546 - $title = esc_html__( 'Visualizer Library', 'visualizer' );
547 - $callback = array( $this, 'renderLibraryPage' );
548 - $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' ) );
549 734 }
550 735
551 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 + /**
552 872 * Get the instance of WP_Query that fetches the charts as per the given criteria.
553 873 */
554 874 private function getQuery() {
555 875 static $q;
@@ -568,29 +888,34 @@
568 888 'default' => 1,
569 889 ),
570 890 )
571 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 +
572 907 // the initial query arguments to fetch charts
573 908 $query_args = array(
574 909 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
575 - 'posts_per_page' => 6,
910 + 'posts_per_page' => $per_page,
576 911 'paged' => $page,
577 912 );
578 - // add chart type filter to the query arguments
579 - $filter = filter_input( INPUT_GET, 'type' );
580 - if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
581 - $query_args['meta_query'] = array(
582 - array(
583 - 'key' => Visualizer_Plugin::CF_CHART_TYPE,
584 - 'value' => $filter,
585 - 'compare' => '=',
586 - ),
587 - );
588 - } else {
589 - $filter = 'all';
590 - }
913 +
914 + $this->getDisplayFilters( $query_args );
915 +
591 916 // Added by Ash/Upwork
592 - $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
593 918 if ( $filterByMeta ) {
594 919 $query = array(
595 920 'key' => Visualizer_Plugin::CF_SETTINGS,
596 921 'value' => $filterByMeta,
@@ -599,13 +924,26 @@
599 924 $meta = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : array();
600 925 $meta[] = $query;
601 926 $query_args['meta_query'] = $meta;
602 927 }
603 - $q = new WP_Query( $query_args );
928 + $q = new WP_Query( apply_filters( 'visualizer_query_args', $query_args ) );
604 929 return $q;
605 930 }
606 931
607 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 + /**
608 946 * Renders visualizer library page.
609 947 *
610 948 * @since 1.0.0
611 949 *
@@ -628,9 +966,9 @@
628 966 )
629 967 );
630 968 // add chart type filter to the query arguments
631 969 $filter = filter_input( INPUT_GET, 'type' );
632 - if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) ) {
970 + if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes(), true ) ) ) {
633 971 $filter = 'all';
634 972 }
635 973
636 974 $css = '';
@@ -651,12 +989,27 @@
651 989 if ( ! empty( $atts['settings'] ) ) {
652 990 $settings = apply_filters( $atts['settings'], $settings, $chart->ID, $type );
653 991 }
654 992
655 - unset( $settings['height'], $settings['width'] );
993 + if ( $settings ) {
994 + unset( $settings['height'], $settings['width'], $settings['chartArea'] );
995 + }
996 +
656 997 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
657 - $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 );
658 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 +
659 1012 $library = $this->load_chart_type( $chart->ID );
660 1013
661 1014 $id = 'visualizer-' . $chart->ID;
662 1015 $arguments = $this->get_inline_custom_css( $id, $settings );
@@ -664,8 +1017,15 @@
664 1017 $css .= $arguments[0];
665 1018 $settings = $arguments[1];
666 1019 }
667 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 +
668 1028 // add chart to the array
669 1029 $charts[ $id ] = array(
670 1030 'id' => $chart->ID,
671 1031 'type' => $type,
@@ -676,8 +1036,9 @@
676 1036 );
677 1037 }
678 1038 // enqueue charts array
679 1039 $ajaxurl = admin_url( 'admin-ajax.php' );
1040 +
680 1041 wp_localize_script(
681 1042 'visualizer-library',
682 1043 'visualizer',
683 1044 array(
@@ -684,26 +1045,39 @@
684 1045 'language' => $this->get_language(),
685 1046 'map_api_key' => get_option( 'visualizer-map-api-key' ),
686 1047 'charts' => $charts,
687 1048 'urls' => array(
688 - 'base' => add_query_arg( 'vpage', false ),
689 - 'create' => add_query_arg(
690 - array(
691 - 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
692 - 'library' => 'yes',
693 - 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
694 - ),
695 - $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 + )
696 1061 ),
697 - 'edit' => add_query_arg(
698 - array(
699 - 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
700 - 'library' => 'yes',
701 - ),
702 - $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 + )
703 1071 ),
704 1072 ),
705 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(),
706 1080 )
707 1081 );
708 1082 // render library page
709 1083 $render = new Visualizer_Render_Library();
@@ -712,9 +1086,9 @@
712 1086 $render->types = self::_getChartTypesLocalized( false, false, false, true );
713 1087 $render->custom_css = $css;
714 1088 $render->pagination = paginate_links(
715 1089 array(
716 - 'base' => add_query_arg( 'vpage', '%#%' ),
1090 + 'base' => add_query_arg( array( 'vpage' => '%#%', 'vaction' => false ) ),
717 1091 'format' => '',
718 1092 'current' => $page,
719 1093 'total' => $query->max_num_pages,
720 1094 'type' => 'array',
@@ -719,8 +1093,15 @@
719 1093 'total' => $query->max_num_pages,
720 1094 'type' => 'array',
721 1095 )
722 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 +
723 1104 $render->render();
724 1105 }
725 1106
726 1107 /**
@@ -735,14 +1116,14 @@
735 1116 *
736 1117 * @return array Updated array of action links.
737 1118 */
738 1119 public function getPluginActionLinks( $links, $file ) {
739 - if ( $file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1120 + if ( $file === plugin_basename( VISUALIZER_BASEFILE ) ) {
740 1121 array_unshift(
741 1122 $links,
742 1123 sprintf(
743 1124 '<a href="%s">%s</a>',
744 - admin_url( 'upload.php?page=' . Visualizer_Plugin::NAME ),
1125 + admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME ),
745 1126 esc_html__( 'Library', 'visualizer' )
746 1127 )
747 1128 );
748 1129 }
@@ -762,18 +1143,18 @@
762 1143 *
763 1144 * @return array Updated array of plugin meta links.
764 1145 */
765 1146 public function getPluginMetaLinks( $plugin_meta, $plugin_file ) {
766 - if ( $plugin_file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1147 + if ( $plugin_file === plugin_basename( VISUALIZER_BASEFILE ) ) {
767 1148 // knowledge base link
768 1149 $plugin_meta[] = sprintf(
769 - '<a href="https://github.com/codeinwp/visualizer/wiki" target="_blank">%s</a>',
770 - esc_html__( 'Knowledge Base', 'visualizer' )
1150 + '<a href="' . VISUALIZER_MAIN_DOC . '" target="_blank">%s</a>',
1151 + esc_html__( 'Docs', 'visualizer' )
771 1152 );
772 1153 // flattr link
773 1154 $plugin_meta[] = sprintf(
774 - '<a style="color:red" href="https://themeisle.com/plugins/visualizer-charts-and-graphs-pro-addon/" target="_blank">%s</a>',
775 - 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' )
776 1157 );
777 1158 }
778 1159
779 1160 return $plugin_meta;
@@ -778,5 +1159,149 @@
778 1159
779 1160 return $plugin_meta;
780 1161 }
781 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 + }
782 1307 }