PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.4.1
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.4.1
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 +80 -323 3.10.23.4.1 View file →
@@ -53,19 +53,17 @@
53 53 parent::__construct( $plugin );
54 54 $this->_addAction( 'load-post.php', 'enqueueMediaScripts' );
55 55 $this->_addAction( 'load-post-new.php', 'enqueueMediaScripts' );
56 56 $this->_addAction( 'admin_footer', 'renderTemplates' );
57 - $this->_addAction( 'admin_enqueue_scripts', 'enqueueLibraryScripts', null, 0 );
57 + $this->_addAction( 'admin_enqueue_scripts', 'enqueueLibraryScripts', null, 8 );
58 58 $this->_addAction( 'admin_menu', 'registerAdminMenu' );
59 59 $this->_addFilter( 'media_view_strings', 'setupMediaViewStrings' );
60 60 $this->_addFilter( 'plugin_action_links', 'getPluginActionLinks', 10, 2 );
61 61 $this->_addFilter( 'plugin_row_meta', 'getPluginMetaLinks', 10, 2 );
62 62 $this->_addFilter( 'visualizer_logger_data', 'getLoggerData' );
63 + $this->_addFilter( 'visualizer_get_chart_counts', 'getChartCountsByTypeAndMeta' );
63 64 $this->_addFilter( 'visualizer_feedback_review_trigger', 'feedbackReviewTrigger' );
64 65
65 - // screen pagination
66 - $this->_addFilter( 'set-screen-option', 'setScreenOptions', 10, 3 );
67 -
68 66 // revision support.
69 67 $this->_addFilter( 'wp_revisions_to_keep', 'limitRevisions', null, 10, 2 );
70 68 $this->_addAction( '_wp_put_post_revision', 'addRevision', null, 10, 1 );
71 69 $this->_addAction( 'wp_restore_post_revision', 'restoreRevision', null, 10, 2 );
@@ -72,32 +70,10 @@
72 70
73 71 $this->_addAction( 'visualizer_chart_schedules_spl', 'addSplChartSchedules', null, 10, 3 );
74 72
75 73 $this->_addAction( 'admin_init', 'init' );
76 -
77 - $this->_addAction( 'visualizer_chart_languages', 'addMultilingualSupport' );
78 -
79 - if ( defined( 'TI_CYPRESS_TESTING' ) ) {
80 - $this->load_cypress_hooks();
81 - }
82 -
83 74 }
84 75
85 - /**
86 - * Define the hooks that are needed for cypress.
87 - *
88 - * @since 3.4.0
89 - * @access private
90 - */
91 - private function load_cypress_hooks() {
92 - // all charts should load on the same page without pagination.
93 - add_filter(
94 - 'visualizer_query_args', function( $args ) {
95 - $args['posts_per_page'] = 20;
96 - return $args;
97 - }, 10, 1
98 - );
99 - }
100 76
101 77 /**
102 78 * Add disabled `optgroup` schedules to the drop downs.
103 79 *
@@ -315,9 +291,9 @@
315 291
316 292 // Load all the assets for the different libraries we support.
317 293 $deps = array(
318 294 Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) ),
319 - Visualizer_Render_Sidebar_Type_DataTable_Tabular::enqueue_assets( array( 'media-editor' ) ),
295 + Visualizer_Render_Sidebar_Type_DataTable_DataTable::enqueue_assets( array( 'media-editor' ) ),
320 296 );
321 297
322 298 wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', $deps, Visualizer_Plugin::VERSION, true );
323 299 wp_enqueue_script( 'visualizer-media-collection', VISUALIZER_ABSURL . 'js/media/collection.js', array( 'visualizer-media-model' ), Visualizer_Plugin::VERSION, true );
@@ -366,9 +342,9 @@
366 342 'filters' => $chart_types,
367 343 'types' => array_keys( $chart_types ),
368 344 ),
369 345 'nonce' => wp_create_nonce(),
370 - 'buildurl' => esc_url( add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ) ),
346 + 'buildurl' => add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ),
371 347 );
372 348
373 349 return $strings;
374 350 }
@@ -390,71 +366,74 @@
390 366 'enabled' => true,
391 367 );
392 368 }
393 369
394 - $enabled = self::proFeaturesLocked();
395 -
396 370 $types = array_merge(
397 371 $additional,
398 372 array(
399 - 'tabular' => array(
373 + 'dataTable' => array(
400 374 'name' => esc_html__( 'Table', 'visualizer' ),
401 375 'enabled' => true,
402 - 'supports' => $enabled ? array( 'Google Charts', 'DataTable' ) : array( 'DataTable' ),
376 + 'supports' => array( 'DataTable' ),
403 377 ),
404 378 'pie' => array(
405 379 'name' => esc_html__( 'Pie/Donut', 'visualizer' ),
406 380 'enabled' => true,
407 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
381 + 'supports' => array( 'Google Charts', 'ChartJS' ),
408 382 ),
409 383 'line' => array(
410 384 'name' => esc_html__( 'Line', 'visualizer' ),
411 385 'enabled' => true,
412 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
386 + 'supports' => array( 'Google Charts', 'ChartJS' ),
413 387 ),
414 - 'bar' => array(
415 - 'name' => esc_html__( 'Bar', 'visualizer' ),
416 - 'enabled' => true,
417 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
418 - ),
419 388 'area' => array(
420 389 'name' => esc_html__( 'Area', 'visualizer' ),
421 - 'enabled' => $enabled,
390 + 'enabled' => true,
422 391 // in ChartJS, the fill option is used to make Line chart an area: https://www.chartjs.org/docs/latest/charts/area.html
423 392 'supports' => array( 'Google Charts' ),
424 393 ),
425 394 'geo' => array(
426 395 'name' => esc_html__( 'Geo', 'visualizer' ),
427 - 'enabled' => $enabled,
396 + 'enabled' => true,
428 397 'supports' => array( 'Google Charts' ),
429 398 ),
399 + 'bar' => array(
400 + 'name' => esc_html__( 'Bar', 'visualizer' ),
401 + 'enabled' => true,
402 + 'supports' => array( 'Google Charts', 'ChartJS' ),
403 + ),
430 404 'column' => array(
431 405 'name' => esc_html__( 'Column', 'visualizer' ),
432 - 'enabled' => $enabled,
406 + 'enabled' => true,
433 407 'supports' => array( 'Google Charts', 'ChartJS' ),
434 408 ),
435 409 'bubble' => array(
436 410 'name' => esc_html__( 'Bubble', 'visualizer' ),
437 - 'enabled' => $enabled,
411 + 'enabled' => true,
438 412 // chartjs' bubble is ugly looking (and it won't work off the default bubble.csv) so it is being excluded for the time being.
439 413 'supports' => array( 'Google Charts' ),
440 414 ),
441 415 'scatter' => array(
442 416 'name' => esc_html__( 'Scatter', 'visualizer' ),
443 - 'enabled' => $enabled,
417 + 'enabled' => true,
444 418 'supports' => array( 'Google Charts' ),
445 419 ),
446 420 'gauge' => array(
447 421 'name' => esc_html__( 'Gauge', 'visualizer' ),
448 - 'enabled' => $enabled,
422 + 'enabled' => true,
449 423 'supports' => array( 'Google Charts' ),
450 424 ),
451 425 'candlestick' => array(
452 426 'name' => esc_html__( 'Candlestick', 'visualizer' ),
453 - 'enabled' => $enabled,
427 + 'enabled' => true,
454 428 'supports' => array( 'Google Charts' ),
455 429 ),
456 430 // pro types
431 + 'table' => array(
432 + 'name' => esc_html__( 'Table (Deprecated)', 'visualizer' ),
433 + 'enabled' => false,
434 + 'supports' => array( 'Google Charts' ),
435 + ),
457 436 'timeline' => array(
458 437 'name' => esc_html__( 'Timeline', 'visualizer' ),
459 438 'enabled' => false,
460 439 'supports' => array( 'Google Charts', 'ChartJS' ),
@@ -523,8 +502,18 @@
523 502 switch ( $where ) {
524 503 case 'types':
525 504 // fall-through
526 505 case 'library':
506 + // if the user has a Google Table chart, show it as deprecated otherwise remove the option from the library.
507 + if ( ! self::hasChartType( 'table' ) ) {
508 + $deprecated[] = 'table';
509 + if ( $get2Darray ) {
510 + $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
511 + } else {
512 + $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
513 + }
514 + }
515 +
527 516 // if a user has a Gauge/Candlestick chart, then let them keep using it.
528 517 if ( ! Visualizer_Module::is_pro() ) {
529 518 if ( ! self::hasChartType( 'gauge' ) ) {
530 519 if ( $get2Darray ) {
@@ -542,8 +531,18 @@
542 531 }
543 532 }
544 533 break;
545 534 default:
535 + // remove the option to create a Google Table chart.
536 + $deprecated[] = 'table';
537 +
538 + // rename the new table chart type.
539 + if ( $get2Darray ) {
540 + $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
541 + } else {
542 + $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
543 + }
544 +
546 545 // if a user has a Gauge/Candlestick chart, then let them keep using it.
547 546 if ( ! Visualizer_Module::is_pro() ) {
548 547 if ( ! self::hasChartType( 'gauge' ) ) {
549 548 if ( $get2Darray ) {
@@ -610,9 +609,8 @@
610 609 VISUALIZER_ABSURL . 'js/library.js',
611 610 array(
612 611 'jquery',
613 612 'media-views',
614 - 'clipboard',
615 613 ),
616 614 Visualizer_Plugin::VERSION,
617 615 true
618 616 );
@@ -687,151 +685,12 @@
687 685 'edit_posts',
688 686 'viz-support',
689 687 array( $this, 'renderSupportPage' )
690 688 );
691 -
692 689 remove_submenu_page( Visualizer_Plugin::NAME, Visualizer_Plugin::NAME );
693 -
694 - add_action( "load-{$this->_libraryPage}", array( $this, 'addScreenOptions' ) );
695 - add_action( 'admin_footer', array( $this, 'handleGetProSubMenu' ) );
696 690 }
697 691
698 692 /**
699 - * Handle get pro plugin submenu.
700 - */
701 - public function handleGetProSubMenu() {
702 - if ( ! Visualizer_Module::is_pro() ) {
703 - ?>
704 - <style type="text/css">
705 - #toplevel_page_visualizer ul.wp-submenu li:last-child {
706 - background: #FF7E65;
707 - font-size: 14px;
708 - font-weight: 600;
709 - color: #fff;
710 - }
711 - #toplevel_page_visualizer ul.wp-submenu li:last-child > a {
712 - color: #fff !important;
713 - }
714 - #toplevel_page_visualizer ul.wp-submenu li:last-child > a:hover {
715 - box-shadow: inherit;
716 - }
717 - </style>
718 - <?php
719 - if ( get_option( 'visualizer_fresh_install', false ) ) {
720 - ?>
721 - <style type="text/css">
722 - #toplevel_page_visualizer ul.wp-submenu li.wp-first-item + li + li + li {
723 - display: none;
724 - }
725 - </style>
726 - <?php
727 - }
728 - }
729 - }
730 -
731 - /**
732 - * Adds the screen options for pagination.
733 - */
734 - function addScreenOptions() {
735 - $screen = get_current_screen();
736 -
737 - // bail if it's some other page.
738 - if ( ! is_object( $screen ) || $screen->id !== $this->_libraryPage ) {
739 - return;
740 - }
741 -
742 - $args = array(
743 - 'label' => __( 'Number of charts per page:', 'visualizer' ),
744 - 'default' => 6,
745 - 'option' => 'visualizer_library_per_page',
746 - );
747 - add_screen_option( 'per_page', $args );
748 - }
749 -
750 - /**
751 - * Returns the screen option for pagination.
752 - */
753 - function setScreenOptions( $status, $option, $value ) {
754 - if ( 'visualizer_library_per_page' === $option ) {
755 - return $value;
756 - }
757 - }
758 -
759 - /**
760 - * Adds the display filters to be used in the meta_query while displaying the charts.
761 - */
762 - private function getDisplayFilters( &$query_args ) {
763 - $query = array();
764 - global $sitepress;
765 - if ( Visualizer_Module::is_pro() && ( function_exists( 'icl_get_languages' ) && $sitepress instanceof \SitePress ) ) {
766 - $current_lang = icl_get_current_language();
767 - if ( in_array( $current_lang, array( 'all', icl_get_default_language() ), true ) ) {
768 - $query[] = array(
769 - 'key' => 'chart_lang',
770 - 'compare' => 'NOT EXISTS',
771 - );
772 - } else {
773 - $query[] = array(
774 - 'key' => 'chart_lang',
775 - 'value' => $current_lang,
776 - 'compare' => '=',
777 - );
778 - }
779 - }
780 -
781 - // add chart type filter to the query arguments
782 - $type = filter_input( INPUT_GET, 'type' );
783 - if ( $type && in_array( $type, Visualizer_Plugin::getChartTypes(), true ) ) {
784 - $query[] = array(
785 - 'key' => Visualizer_Plugin::CF_CHART_TYPE,
786 - 'value' => $type,
787 - 'compare' => '=',
788 - );
789 - }
790 -
791 - // add chart library filter to the query arguments
792 - $library = filter_input( INPUT_GET, 'library' );
793 - if ( $library ) {
794 - $query[] = array(
795 - 'key' => Visualizer_Plugin::CF_CHART_LIBRARY,
796 - 'value' => $library,
797 - 'compare' => '=',
798 - );
799 - }
800 -
801 - // add date filter to the query arguments
802 - $date = filter_input( INPUT_GET, 'date' );
803 - $possible = array_keys( Visualizer_Plugin::getSupportedDateFilter() );
804 - if ( $date && in_array( $date, $possible, true ) ) {
805 - $query_args['date_query'] = array(
806 - 'after' => "$date -1 day",
807 - 'inclusive' => true,
808 - );
809 - }
810 -
811 - // add source filter to the query arguments
812 - $source = filter_input( INPUT_GET, 'source' );
813 - if ( $source ) {
814 - $source = ucwords( $source );
815 - $source = "Visualizer_Source_{$source}";
816 - $query[] = array(
817 - 'key' => Visualizer_Plugin::CF_SOURCE,
818 - 'value' => $source,
819 - 'compare' => '=',
820 - );
821 - }
822 -
823 - $query_args['meta_query'] = $query;
824 -
825 - $orderby = filter_input( INPUT_GET, 'orderby' );
826 - $order = filter_input( INPUT_GET, 'order' );
827 - if ( $orderby ) {
828 - $query_args['order_by'] = $orderby;
829 - }
830 - $query_args['order'] = empty( $order ) ? 'desc' : $order;
831 - }
832 -
833 - /**
834 693 * Get the instance of WP_Query that fetches the charts as per the given criteria.
835 694 */
836 695 private function getQuery() {
837 696 static $q;
@@ -850,34 +709,29 @@
850 709 'default' => 1,
851 710 ),
852 711 )
853 712 );
854 -
855 - $per_page = 6;
856 - $screen = get_current_screen();
857 - if ( $screen ) {
858 - // retrieve the per_page option
859 - $screen_option = $screen->get_option( 'per_page', 'option' );
860 - // retrieve the value stored for the current user
861 - $user = get_current_user_id();
862 - $per_page = get_user_meta( $user, $screen_option, true );
863 - if ( empty( $per_page ) || $per_page < 1 ) {
864 - // nothing set, get the default value
865 - $per_page = $screen->get_option( 'per_page', 'default' );
866 - }
867 - }
868 -
869 713 // the initial query arguments to fetch charts
870 714 $query_args = array(
871 715 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
872 - 'posts_per_page' => $per_page,
716 + 'posts_per_page' => 6,
873 717 'paged' => $page,
874 718 );
875 -
876 - $this->getDisplayFilters( $query_args );
877 -
719 + // add chart type filter to the query arguments
720 + $filter = filter_input( INPUT_GET, 'type' );
721 + if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes(), true ) ) {
722 + $query_args['meta_query'] = array(
723 + array(
724 + 'key' => Visualizer_Plugin::CF_CHART_TYPE,
725 + 'value' => $filter,
726 + 'compare' => '=',
727 + ),
728 + );
729 + } else {
730 + $filter = 'all';
731 + }
878 732 // Added by Ash/Upwork
879 - $filterByMeta = ! empty( $_GET['s'] ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : null; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
733 + $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
880 734 if ( $filterByMeta ) {
881 735 $query = array(
882 736 'key' => Visualizer_Plugin::CF_SETTINGS,
883 737 'value' => $filterByMeta,
@@ -886,9 +740,9 @@
886 740 $meta = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : array();
887 741 $meta[] = $query;
888 742 $query_args['meta_query'] = $meta;
889 743 }
890 - $q = new WP_Query( apply_filters( 'visualizer_query_args', $query_args ) );
744 + $q = new WP_Query( $query_args );
891 745 return $q;
892 746 }
893 747
894 748 /**
@@ -955,22 +809,10 @@
955 809 unset( $settings['height'], $settings['width'], $settings['chartArea'] );
956 810 }
957 811
958 812 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
959 - $data = self::get_chart_data( $chart, $type );
813 + $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( $chart->post_content ) ), $chart->ID, $type );
960 814
961 - // Set default setting series when add manual chart data - Only during first creation.
962 - if ( isset( $settings['series'] ) && ! empty( $series ) ) {
963 - $count_series = count( $series ) - count( $settings['series'] );
964 - if ( $count_series > 1 ) {
965 - $clone_last_series = end( $settings['series'] );
966 - $clone_last_series = array_fill_keys( array_keys( $clone_last_series ), '' );
967 - foreach ( range( 1, $count_series ) as $item ) {
968 - $settings['series'][] = $clone_last_series;
969 - }
970 - }
971 - }
972 -
973 815 $library = $this->load_chart_type( $chart->ID );
974 816
975 817 $id = 'visualizer-' . $chart->ID;
976 818 $arguments = $this->get_inline_custom_css( $id, $settings );
@@ -978,15 +820,8 @@
978 820 $css .= $arguments[0];
979 821 $settings = $arguments[1];
980 822 }
981 823
982 - if ( isset( $settings['controls']['ui']['labelStacking'] ) ) {
983 - unset( $settings['controls']['ui']['labelStacking'] );
984 - }
985 - if ( isset( $settings['controls']['ui']['orientation'] ) ) {
986 - unset( $settings['controls']['ui']['orientation'] );
987 - }
988 -
989 824 // add chart to the array
990 825 $charts[ $id ] = array(
991 826 'id' => $chart->ID,
992 827 'type' => $type,
@@ -1005,38 +840,30 @@
1005 840 'language' => $this->get_language(),
1006 841 'map_api_key' => get_option( 'visualizer-map-api-key' ),
1007 842 'charts' => $charts,
1008 843 'urls' => array(
1009 - 'base' => esc_url( add_query_arg( array( 'vpage' => false, 'vaction' => false ) ) ),
1010 - 'create' => esc_url(
1011 - add_query_arg(
1012 - array(
1013 - 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
1014 - 'library' => 'yes',
1015 - 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
1016 - 'chart-library' => isset( $_GET['chart-library'] ) ? $_GET['chart-library'] : '',
1017 - 'vaction' => false,
1018 - ),
1019 - $ajaxurl
1020 - )
844 + 'base' => add_query_arg( array( 'vpage' => false, 'vaction' => false ) ),
845 + 'create' => add_query_arg(
846 + array(
847 + 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
848 + 'library' => 'yes',
849 + 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
850 + 'chart-library' => isset( $_GET['chart-library'] ) ? $_GET['chart-library'] : '',
851 + 'vaction' => false,
852 + ),
853 + $ajaxurl
1021 854 ),
1022 - 'edit' => esc_url(
1023 - add_query_arg(
1024 - array(
1025 - 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
1026 - 'library' => 'yes',
1027 - 'vaction' => false,
1028 - ),
1029 - $ajaxurl
1030 - )
855 + 'edit' => add_query_arg(
856 + array(
857 + 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
858 + 'library' => 'yes',
859 + 'vaction' => false,
860 + ),
861 + $ajaxurl
1031 862 ),
1032 863 ),
1033 864 'page_type' => 'library',
1034 865 'is_front' => false,
1035 - 'i10n' => array(
1036 - 'copied' => __( 'The shortcode has been copied to your clipboard. Hit Ctrl-V/Cmd-V to paste it.', 'visualizer' ),
1037 - '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' ),
1038 - ),
1039 866 )
1040 867 );
1041 868 // render library page
1042 869 $render = new Visualizer_Render_Library();
@@ -1103,9 +930,9 @@
1103 930 esc_html__( 'Docs', 'visualizer' )
1104 931 );
1105 932 // flattr link
1106 933 $plugin_meta[] = sprintf(
1107 - '<a style="color:red" href="' . tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'pluginrow' ) . '" target="_blank">%s</a>',
934 + '<a style="color:red" href="' . Visualizer_Plugin::PRO_TEASER_URL . '" target="_blank">%s</a>',
1108 935 esc_html__( 'Pro Addon', 'visualizer' )
1109 936 );
1110 937 }
1111 938
@@ -1111,75 +938,5 @@
1111 938
1112 939 return $plugin_meta;
1113 940 }
1114 941
1115 - /**
1116 - * If check is existing user.
1117 - *
1118 - * @return bool Default false
1119 - */
1120 - public static function proFeaturesLocked() {
1121 - if ( Visualizer_Module::is_pro() ) {
1122 - return true;
1123 - }
1124 - return 'yes' === get_option( 'visualizer-new-user', 'yes' ) ? false : true;
1125 - }
1126 -
1127 - /**
1128 - * Multilingual Support.
1129 - *
1130 - * @param int $chart_id Chart ID.
1131 - * @return bool Default false
1132 - */
1133 - public function addMultilingualSupport( $chart_id ) {
1134 - global $sitepress;
1135 - if ( Visualizer_Module::is_pro() ) {
1136 - return;
1137 - }
1138 - if ( function_exists( 'icl_get_languages' ) && $sitepress instanceof \SitePress ) {
1139 - $language = icl_get_languages();
1140 - $current_lang = icl_get_current_language();
1141 - $default_lang = icl_get_default_language();
1142 - $post_info = wpml_get_language_information( null, $chart_id );
1143 - $translations = array();
1144 - if ( ! empty( $post_info ) && ( $default_lang === $post_info['language_code'] ) ) {
1145 - $trid = $sitepress->get_element_trid( $chart_id, 'post_' . Visualizer_Plugin::CPT_VISUALIZER );
1146 - $translations = $sitepress->get_element_translations( $trid );
1147 - }
1148 - if ( empty( $translations ) ) {
1149 - return;
1150 - }
1151 - ?>
1152 - <hr><div class="visualizer-languages-list only-pro">
1153 - <?php
1154 - foreach ( $language as $lang ) {
1155 - $lang_code = $lang['code'];
1156 - if ( $current_lang !== $lang_code ) {
1157 - ?>
1158 - <a href="javascript:;">
1159 - <img src="<?php echo esc_url( $lang['country_flag_url'] ); ?>" alt="<?php echo esc_attr( $lang['translated_name'] ); ?>">
1160 - </a>
1161 - <?php
1162 - }
1163 - }
1164 - ?>
1165 - <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>
1166 - </div>
1167 - <?php
1168 - }
1169 - }
1170 -
1171 - /**
1172 - * Check chart is enabled or not.
1173 - *
1174 - * @param string $type Chart ID.
1175 - *
1176 - * @return bool Default false
1177 - */
1178 - public static function checkChartStatus( $type ) {
1179 - $types = self::_getChartTypesLocalized( false, false, false, true );
1180 - if ( isset( $types[ $type ] ) ) {
1181 - return ! empty( $types[ $type ]['enabled'] );
1182 - }
1183 - return false;
1184 - }
1185 942 }