PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.1.3
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.1.3
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 +88 -489 3.10.33.1.3 View file →
@@ -53,109 +53,25 @@
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 - $this->_addFilter( 'plugin_row_meta', 'getPluginMetaLinks', 10, 2 );
62 61 $this->_addFilter( 'visualizer_logger_data', 'getLoggerData' );
62 + $this->_addFilter( 'visualizer_get_chart_counts', 'getChartCountsByTypeAndMeta' );
63 63 $this->_addFilter( 'visualizer_feedback_review_trigger', 'feedbackReviewTrigger' );
64 64
65 - // screen pagination
66 - $this->_addFilter( 'set-screen-option', 'setScreenOptions', 10, 3 );
67 -
68 65 // revision support.
69 66 $this->_addFilter( 'wp_revisions_to_keep', 'limitRevisions', null, 10, 2 );
70 67 $this->_addAction( '_wp_put_post_revision', 'addRevision', null, 10, 1 );
71 68 $this->_addAction( 'wp_restore_post_revision', 'restoreRevision', null, 10, 2 );
72 69
73 - $this->_addAction( 'visualizer_chart_schedules_spl', 'addSplChartSchedules', null, 10, 3 );
74 -
75 70 $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 71 }
84 72
85 73 /**
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 -
101 - /**
102 - * Add disabled `optgroup` schedules to the drop downs.
103 - *
104 - * @since ?
105 - *
106 - * @access public
107 - *
108 - * @param string $feature The feature for which to add schedules.
109 - * @param int $chart_id The chart ID.
110 - * @param int $plan The plan number.
111 - */
112 - public function addSplChartSchedules( $feature, $chart_id, $plan ) {
113 - if ( apply_filters( 'visualizer_is_business', false ) ) {
114 - return;
115 - }
116 -
117 - $license = __( 'PRO', 'visualizer' );
118 - if ( Visualizer_Module::is_pro() ) {
119 - switch ( $plan ) {
120 - case 1:
121 - $license = __( 'Developer', 'visualizer' );
122 - break;
123 - }
124 - }
125 -
126 - $hours = array(
127 - '0' => __( 'Live', 'visualizer' ),
128 - '1' => __( 'Each hour', 'visualizer' ),
129 - '12' => __( 'Each 12 hours', 'visualizer' ),
130 - '24' => __( 'Each day', 'visualizer' ),
131 - '72' => __( 'Each 3 days', 'visualizer' ),
132 - );
133 -
134 - switch ( $feature ) {
135 - case 'json':
136 - case 'csv':
137 - // no more schedules if pro is already active.
138 - if ( Visualizer_Module::is_pro() ) {
139 - return;
140 - }
141 - break;
142 - case 'wp':
143 - // fall-through.
144 - case 'db':
145 - break;
146 - default:
147 - return;
148 - }
149 -
150 - echo '<optgroup disabled label="' . sprintf( __( 'More in the %s version', 'visualizer' ), $license ) . '">';
151 - foreach ( $hours as $hour => $desc ) {
152 - echo '<option disabled>' . $desc . '</option>';
153 - }
154 - echo '</optgroup>';
155 - }
156 -
157 - /**
158 74 * No limits on revisions.
159 75 */
160 76 public function limitRevisions( $num, $post ) {
161 77 if ( Visualizer_Plugin::CPT_VISUALIZER === $post->post_type ) {
@@ -216,31 +132,16 @@
216 132 *
217 133 * @access public
218 134 */
219 135 public function init() {
220 - // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
221 136 if ( current_user_can( 'edit_posts' ) && current_user_can( 'edit_pages' ) && 'true' == get_user_option( 'rich_editing' ) ) {
222 137 $this->_addFilter( 'mce_external_languages', 'add_tinymce_lang', 10, 1 );
223 138 $this->_addFilter( 'mce_external_plugins', 'tinymce_plugin', 10, 1 );
224 139 $this->_addFilter( 'mce_buttons', 'register_mce_button', 10, 1 );
225 - $this->_addFilter( 'tiny_mce_before_init', 'get_strings_for_block', 10, 1 );
226 140 }
227 141 }
228 142
229 143 /**
230 - * Add the strings required for the TinyMCE buttons for the classic block (not the classic editor).
231 - *
232 - * @since ?
233 - * @access friendly
234 - */
235 - function get_strings_for_block( $settings ) {
236 - $class = new Visualizer_Module_Language();
237 - $strings = $class->get_strings();
238 - $array = array( 'visualizer_tinymce_plugin' => json_encode( $strings ) );
239 - return array_merge( $settings, $array );
240 - }
241 -
242 - /**
243 144 * Load plugin translation for - TinyMCE API
244 145 *
245 146 * @access public
246 147 * @param array $arr The tinymce_lang array.
@@ -315,9 +216,9 @@
315 216
316 217 // Load all the assets for the different libraries we support.
317 218 $deps = array(
318 219 Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) ),
319 - Visualizer_Render_Sidebar_Type_DataTable_Tabular::enqueue_assets( array( 'media-editor' ) ),
220 + Visualizer_Render_Sidebar_Type_DataTable::enqueue_assets( array( 'media-editor' ) ),
320 221 );
321 222
322 223 wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', $deps, Visualizer_Plugin::VERSION, true );
323 224 wp_enqueue_script( 'visualizer-media-collection', VISUALIZER_ABSURL . 'js/media/collection.js', array( 'visualizer-media-model' ), Visualizer_Plugin::VERSION, true );
@@ -366,9 +267,9 @@
366 267 'filters' => $chart_types,
367 268 'types' => array_keys( $chart_types ),
368 269 ),
369 270 'nonce' => wp_create_nonce(),
370 - 'buildurl' => esc_url( add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ) ),
271 + 'buildurl' => add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ),
371 272 );
372 273
373 274 return $strings;
374 275 }
@@ -390,91 +291,64 @@
390 291 'enabled' => true,
391 292 );
392 293 }
393 294
394 - $enabled = self::proFeaturesLocked();
395 -
396 295 $types = array_merge(
397 296 $additional,
398 297 array(
399 - 'tabular' => array(
400 - 'name' => esc_html__( 'Table', 'visualizer' ),
298 + 'dataTable' => array(
299 + 'name' => esc_html__( 'Table (New)', 'visualizer' ),
401 300 'enabled' => true,
402 - 'supports' => $enabled ? array( 'Google Charts', 'DataTable' ) : array( 'DataTable' ),
403 301 ),
404 302 'pie' => array(
405 - 'name' => esc_html__( 'Pie/Donut', 'visualizer' ),
303 + 'name' => esc_html__( 'Pie', 'visualizer' ),
406 304 'enabled' => true,
407 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
408 305 ),
409 306 'line' => array(
410 307 'name' => esc_html__( 'Line', 'visualizer' ),
411 308 'enabled' => true,
412 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
413 309 ),
414 - 'bar' => array(
415 - 'name' => esc_html__( 'Bar', 'visualizer' ),
416 - 'enabled' => true,
417 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
418 - ),
419 310 'area' => array(
420 311 'name' => esc_html__( 'Area', 'visualizer' ),
421 - 'enabled' => $enabled,
422 - // in ChartJS, the fill option is used to make Line chart an area: https://www.chartjs.org/docs/latest/charts/area.html
423 - 'supports' => array( 'Google Charts' ),
312 + 'enabled' => true,
424 313 ),
425 314 'geo' => array(
426 315 'name' => esc_html__( 'Geo', 'visualizer' ),
427 - 'enabled' => $enabled,
428 - 'supports' => array( 'Google Charts' ),
316 + 'enabled' => true,
429 317 ),
318 + 'bar' => array(
319 + 'name' => esc_html__( 'Bar', 'visualizer' ),
320 + 'enabled' => true,
321 + ),
430 322 'column' => array(
431 323 'name' => esc_html__( 'Column', 'visualizer' ),
432 - 'enabled' => $enabled,
433 - 'supports' => array( 'Google Charts', 'ChartJS' ),
324 + 'enabled' => true,
434 325 ),
435 - 'bubble' => array(
436 - 'name' => esc_html__( 'Bubble', 'visualizer' ),
437 - 'enabled' => $enabled,
438 - // 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 - 'supports' => array( 'Google Charts' ),
440 - ),
441 326 'scatter' => array(
442 327 'name' => esc_html__( 'Scatter', 'visualizer' ),
443 - 'enabled' => $enabled,
444 - 'supports' => array( 'Google Charts' ),
328 + 'enabled' => true,
445 329 ),
446 330 'gauge' => array(
447 331 'name' => esc_html__( 'Gauge', 'visualizer' ),
448 - 'enabled' => $enabled,
449 - 'supports' => array( 'Google Charts' ),
332 + 'enabled' => true,
450 333 ),
451 334 'candlestick' => array(
452 335 'name' => esc_html__( 'Candlestick', 'visualizer' ),
453 - 'enabled' => $enabled,
454 - 'supports' => array( 'Google Charts' ),
336 + 'enabled' => true,
455 337 ),
456 338 // pro types
339 + 'table' => array(
340 + 'name' => esc_html__( 'Table (Deprecated)', 'visualizer' ),
341 + 'enabled' => false,
342 + ),
457 343 'timeline' => array(
458 344 'name' => esc_html__( 'Timeline', 'visualizer' ),
459 345 'enabled' => false,
460 - 'supports' => array( 'Google Charts', 'ChartJS' ),
461 346 ),
462 347 'combo' => array(
463 348 'name' => esc_html__( 'Combo', 'visualizer' ),
464 349 'enabled' => false,
465 - 'supports' => array( 'Google Charts' ),
466 350 ),
467 - 'polarArea' => array(
468 - 'name' => esc_html__( 'Polar Area', 'visualizer' ),
469 - 'enabled' => false,
470 - 'supports' => array( 'ChartJS' ),
471 - ),
472 - 'radar' => array(
473 - 'name' => esc_html__( 'Radar/Spider', 'visualizer' ),
474 - 'enabled' => false,
475 - 'supports' => array( 'ChartJS' ),
476 - ),
477 351 )
478 352 );
479 353 $types = apply_filters( 'visualizer_pro_chart_types', $types );
480 354 if ( $enabledOnly ) {
@@ -483,12 +357,8 @@
483 357 if ( ! is_array( $array ) ) {
484 358 // support for old pro
485 359 $array = array( 'enabled' => true, 'name' => $array );
486 360 }
487 - // backward compatibility for PRO before v1.9.0
488 - if ( ! array_key_exists( 'supports', $array ) ) {
489 - $array['supports'] = array( 'Google Charts' );
490 - }
491 361 if ( ! $array['enabled'] ) {
492 362 continue;
493 363 }
494 364 $filtered[ $type ] = $array;
@@ -501,12 +371,8 @@
501 371 if ( ! is_array( $array ) ) {
502 372 // support for old pro
503 373 $array = array( 'enabled' => true, 'name' => $array );
504 374 }
505 - // backward compatibility for PRO before v1.9.0
506 - if ( ! array_key_exists( 'supports', $array ) ) {
507 - $array['supports'] = array( 'Google Charts' );
508 - }
509 375 $doubleD[ $type ] = $array['name'];
510 376 }
511 377 $types = $doubleD;
512 378 }
@@ -520,13 +386,21 @@
520 386 private static function handleDeprecatedCharts( $types, $enabledOnly, $get2Darray, $where ) {
521 387 $deprecated = array();
522 388
523 389 switch ( $where ) {
524 - case 'types':
525 - // fall-through
526 390 case 'library':
391 + // if the user has a Google Table chart, show it as deprecated otherwise remove the option from the library.
392 + if ( ! self::hasChartType( 'table' ) ) {
393 + $deprecated[] = 'table';
394 + if ( $get2Darray ) {
395 + $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
396 + } else {
397 + $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
398 + }
399 + }
400 +
527 401 // if a user has a Gauge/Candlestick chart, then let them keep using it.
528 - if ( ! Visualizer_Module::is_pro() ) {
402 + if ( ! VISUALIZER_PRO ) {
529 403 if ( ! self::hasChartType( 'gauge' ) ) {
530 404 if ( $get2Darray ) {
531 405 $deprecated[] = 'gauge';
532 406 } else {
@@ -542,10 +416,20 @@
542 416 }
543 417 }
544 418 break;
545 419 default:
420 + // remove the option to create a Google Table chart.
421 + $deprecated[] = 'table';
422 +
423 + // rename the new table chart type.
424 + if ( $get2Darray ) {
425 + $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
426 + } else {
427 + $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
428 + }
429 +
546 430 // if a user has a Gauge/Candlestick chart, then let them keep using it.
547 - if ( ! Visualizer_Module::is_pro() ) {
431 + if ( ! VISUALIZER_PRO ) {
548 432 if ( ! self::hasChartType( 'gauge' ) ) {
549 433 if ( $get2Darray ) {
550 434 $deprecated[] = 'gauge';
551 435 } else {
@@ -580,9 +464,9 @@
580 464 * @access public
581 465 */
582 466 public function renderTemplates() {
583 467 global $pagenow;
584 - if ( 'post.php' !== $pagenow && 'post-new.php' !== $pagenow ) {
468 + if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
585 469 return;
586 470 }
587 471 $render = new Visualizer_Render_Templates();
588 472 $render->render();
@@ -600,9 +484,9 @@
600 484 *
601 485 * @param string $suffix The current page suffix.
602 486 */
603 487 public function enqueueLibraryScripts( $suffix ) {
604 - if ( $suffix === $this->_libraryPage ) {
488 + if ( $suffix == $this->_libraryPage ) {
605 489 wp_enqueue_style( 'visualizer-library', VISUALIZER_ABSURL . 'css/library.css', array(), Visualizer_Plugin::VERSION );
606 490 $this->_addFilter( 'media_upload_tabs', 'setupVisualizerTab' );
607 491 wp_enqueue_media();
608 492 wp_enqueue_script(
@@ -610,9 +494,8 @@
610 494 VISUALIZER_ABSURL . 'js/library.js',
611 495 array(
612 496 'jquery',
613 497 'media-views',
614 - 'clipboard',
615 498 ),
616 499 Visualizer_Plugin::VERSION,
617 500 true
618 501 );
@@ -661,177 +544,14 @@
661 544 *
662 545 * @access public
663 546 */
664 547 public function registerAdminMenu() {
665 - $svg_base64_icon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNzdweCIgaGVpZ2h0PSI3N3B4IiB2aWV3Qm94PSIwIDAgNzcgNzciIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjYgKDY3NDkxKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5Db21iaW5lZCBTaGFwZTwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQcm9kdWN0LVBhZ2UiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJXb3JkUHJlc3MtcGx1Z2lucyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE5MC4wMDAwMDAsIC00MzUuMDAwMDAwKSIgZmlsbD0iIzM5QzNEMiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMjguNSw1MTIgQzIwNy4yMzcwMzcsNTEyIDE5MCw0OTQuNzYyOTYzIDE5MCw0NzMuNSBDMTkwLDQ1Mi4yMzcwMzcgMjA3LjIzNzAzNyw0MzUgMjI4LjUsNDM1IEMyNDkuNzYyOTYzLDQzNSAyNjcsNDUyLjIzNzAzNyAyNjcsNDczLjUgQzI2Nyw0OTQuNzYyOTYzIDI0OS43NjI5NjMsNTEyIDIyOC41LDUxMiBaIE0yNDYuODQzNzUsNDgzLjU5MjA1OSBMMjE1LjYyNSw0ODMuNTkyMDU5IEwyMTUuNjI1LDQ2MC44MjY1NDQgQzIxNS42MjUsNDYwLjE2NDU0NyAyMTUuMTA3NTc4LDQ1OS42MjgzNTkgMjE0LjQ2ODc1LDQ1OS42MjgzNTkgTDIxMi4xNTYyNSw0NTkuNjI4MzU5IEMyMTEuNTE3NDIyLDQ1OS42MjgzNTkgMjExLDQ2MC4xNjQ1NDcgMjExLDQ2MC44MjY1NDQgTDIxMSw0ODUuOTg4NDI5IEMyMTEsNDg3LjMxMTY3NCAyMTIuMDM1NTY2LDQ4OC4zODQ3OTggMjEzLjMxMjUsNDg4LjM4NDc5OCBMMjQ2Ljg0Mzc1LDQ4OC4zODQ3OTggQzI0Ny40ODI1NzgsNDg4LjM4NDc5OCAyNDgsNDg3Ljg0ODYxMSAyNDgsNDg3LjE4NjYxMyBMMjQ4LDQ4NC43OTAyNDQgQzI0OCw0ODQuMTI4MjQ2IDI0Ny40ODI1NzgsNDgzLjU5MjA1OSAyNDYuODQzNzUsNDgzLjU5MjA1OSBaIE0yNDQuNTMxMjUsNDYyLjAyNDcyOSBMMjM1Ljk5OTU3LDQ2Mi4wMjQ3MjkgQzIzNC40NTQ1MzEsNDYyLjAyNDcyOSAyMzMuNjgwNTY2LDQ2My45NjA1NDcgMjM0Ljc3MzIyMyw0NjUuMDkyODMyIEwyMzcuMTE0NjI5LDQ2Ny41MTkxNTYgTDIzMS44MTI1LDQ3My4wMTQzMzIgTDIyNi41MTAzNzEsNDY3LjUxOTkwNSBDMjI1LjYwNzA1MSw0NjYuNTgzODIzIDIyNC4xNDI5NDksNDY2LjU4MzgyMyAyMjMuMjQwMzUyLDQ2Ny41MTk5MDUgTDIxOC4yNzY0MjYsNDcyLjY2Mzg2MyBDMjE3LjgyNDc2Niw0NzMuMTMxOTA0IDIxNy44MjQ3NjYsNDczLjg5MDUwNSAyMTguMjc2NDI2LDQ3NC4zNTg1NDYgTDIxOS45MTEwNzQsNDc2LjA1MjQ4IEMyMjAuMzYyNzM0LDQ3Ni41MjA1MjEgMjIxLjA5NDc4NSw0NzYuNTIwNTIxIDIyMS41NDY0NDUsNDc2LjA1MjQ4IEwyMjQuODc1LDQ3Mi42MDI0NTYgTDIzMC4xNzcxMjksNDc4LjA5Njg4MyBDMjMxLjA4MDQ0OSw0NzkuMDMyOTY1IDIzMi41NDQ1NTEsNDc5LjAzMjk2NSAyMzMuNDQ3MTQ4LDQ3OC4wOTY4ODMgTDI0MC4zODQ2NDgsNDcwLjkwNzc3MyBMMjQyLjcyNjA1NSw0NzMuMzM0MDk4IEMyNDMuODE4NzExLDQ3NC40NjYzODIgMjQ1LjY4Njc3Nyw0NzMuNjY0MzQ3IDI0NS42ODY3NzcsNDcyLjA2MzI3MyBMMjQ1LjY4Njc3Nyw0NjMuMjIyOTE0IEMyNDUuNjg3NSw0NjIuNTYwOTE3IDI0NS4xNzAwNzgsNDYyLjAyNDcyOSAyNDQuNTMxMjUsNDYyLjAyNDcyOSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==';
666 -
667 - $this->_libraryPage = add_menu_page( __( 'Visualizer', 'visualizer' ), __( 'Visualizer', 'visualizer' ), 'edit_posts', Visualizer_Plugin::NAME, array( $this, 'renderLibraryPage' ), $svg_base64_icon, 99.7666 );
668 -
669 - add_submenu_page(
670 - Visualizer_Plugin::NAME,
671 - __( 'Chart Library', 'visualizer' ),
672 - __( 'Chart Library', 'visualizer' ),
673 - 'edit_posts',
674 - admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME )
675 - );
676 - add_submenu_page(
677 - Visualizer_Plugin::NAME,
678 - __( 'Add New Chart', 'visualizer' ),
679 - __( 'Add New Chart', 'visualizer' ),
680 - 'edit_posts',
681 - admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME . '&vaction=addnew' )
682 - );
683 - add_submenu_page(
684 - Visualizer_Plugin::NAME,
685 - __( 'Support', 'visualizer' ),
686 - __( '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>',
687 - 'edit_posts',
688 - 'viz-support',
689 - array( $this, 'renderSupportPage' )
690 - );
691 -
692 - 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' ) );
548 + $title = esc_html__( 'Visualizer Library', 'visualizer' );
549 + $callback = array( $this, 'renderLibraryPage' );
550 + $this->_libraryPage = add_submenu_page( 'upload.php', $title, $title, 'edit_posts', Visualizer_Plugin::NAME, $callback );
696 551 }
697 552
698 553 /**
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 554 * Get the instance of WP_Query that fetches the charts as per the given criteria.
835 555 */
836 556 private function getQuery() {
837 557 static $q;
@@ -850,34 +570,29 @@
850 570 'default' => 1,
851 571 ),
852 572 )
853 573 );
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 574 // the initial query arguments to fetch charts
870 575 $query_args = array(
871 576 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
872 - 'posts_per_page' => $per_page,
577 + 'posts_per_page' => 6,
873 578 'paged' => $page,
874 579 );
875 -
876 - $this->getDisplayFilters( $query_args );
877 -
580 + // add chart type filter to the query arguments
581 + $filter = filter_input( INPUT_GET, 'type' );
582 + if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
583 + $query_args['meta_query'] = array(
584 + array(
585 + 'key' => Visualizer_Plugin::CF_CHART_TYPE,
586 + 'value' => $filter,
587 + 'compare' => '=',
588 + ),
589 + );
590 + } else {
591 + $filter = 'all';
592 + }
878 593 // Added by Ash/Upwork
879 - $filterByMeta = ! empty( $_GET['s'] ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : null; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
594 + $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
880 595 if ( $filterByMeta ) {
881 596 $query = array(
882 597 'key' => Visualizer_Plugin::CF_SETTINGS,
883 598 'value' => $filterByMeta,
@@ -886,25 +601,13 @@
886 601 $meta = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : array();
887 602 $meta[] = $query;
888 603 $query_args['meta_query'] = $meta;
889 604 }
890 - $q = new WP_Query( apply_filters( 'visualizer_query_args', $query_args ) );
605 + $q = new WP_Query( $query_args );
891 606 return $q;
892 607 }
893 608
894 609 /**
895 - * Renders support page.
896 - *
897 - * @since 3.3.0
898 - *
899 - * @access public
900 - */
901 - public function renderSupportPage() {
902 - wp_enqueue_style( 'visualizer-upsell', VISUALIZER_ABSURL . 'css/upsell.css', array(), Visualizer_Plugin::VERSION );
903 - include_once VISUALIZER_ABSPATH . '/templates/support.php';
904 - }
905 -
906 - /**
907 610 * Renders visualizer library page.
908 611 *
909 612 * @since 1.0.0
910 613 *
@@ -927,9 +630,9 @@
927 630 )
928 631 );
929 632 // add chart type filter to the query arguments
930 633 $filter = filter_input( INPUT_GET, 'type' );
931 - if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes(), true ) ) ) {
634 + if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) ) {
932 635 $filter = 'all';
933 636 }
934 637
935 638 $css = '';
@@ -950,27 +653,12 @@
950 653 if ( ! empty( $atts['settings'] ) ) {
951 654 $settings = apply_filters( $atts['settings'], $settings, $chart->ID, $type );
952 655 }
953 656
954 - if ( $settings ) {
955 - unset( $settings['height'], $settings['width'], $settings['chartArea'] );
956 - }
957 -
657 + unset( $settings['height'], $settings['width'] );
958 658 $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 );
659 + $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( $chart->post_content ) ), $chart->ID, $type );
960 660
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 661 $library = $this->load_chart_type( $chart->ID );
974 662
975 663 $id = 'visualizer-' . $chart->ID;
976 664 $arguments = $this->get_inline_custom_css( $id, $settings );
@@ -978,15 +666,8 @@
978 666 $css .= $arguments[0];
979 667 $settings = $arguments[1];
980 668 }
981 669
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 670 // add chart to the array
990 671 $charts[ $id ] = array(
991 672 'id' => $chart->ID,
992 673 'type' => $type,
@@ -1005,38 +686,26 @@
1005 686 'language' => $this->get_language(),
1006 687 'map_api_key' => get_option( 'visualizer-map-api-key' ),
1007 688 'charts' => $charts,
1008 689 '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 - )
690 + 'base' => add_query_arg( 'vpage', false ),
691 + 'create' => add_query_arg(
692 + array(
693 + 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
694 + 'library' => 'yes',
695 + 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
696 + ),
697 + $ajaxurl
1021 698 ),
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 - )
699 + 'edit' => add_query_arg(
700 + array(
701 + 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
702 + 'library' => 'yes',
703 + ),
704 + $ajaxurl
1031 705 ),
1032 706 ),
1033 707 'page_type' => 'library',
1034 - '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 708 )
1040 709 );
1041 710 // render library page
1042 711 $render = new Visualizer_Render_Library();
@@ -1045,9 +714,9 @@
1045 714 $render->types = self::_getChartTypesLocalized( false, false, false, true );
1046 715 $render->custom_css = $css;
1047 716 $render->pagination = paginate_links(
1048 717 array(
1049 - 'base' => add_query_arg( array( 'vpage' => '%#%', 'vaction' => false ) ),
718 + 'base' => add_query_arg( 'vpage', '%#%' ),
1050 719 'format' => '',
1051 720 'current' => $page,
1052 721 'total' => $query->max_num_pages,
1053 722 'type' => 'array',
@@ -1068,14 +737,14 @@
1068 737 *
1069 738 * @return array Updated array of action links.
1070 739 */
1071 740 public function getPluginActionLinks( $links, $file ) {
1072 - if ( $file === plugin_basename( VISUALIZER_BASEFILE ) ) {
741 + if ( $file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1073 742 array_unshift(
1074 743 $links,
1075 744 sprintf(
1076 745 '<a href="%s">%s</a>',
1077 - admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME ),
746 + admin_url( 'upload.php?page=' . Visualizer_Plugin::NAME ),
1078 747 esc_html__( 'Library', 'visualizer' )
1079 748 )
1080 749 );
1081 750 }
@@ -1095,17 +764,17 @@
1095 764 *
1096 765 * @return array Updated array of plugin meta links.
1097 766 */
1098 767 public function getPluginMetaLinks( $plugin_meta, $plugin_file ) {
1099 - if ( $plugin_file === plugin_basename( VISUALIZER_BASEFILE ) ) {
768 + if ( $plugin_file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1100 769 // knowledge base link
1101 770 $plugin_meta[] = sprintf(
1102 - '<a href="' . VISUALIZER_MAIN_DOC . '" target="_blank">%s</a>',
1103 - esc_html__( 'Docs', 'visualizer' )
771 + '<a href="https://github.com/codeinwp/visualizer/wiki" target="_blank">%s</a>',
772 + esc_html__( 'Knowledge Base', 'visualizer' )
1104 773 );
1105 774 // flattr link
1106 775 $plugin_meta[] = sprintf(
1107 - '<a style="color:red" href="' . tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'pluginrow' ) . '" target="_blank">%s</a>',
776 + '<a style="color:red" href="https://themeisle.com/plugins/visualizer-charts-and-graphs-pro-addon/" target="_blank">%s</a>',
1108 777 esc_html__( 'Pro Addon', 'visualizer' )
1109 778 );
1110 779 }
1111 780
@@ -1111,75 +780,5 @@
1111 780
1112 781 return $plugin_meta;
1113 782 }
1114 783
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 784 }