ninja-forms.php 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081
  1. <?php
  2. // Exit if accessed directly
  3. if ( ! defined( 'ABSPATH' ) )
  4. exit;
  5. class Ninja_Forms {
  6. /**
  7. * @var Ninja_Forms
  8. * @since 2.7
  9. */
  10. private static $instance;
  11. /**
  12. * @var registered_notification_types
  13. */
  14. var $notification_types = array();
  15. /**
  16. * Main Ninja_Forms Instance
  17. *
  18. * Insures that only one instance of Ninja_Forms exists in memory at any one
  19. * time. Also prevents needing to define globals all over the place.
  20. *
  21. * @since 2.7
  22. * @static
  23. * @staticvar array $instance
  24. * @return The highlander Ninja_Forms
  25. */
  26. public static function instance() {
  27. if ( ! isset( self::$instance ) && ! ( self::$instance instanceof Ninja_Forms ) ) {
  28. self::$instance = new Ninja_Forms;
  29. self::$instance->setup_constants();
  30. self::$instance->includes();
  31. // Start our submissions custom post type class
  32. self::$instance->subs_cpt = new NF_Subs_CPT();
  33. // Add our registration class object
  34. self::$instance->register = new NF_Register();
  35. // The forms variable won't be interacted with directly.
  36. // Instead, the forms() methods will act as wrappers for it.
  37. self::$instance->forms = new NF_Forms();
  38. // Our session manager wrapper class
  39. self::$instance->session = new NF_Session();
  40. register_activation_hook( __FILE__, 'ninja_forms_activation' );
  41. add_action( 'plugins_loaded', array( self::$instance, 'load_lang' ) );
  42. add_action( 'init', array( self::$instance, 'init' ), 5 );
  43. add_action( 'admin_init', array( self::$instance, 'admin_init' ), 5 );
  44. add_action( 'update_option_ninja_forms_settings', array( self::$instance, 'refresh_plugin_settings' ), 10 );
  45. // add_action( 'admin_head', array( self::$instance, 'admin_head' ) );
  46. add_action( 'admin_notices', array( self::$instance, 'admin_notice' ) );
  47. }
  48. return self::$instance;
  49. }
  50. /**
  51. * Run all of our plugin stuff on init.
  52. * This allows filters and actions to be used by third-party classes.
  53. *
  54. * @since 2.7
  55. * @return void
  56. */
  57. public function init() {
  58. // The settings variable will hold our plugin settings.
  59. self::$instance->plugin_settings = self::$instance->get_plugin_settings();
  60. // The subs variable won't be interacted with directly.
  61. // Instead, the subs() methods will act as wrappers for it.
  62. self::$instance->subs = new NF_Subs();
  63. // Get our notifications up and running.
  64. self::$instance->notifications = new NF_Notifications();
  65. // Get our step processor up and running.
  66. // We only need this in the admin.
  67. if ( is_admin() ) {
  68. self::$instance->step_processing = new NF_Step_Processing();
  69. self::$instance->download_all_subs = new NF_Download_All_Subs();
  70. }
  71. // Fire our Ninja Forms init action.
  72. // This will allow other plugins to register items to the instance.
  73. do_action( 'nf_init', self::$instance );
  74. }
  75. /**
  76. * Run all of our plugin stuff on admin init.
  77. *
  78. * @since 2.7.4
  79. * @return void
  80. */
  81. public function admin_init() {
  82. // Check and update our version number.
  83. self::$instance->update_version_number();
  84. // Add our "Add Form" button and modal to the tinyMCE editor
  85. self::$instance->add_form_button = new NF_Admin_AddFormModal();
  86. // Get our admin notices up and running.
  87. self::$instance->notices = new NF_Notices();
  88. // Register our admin scripts
  89. self::$instance->register_admin_scripts();
  90. // Fire our Ninja Forms init action.
  91. do_action( 'nf_admin_init', self::$instance );
  92. }
  93. /**
  94. * Run some admin stuff on admin_notices hook.
  95. *
  96. * @since 2.9
  97. * @return void
  98. */
  99. public function admin_notice() {
  100. // Notices filter and run the notices function.
  101. $admin_notices = apply_filters( 'nf_admin_notices', array() );
  102. self::$instance->notices->admin_notice( $admin_notices );
  103. }
  104. /**
  105. * Throw error on object clone
  106. *
  107. * The whole idea of the singleton design pattern is that there is a single
  108. * object therefore, we don't want the object to be cloned.
  109. *
  110. * @since 2.7
  111. * @access protected
  112. * @return void
  113. */
  114. public function __clone() {
  115. // Cloning instances of the class is forbidden
  116. _doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?', 'ninja-forms' ), '2.8' );
  117. }
  118. /**
  119. * Disable unserializing of the class
  120. *
  121. * @since 2.7
  122. * @access protected
  123. * @return void
  124. */
  125. public function __wakeup() {
  126. // Unserializing instances of the class is forbidden
  127. _doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?', 'ninja-forms' ), '2.8' );
  128. }
  129. /**
  130. * Function that acts as a wrapper for our individual notification objects.
  131. * It checks to see if an object exists for this notification id.
  132. * If it does, it returns that object. Otherwise, it creates a new one and returns it.
  133. *
  134. * @access public
  135. * @param int $n_id
  136. * @since 2.8
  137. * @return object self::$instance->$n_var
  138. */
  139. public function notification( $n_id = '' ) {
  140. // Bail if we don't get a notification id.
  141. if ( '' == $n_id )
  142. return false;
  143. $n_var = 'notification_' . $n_id;
  144. // Check to see if an object for this notification already exists.
  145. // Create one if it doesn't exist.
  146. if ( ! isset ( self::$instance->$n_var ) )
  147. self::$instance->$n_var = new NF_Notification( $n_id );
  148. return self::$instance->$n_var;
  149. }
  150. /**
  151. * Function that acts as a wrapper for our individual sub objects.
  152. * It checks to see if an object exists for this sub id.
  153. * If it does, it returns that object. Otherwise, it creates a new one and returns it.
  154. *
  155. * @access public
  156. * @param int $sub_id
  157. * @since 2.7
  158. * @return object self::$instance->$sub_var
  159. */
  160. public function sub( $sub_id = '' ) {
  161. // Bail if we don't get a sub id.
  162. if ( $sub_id == '' )
  163. return false;
  164. $sub_var = 'sub_' . $sub_id;
  165. // Check to see if an object for this sub already exists.
  166. // Create one if it doesn't exist.
  167. if ( ! isset( self::$instance->$sub_var ) )
  168. self::$instance->$sub_var = new NF_Sub( $sub_id );
  169. return self::$instance->$sub_var;
  170. }
  171. /**
  172. * Function that acts as a wrapper for our subs_var - NF_Subs() class.
  173. * It doesn't set a sub_id and can be used to interact with methods that affect mulitple submissions
  174. *
  175. * @access public
  176. * @since 2.7
  177. * @return object self::$instance->subs_var
  178. */
  179. public function subs() {
  180. return self::$instance->subs;
  181. }
  182. /**
  183. * Function that acts as a wrapper for our form_var - NF_Form() class.
  184. * It sets the form_id and then returns the instance, which is now using the
  185. * proper form id
  186. *
  187. * @access public
  188. * @param int $form_id
  189. * @since 2.9.11
  190. * @return object self::$instance->form_var
  191. */
  192. public function form( $form_id = '' ) {
  193. // Bail if we don't get a form id.
  194. $form_var = 'form_' . $form_id;
  195. // Check to see if an object for this form already exists in memory. If it does, return it.
  196. if ( isset( self::$instance->$form_var ) )
  197. return self::$instance->$form_var;
  198. // Check to see if we have a transient object stored for this form.
  199. if ( is_object ( ( $form_obj = get_transient( 'nf_form_' . $form_id ) ) ) ) {
  200. self::$instance->$form_var = $form_obj;
  201. } else {
  202. // Create a new form object for this form.
  203. self::$instance->$form_var = new NF_Form( $form_id );
  204. // Save it into a transient.
  205. set_transient( 'nf_form_' . $form_id, self::$instance->$form_var, DAY_IN_SECONDS );
  206. }
  207. return self::$instance->$form_var;
  208. }
  209. /**
  210. * Function that acts as a wrapper for our forms_var - NF_Form() class.
  211. *
  212. * @access public
  213. * @since 2.9
  214. * @return object self::$instance->forms_var
  215. */
  216. public function forms( $form_id = '' ) {
  217. return self::$instance->forms;
  218. }
  219. /**
  220. * Setup plugin constants
  221. *
  222. * @access private
  223. * @since 2.7
  224. * @return void
  225. */
  226. private function setup_constants() {
  227. global $wpdb;
  228. // Plugin version
  229. if ( ! defined( 'NF_PLUGIN_VERSION' ) )
  230. define( 'NF_PLUGIN_VERSION', '3.3.16' );
  231. // Plugin Folder Path
  232. if ( ! defined( 'NF_PLUGIN_DIR' ) )
  233. define( 'NF_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
  234. // Plugin Folder URL
  235. if ( ! defined( 'NF_PLUGIN_URL' ) )
  236. define( 'NF_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
  237. // Plugin Root File
  238. if ( ! defined( 'NF_PLUGIN_FILE' ) )
  239. define( 'NF_PLUGIN_FILE', __FILE__ );
  240. // Objects table name
  241. if ( ! defined( 'NF_OBJECTS_TABLE_NAME') )
  242. define( 'NF_OBJECTS_TABLE_NAME', $wpdb->prefix . 'nf_objects' );
  243. // Meta table name
  244. if ( ! defined( 'NF_OBJECT_META_TABLE_NAME' ) )
  245. define( 'NF_OBJECT_META_TABLE_NAME', $wpdb->prefix . 'nf_objectmeta' );
  246. // Relationships table name
  247. if ( ! defined( 'NF_OBJECT_RELATIONSHIPS_TABLE_NAME' ) )
  248. define( 'NF_OBJECT_RELATIONSHIPS_TABLE_NAME', $wpdb->prefix . 'nf_relationships' );
  249. /* Legacy Definitions */
  250. // Ninja Forms debug mode
  251. if ( ! defined( 'NINJA_FORMS_JS_DEBUG' ) )
  252. define( 'NINJA_FORMS_JS_DEBUG', false );
  253. // Ninja Forms plugin directory
  254. if ( ! defined( 'NINJA_FORMS_DIR' ) )
  255. define( 'NINJA_FORMS_DIR', NF_PLUGIN_DIR );
  256. // Ninja Forms plugin url
  257. if ( ! defined( 'NINJA_FORMS_URL' ) )
  258. define( 'NINJA_FORMS_URL', NF_PLUGIN_URL );
  259. // Ninja Forms Version
  260. if ( ! defined( 'NINJA_FORMS_VERSION' ) )
  261. define( 'NINJA_FORMS_VERSION', NF_PLUGIN_VERSION );
  262. // Ninja Forms table name
  263. if ( ! defined( 'NINJA_FORMS_TABLE_NAME' ) )
  264. define( 'NINJA_FORMS_TABLE_NAME', $wpdb->prefix . 'ninja_forms' );
  265. // Fields table name
  266. if ( ! defined( 'NINJA_FORMS_FIELDS_TABLE_NAME' ) )
  267. define( 'NINJA_FORMS_FIELDS_TABLE_NAME', $wpdb->prefix . 'ninja_forms_fields' );
  268. // Fav fields table name
  269. if ( ! defined( 'NINJA_FORMS_FAV_FIELDS_TABLE_NAME' ) )
  270. define( 'NINJA_FORMS_FAV_FIELDS_TABLE_NAME', $wpdb->prefix . 'ninja_forms_fav_fields' );
  271. // Subs table name
  272. if ( ! defined( 'NINJA_FORMS_SUBS_TABLE_NAME' ) )
  273. define( 'NINJA_FORMS_SUBS_TABLE_NAME', $wpdb->prefix . 'ninja_forms_subs' );
  274. }
  275. /**
  276. * Include our Class files
  277. *
  278. * @access private
  279. * @since 2.7
  280. * @return void
  281. */
  282. private function includes() {
  283. // Include our session manager
  284. require_once( NF_PLUGIN_DIR . 'classes/session.php' );
  285. // Include our sub object.
  286. require_once( NF_PLUGIN_DIR . 'classes/sub.php' );
  287. // Include our subs object.
  288. require_once( NF_PLUGIN_DIR . 'classes/subs.php' );
  289. // Include our subs CPT.
  290. require_once( NF_PLUGIN_DIR . 'classes/subs-cpt.php' );
  291. // Include our form object.
  292. require_once( NF_PLUGIN_DIR . 'classes/form.php' );
  293. // Include our form sobject.
  294. require_once( NF_PLUGIN_DIR . 'classes/forms.php' );
  295. // Include our field, notification, and sidebar registration class.
  296. require_once( NF_PLUGIN_DIR . 'classes/register.php' );
  297. // Include our 'nf_action' watcher.
  298. require_once( NF_PLUGIN_DIR . 'includes/actions.php' );
  299. // Include our single notification object
  300. require_once( NF_PLUGIN_DIR . 'classes/notification.php' );
  301. // Include our notifications object
  302. require_once( NF_PLUGIN_DIR . 'classes/notifications.php' );
  303. // Include our notification table object
  304. require_once( NF_PLUGIN_DIR . 'classes/notifications-table.php' );
  305. // Include our base notification type
  306. require_once( NF_PLUGIN_DIR . 'classes/notification-base-type.php' );
  307. // Include add form button and modal
  308. require_once( NF_PLUGIN_DIR . 'classes/add-form-modal.php' );
  309. if ( is_admin () ) {
  310. // Include our step processing stuff if we're in the admin.
  311. require_once( NF_PLUGIN_DIR . 'includes/admin/step-processing.php' );
  312. require_once( NF_PLUGIN_DIR . 'classes/step-processing.php' );
  313. // Include our download all submissions php files
  314. require_once( NF_PLUGIN_DIR . 'classes/download-all-subs.php' );
  315. $upgraded_from = get_option( 'nf_version_upgraded_from', FALSE );
  316. if( $upgraded_from && version_compare( $upgraded_from, '2.9', '<=') ) {
  317. // Include Upgrade Base Class
  318. require_once( NF_PLUGIN_DIR . 'includes/admin/upgrades/class-upgrade.php');
  319. // Include Upgrades
  320. require_once( NF_PLUGIN_DIR . 'includes/admin/upgrades/upgrade-functions.php' );
  321. require_once( NF_PLUGIN_DIR . 'includes/admin/upgrades/upgrades.php' );
  322. require_once( NF_PLUGIN_DIR . 'includes/admin/upgrades/convert-forms-reset.php' );
  323. // Include Upgrade Handler
  324. require_once( NF_PLUGIN_DIR . 'includes/admin/upgrades/upgrade-handler-page.php');
  325. require_once( NF_PLUGIN_DIR . 'includes/admin/upgrades/class-upgrade-handler.php');
  326. }
  327. }
  328. // Include our upgrade files.
  329. require_once( NF_PLUGIN_DIR . 'includes/admin/welcome.php' );
  330. // Include deprecated functions and filters.
  331. require_once( NF_PLUGIN_DIR . 'includes/deprecated.php' );
  332. /* Legacy includes */
  333. /* Require Core Files */
  334. require_once( NINJA_FORMS_DIR . "/includes/ninja-settings.php" );
  335. require_once( NINJA_FORMS_DIR . "/includes/database.php" );
  336. require_once( NINJA_FORMS_DIR . "/includes/functions.php" );
  337. require_once( NINJA_FORMS_DIR . "/includes/activation.php" );
  338. require_once( NINJA_FORMS_DIR . "/includes/register.php" );
  339. require_once( NINJA_FORMS_DIR . "/includes/shortcode.php" );
  340. require_once( NINJA_FORMS_DIR . "/includes/widget.php" );
  341. require_once( NINJA_FORMS_DIR . "/includes/field-type-groups.php" );
  342. require_once( NINJA_FORMS_DIR . "/includes/eos.class.php" );
  343. require_once( NINJA_FORMS_DIR . "/includes/from-setting-check.php" );
  344. require_once( NINJA_FORMS_DIR . "/includes/reply-to-check.php" );
  345. require_once( NINJA_FORMS_DIR . "/includes/import-export.php" );
  346. require_once( NINJA_FORMS_DIR . "/includes/display/scripts.php" );
  347. require_once( NINJA_FORMS_DIR . "/includes/display/upgrade-functions.php" );
  348. // Include Processing Functions if a form has been submitted.
  349. require_once( NINJA_FORMS_DIR . "/includes/display/processing/class-ninja-forms-processing.php" );
  350. require_once( NINJA_FORMS_DIR . "/includes/display/processing/class-display-loading.php" );
  351. require_once( NINJA_FORMS_DIR . "/includes/display/processing/pre-process.php" );
  352. require_once( NINJA_FORMS_DIR . "/includes/display/processing/process.php" );
  353. require_once( NINJA_FORMS_DIR . "/includes/display/processing/post-process.php" );
  354. require_once( NINJA_FORMS_DIR . "/includes/display/processing/save-sub.php" );
  355. require_once( NINJA_FORMS_DIR . "/includes/display/processing/filter-msgs.php" );
  356. require_once( NINJA_FORMS_DIR . "/includes/display/processing/fields-pre-process.php" );
  357. require_once( NINJA_FORMS_DIR . "/includes/display/processing/fields-process.php" );
  358. require_once( NINJA_FORMS_DIR . "/includes/display/processing/fields-post-process.php" );
  359. require_once( NINJA_FORMS_DIR . "/includes/display/processing/req-fields-pre-process.php" );
  360. require_once( NINJA_FORMS_DIR . "/includes/display/processing/honeypot.php" );
  361. //Display Form Functions
  362. require_once( NINJA_FORMS_DIR . "/includes/display/form/display-form.php" );
  363. require_once( NINJA_FORMS_DIR . "/includes/display/form/not-logged-in.php" );
  364. require_once( NINJA_FORMS_DIR . "/includes/display/fields/display-fields.php" );
  365. require_once( NINJA_FORMS_DIR . "/includes/display/form/response-message.php" );
  366. require_once( NINJA_FORMS_DIR . "/includes/display/fields/label.php" );
  367. require_once( NINJA_FORMS_DIR . "/includes/display/fields/help.php" );
  368. require_once( NINJA_FORMS_DIR . "/includes/display/fields/desc.php" );
  369. require_once( NINJA_FORMS_DIR . "/includes/display/form/form-title.php" );
  370. require_once( NINJA_FORMS_DIR . "/includes/display/fields/field-error-message.php" );
  371. require_once( NINJA_FORMS_DIR . "/includes/display/form/form-wrap.php" );
  372. require_once( NINJA_FORMS_DIR . "/includes/display/form/form-cont.php" );
  373. require_once( NINJA_FORMS_DIR . "/includes/display/form/fields-wrap.php" );
  374. require_once( NINJA_FORMS_DIR . "/includes/display/form/required-label.php" );
  375. require_once( NINJA_FORMS_DIR . "/includes/display/form/open-form-tag.php" );
  376. require_once( NINJA_FORMS_DIR . "/includes/display/form/close-form-tag.php" );
  377. require_once( NINJA_FORMS_DIR . "/includes/display/form/hidden-fields.php" );
  378. require_once( NINJA_FORMS_DIR . "/includes/display/form/form-visibility.php" );
  379. require_once( NINJA_FORMS_DIR . "/includes/display/form/sub-limit.php" );
  380. require_once( NINJA_FORMS_DIR . "/includes/display/form/nonce.php" );
  381. require_once( NINJA_FORMS_DIR . "/includes/display/form/honeypot.php" );
  382. require_once( NINJA_FORMS_DIR . "/includes/display/fields/restore-progress.php" );
  383. require_once( NINJA_FORMS_DIR . "/includes/display/fields/inside-label-hidden.php" );
  384. require_once( NINJA_FORMS_DIR . "/includes/display/fields/field-type.php" );
  385. require_once( NINJA_FORMS_DIR . "/includes/display/fields/default-value-filter.php" );
  386. require_once( NINJA_FORMS_DIR . "/includes/display/fields/calc-field-class.php" );
  387. require_once( NINJA_FORMS_DIR . "/includes/display/fields/clear-complete.php" );
  388. //Require EDD autoupdate file
  389. if( !class_exists( 'EDD_SL_Plugin_Updater' ) ) {
  390. // load our custom updater if it doesn't already exist
  391. require_once(NINJA_FORMS_DIR."/includes/EDD_SL_Plugin_Updater.php");
  392. }
  393. require_once( NINJA_FORMS_DIR . "/includes/class-extension-updater.php" );
  394. require_once( NINJA_FORMS_DIR . "/includes/admin/scripts.php" );
  395. require_once( NINJA_FORMS_DIR . "/includes/admin/sidebar.php" );
  396. require_once( NINJA_FORMS_DIR . "/includes/admin/tabs.php" );
  397. require_once( NINJA_FORMS_DIR . "/includes/admin/post-metabox.php" );
  398. require_once( NINJA_FORMS_DIR . "/includes/admin/ajax.php" );
  399. require_once( NINJA_FORMS_DIR . "/includes/admin/admin.php" );
  400. require_once( NINJA_FORMS_DIR . "/includes/admin/sidebar-fields.php" );
  401. require_once( NINJA_FORMS_DIR . "/includes/admin/display-screen-options.php" );
  402. require_once( NINJA_FORMS_DIR . "/includes/admin/register-screen-options.php" );
  403. require_once( NINJA_FORMS_DIR . "/includes/admin/register-screen-help.php" );
  404. require_once( NINJA_FORMS_DIR . "/includes/admin/output-tab-metabox.php" );
  405. require_once( NINJA_FORMS_DIR . "/includes/admin/form-preview.php" );
  406. require_once( NINJA_FORMS_DIR . "/classes/notices-class.php" );
  407. require_once( NINJA_FORMS_DIR . "/includes/admin/notices.php" );
  408. //Edit Field Functions
  409. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/edit-field.php" );
  410. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/label.php" );
  411. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/placeholder.php" );
  412. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/hr.php" );
  413. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/req.php" );
  414. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/custom-class.php" );
  415. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/help.php" );
  416. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/desc.php" );
  417. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/li.php" );
  418. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/remove-button.php" );
  419. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/save-button.php" );
  420. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/calc.php" );
  421. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/user-info-fields.php" );
  422. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/post-meta-values.php" );
  423. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/input-limit.php" );
  424. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/sub-settings.php" );
  425. require_once( NINJA_FORMS_DIR . "/includes/admin/edit-field/autocomplete-off.php" );
  426. /* * * * ninja-forms - Main Form Editing Page
  427. /* Tabs */
  428. /* Form List */
  429. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/form-list/form-list.php" );
  430. /* Form Settings */
  431. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/form-settings/form-settings.php" );
  432. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/form-settings/help.php" );
  433. /* Field Settings */
  434. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/field-settings/field-settings.php" );
  435. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/field-settings/empty-rte.php" );
  436. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/field-settings/edit-field-ul.php" );
  437. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/field-settings/help.php" );
  438. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/field-settings/sidebars/def-fields.php" );
  439. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/field-settings/sidebars/fav-fields.php" );
  440. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/field-settings/sidebars/template-fields.php" );
  441. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/field-settings/sidebars/layout-fields.php" );
  442. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/field-settings/sidebars/user-info.php" );
  443. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/field-settings/sidebars/payment-fields.php" );
  444. /* Form Preview */
  445. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms/tabs/form-preview/form-preview.php" );
  446. /* * * * ninja-forms-settings - Settings Page
  447. /* Tabs */
  448. /* General Settings */
  449. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms-settings/tabs/general-settings/general-settings.php" );
  450. /* Label Settings */
  451. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms-settings/tabs/label-settings/label-settings.php" );
  452. /* License Settings */
  453. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms-settings/tabs/license-settings/license-settings.php" );
  454. /* * * * ninja-forms-impexp - Import / Export Page
  455. /* Tabs */
  456. /* Import / Export Forms */
  457. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms-impexp/tabs/impexp-forms/impexp-forms.php" );
  458. /* Import / Export Fields */
  459. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms-impexp/tabs/impexp-fields/impexp-fields.php" );
  460. /* Import / Export Submissions */
  461. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms-impexp/tabs/impexp-subs/impexp-subs.php" );
  462. /* Backup / Restore */
  463. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms-impexp/tabs/impexp-backup/impexp-backup.php" );
  464. /* * * * ninja-forms-subs - Submissions Review Page
  465. /* Tabs */
  466. /* * * ninja-forms-addons - Addons Manager Page
  467. /* Tabs */
  468. /* Manage Addons */
  469. require_once( NINJA_FORMS_DIR . "/includes/admin/pages/ninja-forms-addons/tabs/addons/addons.php" );
  470. /* System Status */
  471. require_once( NINJA_FORMS_DIR . "/includes/classes/class-nf-system-status.php" );
  472. /* Require Pre-Registered Fields */
  473. require_once( NINJA_FORMS_DIR . "/includes/fields/textbox.php" );
  474. require_once( NINJA_FORMS_DIR . "/includes/fields/checkbox.php" );
  475. require_once( NINJA_FORMS_DIR . "/includes/fields/list.php" );
  476. require_once( NINJA_FORMS_DIR . "/includes/fields/hidden.php" );
  477. require_once( NINJA_FORMS_DIR . "/includes/fields/organizer.php" );
  478. require_once( NINJA_FORMS_DIR . "/includes/fields/submit.php" );
  479. require_once( NINJA_FORMS_DIR . "/includes/fields/spam.php" );
  480. require_once( NINJA_FORMS_DIR . "/includes/fields/timed-submit.php" );
  481. require_once( NINJA_FORMS_DIR . "/includes/fields/hr.php" );
  482. require_once( NINJA_FORMS_DIR . "/includes/fields/desc.php" );
  483. require_once( NINJA_FORMS_DIR . "/includes/fields/textarea.php" );
  484. require_once( NINJA_FORMS_DIR . "/includes/fields/password.php" );
  485. require_once( NINJA_FORMS_DIR . "/includes/fields/rating.php" );
  486. require_once( NINJA_FORMS_DIR . "/includes/fields/calc.php" );
  487. require_once( NINJA_FORMS_DIR . "/includes/fields/country.php" );
  488. require_once( NINJA_FORMS_DIR . "/includes/fields/tax.php" );
  489. require_once( NINJA_FORMS_DIR . "/includes/fields/credit-card.php" );
  490. require_once( NINJA_FORMS_DIR . "/includes/fields/number.php" );
  491. require_once( NINJA_FORMS_DIR . "/includes/fields/recaptcha.php" );
  492. require_once( NINJA_FORMS_DIR . "/includes/admin/save.php" );
  493. }
  494. /**
  495. * Load our language files
  496. *
  497. * @access public
  498. * @since 2.7
  499. * @return void
  500. */
  501. public function load_lang() {
  502. /** Set our unique textdomain string */
  503. $textdomain = 'ninja-forms';
  504. /** The 'plugin_locale' filter is also used by default in load_plugin_textdomain() */
  505. $locale = apply_filters( 'plugin_locale', get_locale(), $textdomain );
  506. /** Set filter for WordPress languages directory */
  507. $wp_lang_dir = apply_filters(
  508. 'ninja_forms_wp_lang_dir',
  509. WP_LANG_DIR . '/ninja-forms/' . $textdomain . '-' . $locale . '.mo'
  510. );
  511. /** Translations: First, look in WordPress' "languages" folder = custom & update-secure! */
  512. load_textdomain( $textdomain, $wp_lang_dir );
  513. /** Translations: Secondly, look in plugin's "lang" folder = default */
  514. $plugin_dir = trailingslashit( basename( dirname( dirname( __FILE__ ) ) ) ) . basename( dirname( __FILE__ ) );
  515. $lang_dir = apply_filters( 'ninja_forms_lang_dir', $plugin_dir . '/lang/' );
  516. load_plugin_textdomain( $textdomain, FALSE, $lang_dir );
  517. }
  518. /**
  519. * Update our version number if necessary
  520. *
  521. * @access public
  522. * @since 2.7
  523. * @return void
  524. */
  525. public function update_version_number(){
  526. $plugin_settings = nf_get_settings();
  527. if ( !isset ( $plugin_settings['version'] ) OR ( NF_PLUGIN_VERSION != $plugin_settings['version'] ) ) {
  528. $plugin_settings['version'] = NF_PLUGIN_VERSION;
  529. update_option( 'ninja_forms_settings', $plugin_settings );
  530. }
  531. }
  532. /**
  533. * Set Ninja_Forms()->session variable used for storing items in transient variables
  534. *
  535. * @access public
  536. * @since 2.7
  537. * @return string $t_id;
  538. */
  539. public function set_transient_id(){
  540. $transient_id = $this->session->get( 'nf_transient_id' );
  541. if ( ! $transient_id && ! is_admin() ) {
  542. $transient_id = ninja_forms_random_string();
  543. // Make sure that our transient ID isn't currently in use.
  544. while ( get_transient( $transient_id ) !== false ) {
  545. $_id = ninja_forms_random_string();
  546. }
  547. $this->session->set( 'nf_transient_id', $transient_id );
  548. }
  549. return $transient_id;
  550. }
  551. /**
  552. * Get our plugin settings.
  553. *
  554. * @access public
  555. * @since 2.9
  556. * @return array $settings
  557. */
  558. public function get_plugin_settings() {
  559. $settings = apply_filters( "ninja_forms_settings", get_option( "ninja_forms_settings" ) );
  560. $settings['date_format'] = isset ( $settings['date_format'] ) ? $settings['date_format'] : 'd/m/Y';
  561. $settings['currency_symbol'] = isset ( $settings['currency_symbol'] ) ? $settings['currency_symbol'] : '$';
  562. $settings['recaptcha_lang'] = isset ( $settings['recaptcha_lang'] ) ? $settings['recaptcha_lang'] : 'en';
  563. $settings['req_div_label'] = isset ( $settings['req_div_label'] ) ? $settings['req_div_label'] : sprintf( __( 'Fields marked with an %s*%s are required', 'ninja-forms' ), '<span class="ninja-forms-req-symbol">','</span>' );
  564. $settings['req_field_symbol'] = isset ( $settings['req_field_symbol'] ) ? $settings['req_field_symbol'] : '<strong>*</strong>';
  565. $settings['req_error_label'] = isset ( $settings['req_error_label'] ) ? $settings['req_error_label'] : __( 'Please ensure all required fields are completed.', 'ninja-forms' );
  566. $settings['req_field_error'] = isset ( $settings['req_field_error'] ) ? $settings['req_field_error'] : __( 'This is a required field', 'ninja-forms' );
  567. $settings['spam_error'] = isset ( $settings['spam_error'] ) ? $settings['spam_error'] : __( 'Please answer the anti-spam question correctly.', 'ninja-forms' );
  568. $settings['honeypot_error'] = isset ( $settings['honeypot_error'] ) ? $settings['honeypot_error'] : __( 'Please leave the spam field blank.', 'ninja-forms' );
  569. $settings['timed_submit_error'] = isset ( $settings['timed_submit_error'] ) ? $settings['timed_submit_error'] : __( 'Please wait to submit the form.', 'ninja-forms' );
  570. $settings['javascript_error'] = isset ( $settings['javascript_error'] ) ? $settings['javascript_error'] : __( 'You cannot submit the form without Javascript enabled.', 'ninja-forms' );
  571. $settings['invalid_email'] = isset ( $settings['invalid_email'] ) ? $settings['invalid_email'] : __( 'Please enter a valid email address.', 'ninja-forms' );
  572. $settings['process_label'] = isset ( $settings['process_label'] ) ? $settings['process_label'] : __( 'Processing', 'ninja-forms' );
  573. $settings['password_mismatch'] = isset ( $settings['password_mismatch'] ) ? $settings['password_mismatch'] : __( 'The passwords provided do not match.', 'ninja-forms' );
  574. $settings['date_format'] = apply_filters( 'ninja_forms_labels/date_format' , $settings['date_format'] );
  575. $settings['currency_symbol'] = apply_filters( 'ninja_forms_labels/currency_symbol' , $settings['currency_symbol'] );
  576. $settings['req_div_label'] = apply_filters( 'ninja_forms_labels/req_div_label' , $settings['req_div_label'] );
  577. $settings['req_field_symbol'] = apply_filters( 'ninja_forms_labels/req_field_symbol' , $settings['req_field_symbol'] );
  578. $settings['req_error_label'] = apply_filters( 'ninja_forms_labels/req_error_label' , $settings['req_error_label'] );
  579. $settings['req_field_error'] = apply_filters( 'ninja_forms_labels/req_field_error' , $settings['req_field_error'] );
  580. $settings['spam_error'] = apply_filters( 'ninja_forms_labels/spam_error' , $settings['spam_error'] );
  581. $settings['honeypot_error'] = apply_filters( 'ninja_forms_labels/honeypot_error' , $settings['honeypot_error'] );
  582. $settings['timed_submit_error'] = apply_filters( 'ninja_forms_labels/timed_submit_error' , $settings['timed_submit_error'] );
  583. $settings['javascript_error'] = apply_filters( 'ninja_forms_labels/javascript_error' , $settings['javascript_error'] );
  584. $settings['invalid_email'] = apply_filters( 'ninja_forms_labels/invalid_email' , $settings['invalid_email'] );
  585. $settings['process_label'] = apply_filters( 'ninja_forms_labels/process_label' , $settings['process_label'] );
  586. $settings['password_mismatch'] = apply_filters( 'ninja_forms_labels/password_mismatch' , $settings['password_mismatch'] );
  587. return $settings;
  588. }
  589. /**
  590. * Refresh our plugin settings if we update the ninja_forms_settings option
  591. *
  592. * @access public
  593. * @since 2.9
  594. * @return void
  595. */
  596. public function refresh_plugin_settings() {
  597. self::$instance->plugin_settings = self::$instance->get_plugin_settings();
  598. }
  599. /**
  600. * Register our admin scripts so that they can be enqueued later.
  601. * @since 2.9.25
  602. * @return void
  603. */
  604. public function register_admin_scripts() {
  605. if ( defined( 'NINJA_FORMS_JS_DEBUG' ) && NINJA_FORMS_JS_DEBUG ) {
  606. $suffix = '';
  607. $src = 'dev';
  608. } else {
  609. $suffix = '.min';
  610. $src = 'min';
  611. }
  612. wp_register_script( 'nf-admin-modal',
  613. NF_PLUGIN_URL . 'assets/js/' . $src . '/admin-modal' . $suffix . '.js',
  614. array( 'jquery', 'jquery-ui-core' ) );
  615. }
  616. } // End Class
  617. /**
  618. * The main function responsible for returning The Highlander Ninja_Forms
  619. * Instance to functions everywhere.
  620. *
  621. * Use this function like you would a global variable, except without needing
  622. * to declare the global.
  623. *
  624. * Example: <?php $nf = Ninja_Forms(); ?>
  625. *
  626. * @since 2.7
  627. * @return object The Highlander Ninja_Forms Instance
  628. */
  629. function Ninja_Forms() {
  630. return Ninja_Forms::instance();
  631. }
  632. Ninja_Forms();
  633. function nf_aff_link( $link ){
  634. $u_id = apply_filters( 'ninja_forms_affiliate_id', false );
  635. $u_id = get_option( 'nf_aff', $u_id );
  636. if ( $u_id ) {
  637. $link = 'http://www.shareasale.com/r.cfm?u=' . $u_id . '&b=812237&m=63061&afftrack=&urllink=' . urlencode( $link );
  638. }
  639. return $link;
  640. }
  641. /*
  642. |--------------------------------------------------------------------------
  643. | Ninja Forms THREE Upgrade
  644. |--------------------------------------------------------------------------
  645. */
  646. add_action( 'wp_ajax_nfThreeUpgrade_GetSerializedForm', 'nfThreeUpgrade_GetSerializedForm' );
  647. function nfThreeUpgrade_GetSerializedForm(){
  648. $id = absint( $_POST[ 'formID' ] );
  649. $form_row = ninja_forms_serialize_form( $id );
  650. echo json_encode( array( 'id' => $id, 'serialized' => $form_row ) );
  651. wp_die();
  652. }
  653. add_action( 'wp_ajax_nfThreeUpgrade_GetSerializedFields', 'nfThreeUpgrade_GetSerializedFields' );
  654. function nfThreeUpgrade_GetSerializedFields(){
  655. $fields = ninja_forms_get_all_favs();
  656. echo json_encode( array( 'serialized' => maybe_serialize( $fields ) ) ) ;
  657. wp_die();
  658. }
  659. add_action( 'init', 'ninja_forms_three_submenu', 9 ); // Register before general settings.
  660. function ninja_forms_three_submenu(){
  661. include plugin_dir_path( __FILE__ ) . 'upgrade/class-submenu.php';
  662. }
  663. add_action( 'admin_notices', 'ninja_forms_three_admin_notice' );
  664. function ninja_forms_three_admin_notice(){
  665. $settings = Ninja_Forms()->get_plugin_settings();
  666. if( isset( $settings[ 'disable_admin_notices' ] ) && $settings[ 'disable_admin_notices' ] ) return;
  667. if ( get_option( 'ninja_forms_has_invalid_addons' ) ) return;
  668. $currentScreen = get_current_screen();
  669. if( ! in_array( $currentScreen->id, array( 'toplevel_page_ninja-forms' ) ) ) return;
  670. wp_enqueue_style( 'nf-admin-notices', NINJA_FORMS_URL .'assets/css/admin-notices.css?nf_ver=' . NF_PLUGIN_VERSION );
  671. if( ! isset( $_GET[ 'nf-rollback' ] ) ){
  672. if( ninja_forms_three_addons_version_check() && ninja_forms_three_addons_check() ){
  673. ?>
  674. <div id="nf-admin-notice-upgrade" class="update-nag nf-admin-notice">
  675. <div class="nf-notice-logo"></div>
  676. <p class="nf-notice-title">Achievement Unlocked</p>
  677. <p class="nf-notice-body">
  678. Cowabunga! You just unlocked Ninja Forms THREE.
  679. </p>
  680. <ul class="nf-notice-body nf-red">
  681. <li><span class="dashicons dashicons-awards"></span><a href="<?php echo admin_url( 'admin.php?page=ninja-forms-three' ); ?>">Upgrade to THREE</a></li>
  682. </ul>
  683. </div>
  684. <?php
  685. } else {
  686. include plugin_dir_path( __FILE__ ) . 'upgrade/tmpl-notice.html.php';
  687. $three_link = nf_aff_link( 'https://ninjaforms.com/three/?utm_medium=plugin&utm_source=admin-notice&utm_campaign=Ninja+Forms+THREE&utm_content=Learn+More' );
  688. ?>
  689. <div id="nf-admin-notice-three-is-coming" class="update-nag nf-admin-notice">
  690. <div class="nf-notice-logo"></div>
  691. <p class="nf-notice-title">THREE is coming! </p>
  692. <p class="nf-notice-body">A major update is coming to Ninja Forms. <a target="_blank"
  693. href="<?php echo $three_link; ?>">Learn
  694. more about new features, backwards compatibility, and more Frequently Asked Questions.</a></p>
  695. </div>
  696. <?php
  697. }
  698. } else {
  699. ?>
  700. <div id="nf-admin-notice-upgrade" class="update-nag nf-admin-notice">
  701. <div class="nf-notice-logo"></div>
  702. <p class="nf-notice-title">Rollback Restored</p>
  703. <p class="nf-notice-body">
  704. Your forms have been restored to the state prior to the upgrade.
  705. </p>
  706. <ul class="nf-notice-body nf-red">
  707. <li><span class="dashicons dashicons-sos"></span><a href="https://ninjaforms.com/contact/?utm_medium=plugin&utm_source=admin-notice&utm_campaign=Ninja+Forms+Rollback&utm_content=Ninja+Forms+Support" target="_blank">Contact Support</a></li>
  708. </ul>
  709. </div>
  710. <?php
  711. }
  712. }
  713. add_action( 'nf_admin_before_form_list', 'ninja_forms_konami' );
  714. function ninja_forms_konami(){
  715. if( ! ninja_forms_three_addons_version_check() ) return;
  716. wp_enqueue_script( 'cheet', NINJA_FORMS_URL . 'assets/js/lib/cheet.min.js', array( 'jquery' ) );
  717. wp_enqueue_script( 'howler', NINJA_FORMS_URL . 'assets/js/lib/howler.core.min.js', array( 'jquery' ) );
  718. wp_localize_script( 'howler', 'nfUnlock', array( 'audioUrl' => NINJA_FORMS_URL . 'assets/audio/smw_power_up.wav', 'aboutPage' => menu_page_url( 'ninja-forms-three', false ) ) );
  719. ?>
  720. <script type="text/javascript">
  721. jQuery( document ).ready( function() {
  722. var sound = new Howl({
  723. src: [ nfUnlock.audioUrl ],
  724. onend: function() {
  725. window.scrollTo( 0, 0 );
  726. jQuery( '#nf-admin-notice-three-is-coming' ).fadeOut( 'slow', function() {
  727. jQuery( '#nf-admin-notice-upgrade' ).fadeIn( 'slow', function() {
  728. window.location = nfUnlock.aboutPage;
  729. });
  730. });
  731. }
  732. });
  733. cheet('↑ ↑ ↓ ↓ ← → ← → b a', function () {
  734. sound.play();
  735. });
  736. } );
  737. </script>
  738. <?php
  739. }
  740. function ninja_forms_three_addons_version_check(){
  741. // $items = wp_remote_get( 'https://ninjaforms.com/?extend_feed=jlhrbgf89734go7387o4g3h' );
  742. // $items = wp_remote_retrieve_body( $items );
  743. $items = file_get_contents( dirname( __FILE__ ) . '/addons-feed.json' );
  744. $items = json_decode( $items, true );
  745. if( is_array( $items ) ) {
  746. foreach ($items as $item) {
  747. if (empty($item['plugin'])) continue;
  748. if (!file_exists(WP_PLUGIN_DIR . '/' . $item['plugin'])) continue;
  749. $plugin_data = get_plugin_data(WP_PLUGIN_DIR . '/' . $item['plugin'], false, true);
  750. if (!$plugin_data['Version']) continue;
  751. if (version_compare($plugin_data['Version'], '3', '>=')) continue;
  752. /*
  753. * There are non-compatible add-ons installed.
  754. */
  755. return FALSE;
  756. }
  757. }
  758. return TRUE;
  759. }
  760. function ninja_forms_three_addons_check(){
  761. // Assume we have no add-ons.
  762. $has_addons = FALSE;
  763. // If get_plugins is undefined...
  764. if ( ! function_exists( 'get_plugins' ) ) {
  765. // Require the core file.
  766. require_once ABSPATH . 'wp-admin/includes/plugin.php';
  767. }
  768. // Get a list of plugins.
  769. $plugins = get_plugins();
  770. $not_ours = array();
  771. // For each plugin...
  772. foreach( $plugins as $plugin => $data ){
  773. // If this isn't Ninja Forms Core...
  774. // AND If it includes a ninja-forms prefix...
  775. if ( 'ninja-forms/ninja-forms.php' != $plugin && 0 === strncmp( $plugin, 'ninja-forms-', 12 ) ){
  776. // Get the plugin slug.
  777. $slug = explode( '/', $plugin );
  778. // If the plugin is not active...
  779. // Exit early.
  780. if ( ! is_plugin_active( $plugin ) ) continue;
  781. // If the plugin is not in our list...
  782. if ( ! ninja_forms_valid_slug( $slug[ 0 ] ) ) {
  783. // Add it onto our array of data
  784. $not_ours[ $plugin ] = $data;
  785. } // Otherwise... (It is in our list.)
  786. else {
  787. // There are add-ons installed.
  788. $has_addons = TRUE;
  789. // If the plugin version is not compatible with 3.0...
  790. if ( version_compare( $data[ 'Version' ], '3', '<' ) ) {
  791. // There are non-compatible add-ons installed.
  792. return FALSE;
  793. }
  794. }
  795. }
  796. }
  797. // $display = __( 'However, the following plugins are not compatible with Ninja Forms Three and could lead to issues with the upgrade process. Please deactivate and remove the following before attempting to upgrade:', 'ninja-forms' ) . '<br />';
  798. // foreach( $not_ours as $plugin ) {
  799. // $display .= $plugin[ 'Name' ] . ', ';
  800. // }
  801. // $display = substr( $display, 0, strlen( $display ) - 2 );
  802. // If we have invalid add-ons...
  803. if ( ! empty( $not_ours ) ) {
  804. // Setup our option.
  805. update_option( 'ninja_forms_has_invalid_addons', 1 );
  806. } // Otherwise... (We don't have invalid add-ons.)
  807. else {
  808. // Remove our option.
  809. update_option( 'ninja_forms_has_invalid_addons', 0 );
  810. }
  811. return $has_addons;
  812. }
  813. function ninja_forms_valid_slug( $slug ) {
  814. // Declare a list of expected slugs.
  815. $nf_slugs = array(
  816. // Release slugs.
  817. 'ninja-forms-aweber',
  818. 'ninja-forms-campaign-monitor',
  819. 'ninja-forms-capsule-crm',
  820. 'ninja-forms-cleverreach',
  821. 'ninja-forms-clicksend',
  822. 'ninja-forms-conditionals',
  823. 'ninja-forms-constant-contact',
  824. 'ninja-forms-elavon-payment-gateway',
  825. 'ninja-forms-emma',
  826. 'ninja-forms-excel-export',
  827. 'ninja-forms-uploads',
  828. 'ninja-forms-insightly-crm',
  829. 'ninja-forms-style',
  830. 'ninja-forms-mail-chimp',
  831. 'ninja-forms-multi-part',
  832. 'ninja-forms-paypal-express',
  833. 'ninja-forms-pdf-submissions',
  834. 'ninja-forms-post-creation',
  835. 'ninja-forms-salesforce-crm',
  836. 'ninja-forms-sendy',
  837. 'ninja-forms-slack',
  838. 'ninja-forms-stripe',
  839. 'ninja-forms-trello',
  840. 'ninja-forms-webhooks',
  841. 'ninja-forms-webmerge',
  842. 'ninja-forms-zapier',
  843. 'ninja-forms-zoho-crm',
  844. // Developer slugs.
  845. 'ninja-forms-conditional-logic',
  846. 'ninja-forms-layout-styles',
  847. );
  848. // If the slug matches...
  849. if ( in_array( $slug, $nf_slugs ) ) {
  850. return true;
  851. }
  852. // Otherwise...
  853. return false;
  854. }
  855. /*
  856. |--------------------------------------------------------------------------
  857. | Uninstall Hook
  858. |--------------------------------------------------------------------------
  859. */
  860. register_uninstall_hook( __FILE__, 'ninja_forms_uninstall' );
  861. function ninja_forms_uninstall(){
  862. global $wpdb;
  863. $settings = Ninja_Forms()->get_plugin_settings();
  864. // Bail if we haven't checked the "delete on uninstall" box.
  865. if (isset ($settings['delete_on_uninstall']) && 1 == $settings['delete_on_uninstall']) {
  866. // Remove our options.
  867. delete_option('ninja_forms_settings');
  868. delete_option('nf_version_upgraded_from');
  869. delete_option('nf_upgrade_notice');
  870. delete_option('nf_database_migrations');
  871. delete_option('nf_convert_notifications_forms');
  872. delete_option('nf_convert_notifications_complete');
  873. delete_option('nf_convert_subs_step');
  874. delete_option('nf_email_fav_updated');
  875. delete_option('nf_update_email_settings_complete');
  876. delete_option('nf_converted_subs');
  877. delete_option('nf_convert_subs_num');
  878. delete_option('nf_convert_subs_step');
  879. delete_option('nf_converted_forms');
  880. delete_option('nf_converted_form_reset');
  881. delete_option('nf_convert_forms_complete');
  882. // Remove upgrade last step options
  883. require_once( NF_PLUGIN_DIR . 'includes/admin/upgrades/class-upgrade.php');
  884. require_once( NF_PLUGIN_DIR . 'includes/admin/upgrades/upgrade-functions.php' );
  885. require_once( NF_PLUGIN_DIR . 'includes/admin/upgrades/upgrades.php' );
  886. require_once( NF_PLUGIN_DIR . 'includes/admin/upgrades/convert-forms-reset.php' );
  887. require_once( NF_PLUGIN_DIR . 'includes/admin/upgrades/upgrade-handler-page.php');
  888. require_once( NF_PLUGIN_DIR . 'includes/admin/upgrades/class-upgrade-handler.php');
  889. $upgrades = NF_UpgradeHandler()->upgrades;
  890. if ($upgrades AND is_array($upgrades)) {
  891. foreach ($upgrades as $upgrade) {
  892. delete_option('nf_upgrade_' . $upgrade->name . '_last_step');
  893. }
  894. }
  895. // Remove all of our submissions
  896. $items = get_posts(array('post_type' => 'nf_sub', 'post_status' => 'any', 'numberposts' => -1, 'fields' => 'ids'));
  897. if ($items) {
  898. foreach ($items as $item) {
  899. wp_delete_post($item, true);
  900. }
  901. }
  902. // Remove all of our custom tables
  903. $wpdb->query('DROP TABLE ' . NF_OBJECTS_TABLE_NAME);
  904. $wpdb->query('DROP TABLE ' . NF_OBJECT_META_TABLE_NAME);
  905. $wpdb->query('DROP TABLE ' . NF_OBJECT_RELATIONSHIPS_TABLE_NAME);
  906. $wpdb->query('DROP TABLE ' . NINJA_FORMS_TABLE_NAME);
  907. $wpdb->query('DROP TABLE ' . NINJA_FORMS_FIELDS_TABLE_NAME);
  908. $wpdb->query('DROP TABLE ' . NINJA_FORMS_FAV_FIELDS_TABLE_NAME);
  909. $wpdb->query('DROP TABLE ' . NINJA_FORMS_SUBS_TABLE_NAME);
  910. // Remove our daily cron job
  911. $timestamp = wp_next_scheduled('ninja_forms_daily_action');
  912. wp_unschedule_event($timestamp, 'ninja_forms_daily_action');
  913. }
  914. }