GravityView  2.10.1
The best, easiest way to display Gravity Forms entries on your website.
class-gv-plugin.php
Go to the documentation of this file.
1 <?php
2 
3 namespace GV;
4 
5 /** If this file is called directly, abort. */
6 if ( ! defined( 'GRAVITYVIEW_DIR' ) ) {
7  die();
8 }
9 
10 /**
11  * The GravityView WordPress plugin class.
12  *
13  * Contains functionality related to GravityView being
14  * a WordPress plugin and doing WordPress pluginy things.
15  *
16  * Accessible via gravityview()->plugin
17  */
18 final class Plugin {
19 
20  /**
21  * @since 2.0
22  * @api
23  * @var string The plugin version.
24  *
25  */
26  public static $version = GV_PLUGIN_VERSION;
27 
28  /**
29  * @var string Minimum WordPress version.
30  *
31  * GravityView requires at least this version of WordPress to function properly.
32  */
33  private static $min_wp_version = GV_MIN_WP_VERSION;
34 
35  /**
36  * @var string Minimum WordPress version.
37  *
38  * @since 2.9.3
39  *
40  * GravityView will require this version of WordPress soon.
41  */
42  private static $future_min_wp_version = GV_FUTURE_MIN_WP_VERSION;
43 
44  /**
45  * @var string Minimum Gravity Forms version.
46  *
47  * GravityView requires at least this version of Gravity Forms to function properly.
48  */
49  public static $min_gf_version = GV_MIN_GF_VERSION;
50 
51  /**
52  * @var string Minimum PHP version.
53  *
54  * GravityView requires at least this version of PHP to function properly.
55  */
56  private static $min_php_version = GV_MIN_PHP_VERSION;
57 
58  /**
59  * @var string|bool Minimum future PHP version.
60  *
61  * GravityView will require this version of PHP soon. False if no future PHP version changes are planned.
62  */
63  private static $future_min_php_version = GV_FUTURE_MIN_PHP_VERSION;
64 
65  /**
66  * @var string|bool Minimum future Gravity Forms version.
67  *
68  * GravityView will require this version of Gravity Forms soon. False if no future Gravity Forms version changes are planned.
69  */
70  private static $future_min_gf_version = GV_FUTURE_MIN_GF_VERSION;
71 
72  /**
73  * @var \GV\Plugin The \GV\Plugin static instance.
74  */
75  private static $__instance = null;
76 
77  /**
78  * @since 2.0
79  * @api
80  * @var \GV\Addon_Settings The plugin "addon" settings.
81  *
82  */
83  public $settings;
84 
85  /**
86  * @var string The GFQuery functionality identifier.
87  */
88  const FEATURE_GFQUERY = 'gfquery';
89 
90  /**
91  * @var string The joins functionality identifier.
92  */
93  const FEATURE_JOINS = 'joins';
94 
95  /**
96  * @var string The unions functionality identifier.
97  */
98  const FEATURE_UNIONS = 'unions';
99 
100  /**
101  * @var string The REST API functionality identifier.
102  */
103  const FEATURE_REST = 'rest_api';
104 
105  /**
106  * Get the global instance of \GV\Plugin.
107  *
108  * @return \GV\Plugin The global instance of GravityView Plugin.
109  */
110  public static function get() {
111 
112  if ( ! self::$__instance instanceof self ) {
113  self::$__instance = new self;
114  }
115 
116  return self::$__instance;
117  }
118 
119  private function __construct() {
120 
121  /**
122  * Load translations.
123  */
124  add_action( 'init', array( $this, 'load_textdomain' ) );
125 
126  /**
127  * Load some frontend-related legacy files.
128  */
129  add_action( 'gravityview/loaded', array( $this, 'include_legacy_frontend' ) );
130 
131  /**
132  * GFAddOn-backed settings, licensing.
133  */
134  add_action( 'plugins_loaded', array( $this, 'load_license_settings' ) );
135  }
136 
137  public function load_license_settings() {
138 
139  require_once $this->dir( 'future/includes/class-gv-license-handler.php' );
140  require_once $this->dir( 'future/includes/class-gv-settings-addon.php' );
141  if ( class_exists( '\GV\Addon_Settings' ) ) {
142  $this->settings = new Addon_Settings();
143  include_once $this->dir( 'includes/class-gravityview-settings.php' );
144  } else {
145  gravityview()->log->notice( '\GV\Addon_Settings not loaded. Missing \GFAddOn.' );
146  }
147  }
148 
149  /**
150  * Check whether Gravity Forms is v2.5-beta or newer
151  *
152  * @return bool
153  * @todo add @since
154  *
155  */
156  public function is_GF_25() {
157 
158  return version_compare( '2.5-beta', \GFForms::$version, '<=' );
159  }
160 
161  /**
162  * Check whether GravityView `is network activated.
163  *
164  * @return bool Whether it's network activated or not.
165  */
166  public static function is_network_activated() {
167 
168  $plugin_basename = plugin_basename( GRAVITYVIEW_FILE );
169 
170  return is_multisite() && ( function_exists( 'is_plugin_active_for_network' ) && is_plugin_active_for_network( $plugin_basename ) );
171  }
172 
173  /**
174  * Include more legacy stuff.
175  *
176  * @param boolean $force Whether to force the includes.
177  *
178  * @return void
179  */
180  public function include_legacy_frontend( $force = false ) {
181 
182  if ( gravityview()->request->is_admin() && ! $force ) {
183  return;
184  }
185 
186  include_once $this->dir( 'includes/class-gravityview-image.php' );
187  include_once $this->dir( 'includes/class-template.php' );
188  include_once $this->dir( 'includes/class-api.php' );
189  include_once $this->dir( 'includes/class-frontend-views.php' );
190  include_once $this->dir( 'includes/class-gravityview-change-entry-creator.php' );
191 
192  /**
193  * @action `gravityview_include_frontend_actions` Triggered after all GravityView frontend files are loaded
194  *
195  * @deprecated Use `gravityview/loaded` along with \GV\Request::is_admin(), etc.
196  *
197  * Nice place to insert extensions' frontend stuff
198  */
199  do_action( 'gravityview_include_frontend_actions' );
200  }
201 
202  /**
203  * Load more legacy core files.
204  *
205  * @return void
206  */
207  public function include_legacy_core() {
208 
209  if ( ! class_exists( '\GravityView_Extension' ) ) {
210  include_once $this->dir( 'includes/class-gravityview-extension.php' );
211  }
212 
213  if ( ! gravityview()->plugin->is_compatible() ) {
214  return;
215  }
216 
217  // Load fields
218  include_once $this->dir( 'includes/fields/class-gravityview-fields.php' );
219  include_once $this->dir( 'includes/fields/class-gravityview-field.php' );
220 
221  // Load all field files automatically
222  foreach ( glob( $this->dir( 'includes/fields/class-gravityview-field*.php' ) ) as $gv_field_filename ) {
223  include_once $gv_field_filename;
224  }
225 
226  include_once $this->dir( 'includes/class-gravityview-entry-approval-status.php' );
227  include_once $this->dir( 'includes/class-gravityview-entry-approval.php' );
228 
229  include_once $this->dir( 'includes/class-gravityview-entry-notes.php' );
230  include_once $this->dir( 'includes/load-plugin-and-theme-hooks.php' );
231 
232  // Load Extensions
233  // @todo: Convert to a scan of the directory or a method where this all lives
234  include_once $this->dir( 'includes/extensions/edit-entry/class-edit-entry.php' );
235  include_once $this->dir( 'includes/extensions/delete-entry/class-delete-entry.php' );
236  include_once $this->dir( 'includes/extensions/duplicate-entry/class-duplicate-entry.php' );
237  include_once $this->dir( 'includes/extensions/entry-notes/class-gravityview-field-notes.php' );
238  include_once $this->dir( 'includes/extensions/lightbox/class-gravityview-lightbox.php' );
239 
240  // Load WordPress Widgets
241  include_once $this->dir( 'includes/wordpress-widgets/register-wordpress-widgets.php' );
242 
243  // Load GravityView Widgets
244  include_once $this->dir( 'includes/widgets/register-gravityview-widgets.php' );
245 
246  // Add oEmbed
247  include_once $this->dir( 'includes/class-api.php' );
248  include_once $this->dir( 'includes/class-oembed.php' );
249 
250  // Add logging
251  include_once $this->dir( 'includes/class-gravityview-logging.php' );
252 
253  include_once $this->dir( 'includes/class-ajax.php' );
254  include_once $this->dir( 'includes/class-gravityview-html-elements.php' );
255  include_once $this->dir( 'includes/class-frontend-views.php' );
256  include_once $this->dir( 'includes/class-gravityview-admin-bar.php' );
257  include_once $this->dir( 'includes/class-gravityview-entry-list.php' );
258  include_once $this->dir( 'includes/class-gravityview-merge-tags.php' );
259  /** @since 1.8.4 */
260  include_once $this->dir( 'includes/class-data.php' );
261  include_once $this->dir( 'includes/class-gravityview-shortcode.php' );
262  include_once $this->dir( 'includes/class-gravityview-entry-link-shortcode.php' );
263  include_once $this->dir( 'includes/class-gvlogic-shortcode.php' );
264  include_once $this->dir( 'includes/presets/register-default-templates.php' );
265 
266  if ( class_exists( '\GFFormsModel' ) ) {
267  include_once $this->dir( 'includes/class-gravityview-gfformsmodel.php' );
268  }
269  }
270 
271  /**
272  * Load the translations.
273  *
274  * Order of look-ups:
275  *
276  * 1. /wp-content/languages/plugins/gravityview-{locale}.mo (loaded by WordPress Core)
277  * 2. /wp-content/mu-plugins/gravityview-{locale}.mo
278  * 3. /wp-content/mu-plugins/languages/gravityview-{locale}.mo
279  * 4. /wp-content/plugins/gravityview/languages/gravityview-{locale}.mo
280  *
281  * @return void
282  */
283  public function load_textdomain() {
284 
285  $domain = 'gravityview';
286 
287  // 1. /wp-content/languages/plugins/gravityview-{locale}.mo (loaded by WordPress Core)
288  if ( is_textdomain_loaded( $domain ) ) {
289  return;
290  }
291 
292  // 2. /wp-content/languages/plugins/gravityview-{locale}.mo
293  // 3. /wp-content/mu-plugins/plugins/languages/gravityview-{locale}.mo
294  $loaded = load_muplugin_textdomain( $domain, '/languages/' );
295 
296  if ( $loaded ) {
297  return;
298  }
299 
300  // 4. /wp-content/plugins/gravityview/languages/gravityview-{locale}.mo
301  $loaded = load_plugin_textdomain( $domain, false, $this->relpath( '/languages/' ) );
302 
303  if ( $loaded ) {
304  return;
305  }
306 
307  gravityview()->log->error( sprintf( 'Unable to load textdomain for %s locale.', $locale ) );
308  }
309 
310  /**
311  * Register hooks that are fired when the plugin is activated and deactivated.
312  *
313  * @return void
314  */
315  public function register_activation_hooks() {
316 
317  register_activation_hook( $this->dir( 'gravityview.php' ), array( $this, 'activate' ) );
318  register_deactivation_hook( $this->dir( 'gravityview.php' ), array( $this, 'deactivate' ) );
319  }
320 
321  /**
322  * Plugin activation function.
323  *
324  * @return void
325  * @internal
326  */
327  public function activate() {
328 
329  gravityview();
330 
331  if ( ! $this->is_compatible() ) {
332  return;
333  }
334 
335  /** Register the gravityview post type upon WordPress core init. */
336  require_once $this->dir( 'future/includes/class-gv-view.php' );
337  View::register_post_type();
338 
339  /** Add the entry rewrite endpoint. */
340  require_once $this->dir( 'future/includes/class-gv-entry.php' );
341  Entry::add_rewrite_endpoint();
342 
343  /** Flush all URL rewrites. */
344  flush_rewrite_rules();
345 
346  update_option( 'gv_version', self::$version );
347 
348  /** Add the transient to redirect to configuration page. */
349  set_transient( '_gv_activation_redirect', true, 60 );
350 
351  /** Clear settings transient. */
352  delete_transient( 'gravityview_edd-activate_valid' );
353 
355  }
356 
357  /**
358  * Plugin deactivation function.
359  *
360  * @return void
361  * @internal
362  */
363  public function deactivate() {
364 
365  flush_rewrite_rules();
366  }
367 
368  /**
369  * Retrieve an absolute path within the GravityView plugin directory.
370  *
371  * @since 2.0
372  *
373  * @param string $path Optional. Append this extra path component.
374  * @return string The absolute path to the plugin directory.
375  * @api
376  */
377  public function dir( $path = '' ) {
378 
379  return wp_normalize_path( GRAVITYVIEW_DIR . ltrim( $path, '/' ) );
380  }
381 
382  /**
383  * Retrieve a relative path to the GravityView plugin directory from the WordPress plugin directory
384  *
385  * @since 2.2.3
386  *
387  * @param string $path Optional. Append this extra path component.
388  * @return string The relative path to the plugin directory from the plugin directory.
389  * @api
390  */
391  public function relpath( $path = '' ) {
392 
393  $dirname = trailingslashit( dirname( plugin_basename( GRAVITYVIEW_FILE ) ) );
394 
395  return wp_normalize_path( $dirname . ltrim( $path, '/' ) );
396  }
397 
398  /**
399  * Retrieve a URL within the GravityView plugin directory.
400  *
401  * @since 2.0
402  *
403  * @param string $path Optional. Extra path appended to the URL.
404  * @return string The URL to this plugin, with trailing slash.
405  * @api
406  */
407  public function url( $path = '/' ) {
408 
409  return plugins_url( $path, $this->dir( 'gravityview.php' ) );
410  }
411 
412  /**
413  * Is everything compatible with this version of GravityView?
414  *
415  * @since 2.0
416  *
417  * @return bool
418  * @api
419  */
420  public function is_compatible() {
421 
422  return
423  $this->is_compatible_php()
424  && $this->is_compatible_wordpress()
425  && $this->is_compatible_gravityforms();
426  }
427 
428  /**
429  * Is this version of GravityView compatible with the current version of PHP?
430  *
431  * @since 2.0
432  *
433  * @return bool true if compatible, false otherwise.
434  * @api
435  */
436  public function is_compatible_php() {
437 
438  return version_compare( $this->get_php_version(), self::$min_php_version, '>=' );
439  }
440 
441  /**
442  * Is this version of GravityView compatible with the future required version of PHP?
443  *
444  * @since 2.0
445  *
446  * @return bool true if compatible, false otherwise.
447  * @api
448  */
449  public function is_compatible_future_php() {
450 
451  return version_compare( $this->get_php_version(), self::$future_min_php_version, '>=' );
452  }
453 
454  /**
455  * Is this version of GravityView compatible with the current version of WordPress?
456  *
457  * @since 2.0
458  *
459  * @param string $version Version to check against; otherwise uses GV_MIN_WP_VERSION
460  *
461  * @return bool true if compatible, false otherwise.
462  * @api
463  */
464  public function is_compatible_wordpress( $version = null ) {
465 
466  if ( ! $version ) {
467  $version = self::$min_wp_version;
468  }
469 
470  return version_compare( $this->get_wordpress_version(), $version, '>=' );
471  }
472 
473  /**
474  * Is this version of GravityView compatible with the future version of WordPress?
475  *
476  * @since 2.9.3
477  *
478  * @return bool true if compatible, false otherwise
479  * @api
480  */
481  public function is_compatible_future_wordpress() {
482 
483  $version = $this->get_wordpress_version();
484 
485  return $version ? version_compare( $version, self::$future_min_wp_version, '>=' ) : false;
486  }
487 
488  /**
489  * Is this version of GravityView compatible with the current version of Gravity Forms?
490  *
491  * @since 2.0
492  *
493  * @return bool true if compatible, false otherwise (or not active/installed).
494  * @api
495  */
496  public function is_compatible_gravityforms() {
497 
498  $version = $this->get_gravityforms_version();
499 
500  return $version ? version_compare( $version, self::$min_gf_version, '>=' ) : false;
501  }
502 
503  /**
504  * Is this version of GravityView compatible with the future version of Gravity Forms?
505  *
506  * @since 2.0
507  *
508  * @return bool true if compatible, false otherwise (or not active/installed).
509  * @api
510  */
512 
513  $version = $this->get_gravityforms_version();
514 
515  return $version ? version_compare( $version, self::$future_min_gf_version, '>=' ) : false;
516  }
517 
518  /**
519  * Retrieve the current PHP version.
520  *
521  * Overridable with GRAVITYVIEW_TESTS_PHP_VERSION_OVERRIDE during testing.
522  *
523  * @return string The version of PHP.
524  */
525  private function get_php_version() {
526 
527  return ! empty( $GLOBALS['GRAVITYVIEW_TESTS_PHP_VERSION_OVERRIDE'] ) ?
528  $GLOBALS['GRAVITYVIEW_TESTS_PHP_VERSION_OVERRIDE'] : phpversion();
529  }
530 
531  /**
532  * Retrieve the current WordPress version.
533  *
534  * Overridable with GRAVITYVIEW_TESTS_WP_VERSION_OVERRIDE during testing.
535  *
536  * @return string The version of WordPress.
537  */
538  private function get_wordpress_version() {
539 
540  return ! empty( $GLOBALS['GRAVITYVIEW_TESTS_WP_VERSION_OVERRIDE'] ) ?
541  $GLOBALS['GRAVITYVIEW_TESTS_WP_VERSION_OVERRIDE'] : $GLOBALS['wp_version'];
542  }
543 
544  /**
545  * Retrieve the current Gravity Forms version.
546  *
547  * Overridable with GRAVITYVIEW_TESTS_GF_VERSION_OVERRIDE during testing.
548  *
549  * @return string|null The version of Gravity Forms or null if inactive.
550  */
551  private function get_gravityforms_version() {
552 
553  if ( ! class_exists( '\GFCommon' ) || ! empty( $GLOBALS['GRAVITYVIEW_TESTS_GF_INACTIVE_OVERRIDE'] ) ) {
554  gravityview()->log->error( 'Gravity Forms is inactive or not installed.' );
555 
556  return null;
557  }
558 
559  return ! empty( $GLOBALS['GRAVITYVIEW_TESTS_GF_VERSION_OVERRIDE'] ) ?
560  $GLOBALS['GRAVITYVIEW_TESTS_GF_VERSION_OVERRIDE'] : \GFCommon::$version;
561  }
562 
563  /**
564  * Feature support detection.
565  *
566  * @param string $feature Feature name. Check FEATURE_* class constants.
567  *
568  * @return boolean
569  */
570  public function supports( $feature ) {
571 
572  if ( ! is_null( $supports = apply_filters( "gravityview/plugin/feature/$feature", null ) ) ) {
573  return $supports;
574  }
575 
576  switch ( $feature ):
577  case self::FEATURE_GFQUERY:
578  return class_exists( '\GF_Query' );
579  case self::FEATURE_JOINS:
580  case self::FEATURE_UNIONS:
581  return apply_filters( 'gravityview/query/class', false ) === '\GF_Patched_Query';
582  case self::FEATURE_REST:
583  return class_exists( '\WP_REST_Controller' );
584  default:
585  return false;
586  endswitch;
587  }
588 
589  /**
590  * Delete GravityView Views, settings, roles, caps, etc.
591  *
592  * @return void
593  */
594  public function uninstall() {
595 
596  global $wpdb;
597 
598  $suppress = $wpdb->suppress_errors();
599 
600  /**
601  * Posts.
602  */
603  $items = get_posts( array(
604  'post_type' => 'gravityview',
605  'post_status' => 'any',
606  'numberposts' => - 1,
607  'fields' => 'ids',
608  ) );
609 
610  foreach ( $items as $item ) {
611  wp_delete_post( $item, true );
612  }
613 
614  /**
615  * Meta.
616  */
617  $tables = array();
618 
619  if ( version_compare( \GravityView_GFFormsModel::get_database_version(), '2.3-dev-1', '>=' ) ) {
620  $tables [] = \GFFormsModel::get_entry_meta_table_name();
621  } elseif ( ! $this->is_GF_25() ) {
622  $tables [] = \GFFormsModel::get_lead_meta_table_name();
623  }
624 
625  foreach ( $tables as $meta_table ) {
626  $sql = "
627  DELETE FROM $meta_table
628  WHERE (
629  `meta_key` = 'is_approved'
630  );
631  ";
632  $wpdb->query( $sql );
633  }
634 
635  /**
636  * Notes.
637  */
638  $tables = array();
639 
640  if ( version_compare( \GravityView_GFFormsModel::get_database_version(), '2.3-dev-1', '>=' ) && method_exists( 'GFFormsModel', 'get_entry_notes_table_name' ) ) {
641  $tables[] = \GFFormsModel::get_entry_notes_table_name();
642  } elseif ( ! $this->is_GF_25() ) {
643  $tables[] = \GFFormsModel::get_lead_notes_table_name();
644  }
645 
646  $disapproved = __( 'Disapproved the Entry for GravityView', 'gravityview' );
647  $approved = __( 'Approved the Entry for GravityView', 'gravityview' );
648 
649  $suppress = $wpdb->suppress_errors();
650  foreach ( $tables as $notes_table ) {
651  $sql = $wpdb->prepare( "
652  DELETE FROM $notes_table
653  WHERE (
654  `note_type` = 'gravityview' OR
655  `value` = %s OR
656  `value` = %s
657  );
658  ", $approved, $disapproved );
659  $wpdb->query( $sql );
660  }
661 
662  $wpdb->suppress_errors( $suppress );
663 
664  /**
665  * Capabilities.
666  */
668 
669  /**
670  * Options.
671  */
672  delete_option( 'gravityview_cache_blacklist' );
673  delete_option( 'gv_version_upgraded_from' );
674  delete_transient( 'gravityview_edd-activate_valid' );
675  delete_transient( 'gravityview_edd-deactivate_valid' );
676  delete_transient( 'gravityview_dismissed_notices' );
677  delete_site_transient( 'gravityview_related_plugins' );
678  }
679 
680  public function __clone() {
681  }
682 
683  public function __wakeup() {
684  }
685 }
const GRAVITYVIEW_DIR
"GRAVITYVIEW_DIR" "./" The absolute path to the plugin directory, with trailing slash ...
Definition: gravityview.php:40
deactivate()
Plugin deactivation function.
If this file is called directly, abort.
get_php_version()
Retrieve the current PHP version.
uninstall()
Delete GravityView Views, settings, roles, caps, etc.
is_compatible_future_gravityforms()
Is this version of GravityView compatible with the future version of Gravity Forms?
is_GF_25()
Check whether Gravity Forms is v2.5-beta or newer.
const GV_FUTURE_MIN_WP_VERSION
GravityView will soon require at least this version of WordPress to function properly.
Definition: gravityview.php:63
is_compatible_future_wordpress()
Is this version of GravityView compatible with the future version of WordPress?
get_wordpress_version()
Retrieve the current WordPress version.
static is_network_activated()
Check whether GravityView `is network activated.
is_compatible_wordpress( $version=null)
Is this version of GravityView compatible with the current version of WordPress?
is_compatible_gravityforms()
Is this version of GravityView compatible with the current version of Gravity Forms?
is_compatible_future_php()
Is this version of GravityView compatible with the future required version of PHP?
gravityview()
Definition: _stubs.php:26
get_gravityforms_version()
Retrieve the current Gravity Forms version.
include_legacy_core()
Load more legacy core files.
dir( $path='')
Retrieve an absolute path within the GravityView plugin directory.
const GV_PLUGIN_VERSION(! defined( 'ABSPATH'))
Plugin Name: GravityView Plugin URI: https://gravityview.co Description: The best, easiest way to display Gravity Forms entries on your website.
Definition: gravityview.php:25
relpath( $path='')
Retrieve a relative path to the GravityView plugin directory from the WordPress plugin directory...
const GV_FUTURE_MIN_PHP_VERSION
Definition: gravityview.php:76
If this file is called directly, abort.
const GRAVITYVIEW_FILE
Full path to the GravityView file "GRAVITYVIEW_FILE" "./gravityview.php".
Definition: gravityview.php:31
const GV_FUTURE_MIN_GF_VERSION
GravityView will soon require at least this version of Gravity Forms to function properly.
Definition: gravityview.php:51
supports( $feature)
Feature support detection.
register_activation_hooks()
Register hooks that are fired when the plugin is activated and deactivated.
is_compatible()
Is everything compatible with this version of GravityView?
include_legacy_frontend( $force=false)
Include more legacy stuff.
is_compatible_php()
Is this version of GravityView compatible with the current version of PHP?
static get_database_version()
Make sure the method exists, regardless of GF version.
activate()
Plugin activation function.
url( $path='/')
Retrieve a URL within the GravityView plugin directory.
load_textdomain()
Load the translations.
const GV_MIN_GF_VERSION
GravityView requires at least this version of Gravity Forms to function properly. ...
Definition: gravityview.php:45
const GV_MIN_PHP_VERSION
GravityView requires at least this version of PHP to function properly.
Definition: gravityview.php:69
const GV_MIN_WP_VERSION
GravityView requires at least this version of WordPress to function properly.
Definition: gravityview.php:57