Skip to content
Snippets Groups Projects
civicrm.php 53.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • Kevin Cristiano's avatar
    Kevin Cristiano committed
    <?php
    /*
    Plugin Name: CiviCRM
    Description: CiviCRM - Growing and Sustaining Relationships
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    Version: 5.25.0
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    Author: CiviCRM LLC
    
    Author URI: https://civicrm.org/
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    Plugin URI: https://docs.civicrm.org/sysadmin/en/latest/install/wordpress/
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    License: AGPL3
    Text Domain: civicrm
    Domain Path: /languages
    */
    
    
    /*
     +--------------------------------------------------------------------+
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     | Copyright CiviCRM LLC. All rights reserved.                        |
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     |                                                                    |
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     | This work is published under the GNU AGPLv3 license with some      |
     | permitted exceptions and without any warranty. For full license    |
     | and copyright information, see https://civicrm.org/licensing       |
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     +--------------------------------------------------------------------+
    */
    
    /**
     *
     * @package CRM
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * @copyright CiviCRM LLC https://civicrm.org/licensing
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     *
     */
    
    
    /*
    --------------------------------------------------------------------------------
    WordPress resources for developers
    --------------------------------------------------------------------------------
    Not that they're ever adhered to anywhere other than core, but people do their
    best to comply...
    
    WordPress core coding standards:
    http://make.wordpress.org/core/handbook/coding-standards/php/
    
    WordPress HTML standards:
    http://make.wordpress.org/core/handbook/coding-standards/html/
    
    WordPress JavaScript standards:
    http://make.wordpress.org/core/handbook/coding-standards/javascript/
    --------------------------------------------------------------------------------
    */
    
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    // This file must not accessed directly
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    if ( ! defined( 'ABSPATH' ) ) exit;
    
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    // Set version here: when it changes, will force JS to reload
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    define( 'CIVICRM_PLUGIN_VERSION', '5.25.0' );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    // Store reference to this file
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    if (!defined('CIVICRM_PLUGIN_FILE')) {
      define( 'CIVICRM_PLUGIN_FILE', __FILE__ );
    }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    // Store URL to this plugin's directory
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    if (!defined( 'CIVICRM_PLUGIN_URL')) {
      define( 'CIVICRM_PLUGIN_URL', plugin_dir_url(CIVICRM_PLUGIN_FILE) );
    }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    // Store PATH to this plugin's directory
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    if (!defined( 'CIVICRM_PLUGIN_DIR')) {
      define( 'CIVICRM_PLUGIN_DIR', plugin_dir_path(CIVICRM_PLUGIN_FILE) );
    }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    if ( !defined( 'CIVICRM_WP_PHP_MINIMUM' ) ) {
      /**
       * Minimum required PHP
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Note: This duplicates CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER.
       * The duplication helps avoid dependency issues. (Reading
       * `CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER` requires loading
       * `civicrm.settings.php`, but that triggers a parse-error
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * on PHP 5.x.)
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @see CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @see CiviWP\PhpVersionTest::testConstantMatch()
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      define( 'CIVICRM_WP_PHP_MINIMUM', '7.1.0' );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    /*
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * The constant CIVICRM_SETTINGS_PATH is also defined in civicrm.config.php and
     * may already have been defined there - e.g. by cron or external scripts.
     */
    if ( !defined( 'CIVICRM_SETTINGS_PATH' ) ) {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /*
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Test where the settings file exists.
       *
       * If the settings file is found in the 4.6 and prior location, use that as
       * CIVICRM_SETTINGS_PATH, otherwise use the new location.
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      $upload_dir    = wp_upload_dir();
      $wp_civi_settings = $upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR . 'civicrm.settings.php' ;
      $wp_civi_settings_deprectated = CIVICRM_PLUGIN_DIR . 'civicrm.settings.php';
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      if (file_exists($wp_civi_settings_deprectated)) {
        define( 'CIVICRM_SETTINGS_PATH', $wp_civi_settings_deprectated );
      }
      else  {
        define( 'CIVICRM_SETTINGS_PATH', $wp_civi_settings );
      }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    // Test if CiviCRM is installed
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    if ( file_exists( CIVICRM_SETTINGS_PATH )  ) {
        define( 'CIVICRM_INSTALLED', TRUE );
      } else {
        define( 'CIVICRM_INSTALLED', FALSE );
    }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    // Prevent CiviCRM from rendering its own header
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    define( 'CIVICRM_UF_HEAD', TRUE );
    
    
    /**
     * Setting this to 'true' will replace all mailing URLs calls to 'extern/url.php'
     * and 'extern/open.php' with their REST counterpart 'civicrm/v3/url' and 'civicrm/v3/open'.
     *
     * Use for test purposes, may affect mailing
     * performance, see Plugin->replace_tracking_urls() method.
     */
    if ( ! defined( 'CIVICRM_WP_REST_REPLACE_MAILING_TRACKING' ) ) {
      define( 'CIVICRM_WP_REST_REPLACE_MAILING_TRACKING', false );
    }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * Define CiviCRM_For_WordPress Class.
     *
     * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     */
    class CiviCRM_For_WordPress {
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Plugin instance.
       *
       * @since 4.4
       * @access private
       * @var object $instance The plugin instance.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      private static $instance;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Plugin context (broad).
       *
       * @since 4.4
       * @access public
       * @var bool $in_wordpress The broad plugin context.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      static $in_wordpress;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * Plugin context (specific).
       *
       * @since 4.4
       * @access public
       * @var str $context The specific plugin context.
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      static $context;
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Shortcodes management object.
       *
       * @since 4.4
       * @access public
       * @var object CiviCRM_For_WordPress_Shortcodes The shortcodes management object.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public $shortcodes;
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Modal dialog management object.
       *
       * @since 4.4
       * @access public
       * @var object CiviCRM_For_WordPress_Shortcodes_Modal The modal dialog management object.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public $modal;
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Basepage management object.
       *
       * @since 4.4
       * @access public
       * @var object CiviCRM_For_WordPress_Basepage The basepage management object.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public $basepage;
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * User management object.
       *
       * @since 4.4
       * @access public
       * @var object CiviCRM_For_WordPress_Users The user management object.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public $users;
    
    
      /**
       * Compatibility object.
       *
       * @since 5.24
       * @access public
       * @var object CiviCRM_For_WordPress_Compat The plugin compatibility object.
       */
      public $compat;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
      // ---------------------------------------------------------------------------
      // Setup
      // ---------------------------------------------------------------------------
    
    
      /**
       * Getter method which returns the CiviCRM instance and optionally creates one
       * if it does not already exist. Standard CiviCRM singleton pattern.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
       *
       * @return object CiviCRM_For_WordPress The CiviCRM plugin instance.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public static function singleton() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // If instance doesn't already exist
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ( ! isset( self::$instance ) ) {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Create instance
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          self::$instance = new CiviCRM_For_WordPress;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          // Delay setup until 'plugins_loaded' to allow other plugins to load as well
          add_action( 'plugins_loaded', array( self::$instance, 'setup_instance' ) );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Return instance
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        return self::$instance;
    
      }
    
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Dummy instance constructor.
       *
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      function __construct() {}
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Dummy magic method to prevent CiviCRM_For_WordPress from being cloned.
       *
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function __clone() {
        _doing_it_wrong( __FUNCTION__, __( 'Only one instance of CiviCRM_For_WordPress please', 'civicrm' ), '4.4' );
      }
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Dummy magic method to prevent CiviCRM_For_WordPress from being unserialized.
       *
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function __wakeup() {
        _doing_it_wrong( __FUNCTION__, __( 'Please do not serialize CiviCRM_For_WordPress', 'civicrm' ), '4.4' );
      }
    
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Plugin activation.
       *
       * This method is called only when CiviCRM plugin is activated. In order for
       * other plugins to be able to interact with Civi's activation, we wait until
       * after the activation redirect to perform activation actions.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function activate() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Set a one-time-only option
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        add_option( 'civicrm_activation_in_progress', 'true' );
    
      }
    
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Run CiviCRM's plugin activation procedure.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function activation() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Bail if not activating
        if ( get_option( 'civicrm_activation_in_progress' ) !== 'true' ) {
          return;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Bail if not in WordPress admin
        if ( !is_admin() ) {
          return;
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /**
         * Broadcast that activation actions need to happen now.
         *
         * @since 5.6
         */
        do_action( 'civicrm_activation' );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Change option so this action never fires again
        update_option( 'civicrm_activation_in_progress', 'false' );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ( ! is_multisite() && !isset($_GET['activate-multi']) && ! CIVICRM_INSTALLED ) {
          wp_redirect(admin_url("options-general.php?page=civicrm-install"));
          exit;
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Plugin deactivation.
       *
       * This method is called only when CiviCRM plugin is deactivated. In order for
       * other plugins to be able to interact with Civi's activation, we need to
       * remove any options that are set in activate() above.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function deactivate() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Delete any options we hay have set
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        delete_option( 'civicrm_activation_in_progress' );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        /**
         * Broadcast that deactivation actions need to happen now.
         *
         * @since 5.6
         */
        do_action( 'civicrm_deactivation' );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Set up the CiviCRM plugin instance.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function setup_instance() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Kick out if another instance is being inited
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ( isset( self::$in_wordpress ) ) {
          wp_die( __( 'Only one instance of CiviCRM_For_WordPress please', 'civicrm' ) );
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Get existing session ID
        $session_id = session_id();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /*
         * There is no session handling in WP - hence we start it for CiviCRM pages
         * except when running via WP-CLI which does not require sessions.
         */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ( empty( $session_id ) && ! ( defined( 'WP_CLI' ) && WP_CLI ) ) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          session_start();
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /*
         * AJAX calls do not set the 'cms.root' item, so make sure it is set here so
         * the CiviCRM doesn't fall back on flaky directory traversal code.
         */
        global $civicrm_paths;
        if (empty($civicrm_paths['cms.root']['path'])) {
          $civicrm_paths['cms.root']['path'] = untrailingslashit(ABSPATH);
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (empty($civicrm_paths['cms.root']['url'])) {
          $civicrm_paths['cms.root']['url'] = home_url();
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Get classes and instantiate
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->include_files();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Do plugin activation
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->activation();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Use translation files
        $this->enable_translation();
    
        // Register all hooks on init
        add_action( 'init', array( $this, 'register_hooks' ) );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /**
         * Broadcast that this plugin is now loaded.
         *
         * @since 4.4
         */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        do_action( 'civicrm_instance_loaded' );
    
      }
    
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Set broad CiviCRM context.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Setter for determining if CiviCRM is currently being displayed in WordPress.
       * This becomes true whe CiviCRM is called in the following contexts:
       *
       * (a) in the WordPress back-end
       * (b) when CiviCRM content is being displayed on the front-end via wpBasePage
       * (c) when an AJAX request is made to CiviCRM
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * It is NOT true when CiviCRM is called via a shortcode.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function civicrm_in_wordpress_set() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Get identifying query var
        $page = get_query_var( 'page' );
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Store
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        self::$in_wordpress = ( $page == 'CiviCRM' ) ? TRUE : FALSE;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
      }
    
    
      /**
       * Getter for testing if CiviCRM is currently being displayed in WordPress.
       *
       * @see $this->civicrm_in_wordpress_set()
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
       *
       * @return bool $in_wordpress True if CiviCRM is displayed in WordPress, false otherwise.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function civicrm_in_wordpress() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /**
         * Allow broad context to be filtered.
         *
         * @since 4.4
         *
         * @param bool $in_wordpress True if CiviCRM is displayed in WordPress, false otherwise.
         * @return bool $in_wordpress True if CiviCRM is displayed in WordPress, false otherwise.
         */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        return apply_filters( 'civicrm_in_wordpress', self::$in_wordpress );
    
      }
    
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Set specific CiviCRM context.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Setter for determining how CiviCRM is currently being displayed in WordPress.
       * This can be one of the following contexts:
       *
       * (a) in the WordPress back-end
       * (b) when CiviCRM content is being displayed on the front-end via wpBasePage
       * (c) when a "non-page" request is made to CiviCRM
       * (d) when CiviCRM is called via a shortcode
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * The following codes correspond to the different contexts:
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
       * (a) 'admin'
       * (b) 'basepage'
       * (c) 'nonpage'
       * (d) 'shortcode'
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
       *
       * @param string $context One of the four context codes above.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function civicrm_context_set( $context ) {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Store
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        self::$context = $context;
    
      }
    
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Get specific CiviCRM context.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Getter for determining how CiviCRM is currently being displayed in WordPress.
       *
       * @see $this->civicrm_context_set()
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
       *
       * @return string The context in which CiviCRM is displayed in WordPress.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function civicrm_context_get() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /**
         * Allow specific context to be filtered.
         *
         * @since 4.4
         *
         * @param bool $context The existing context in which CiviCRM is displayed in WordPress.
         * @return bool $context The modified context in which CiviCRM is displayed in WordPress.
         */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        return apply_filters( 'civicrm_context', self::$context );
    
      }
    
    
      // ---------------------------------------------------------------------------
      // Files
      // ---------------------------------------------------------------------------
    
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Include files.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function include_files() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Include users class
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.users.php';
        $this->users = new CiviCRM_For_WordPress_Users;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Include shortcodes class
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.shortcodes.php';
        $this->shortcodes = new CiviCRM_For_WordPress_Shortcodes;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Include shortcodes modal dialog class
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.shortcodes.modal.php';
        $this->modal = new CiviCRM_For_WordPress_Shortcodes_Modal;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Include basepage class
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.basepage.php';
        $this->basepage = new CiviCRM_For_WordPress_Basepage;
    
    
        // Include compatibility class
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.compat.php';
        $this->compat = new CiviCRM_For_WordPress_Compat;
    
    
        if ( ! class_exists( 'CiviCRM_WP_REST\Autoloader' ) ) {
          // Include REST API autoloader class
          require_once( CIVICRM_PLUGIN_DIR . 'wp-rest/Autoloader.php' );
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      }
    
    
      // ---------------------------------------------------------------------------
      // Hooks
      // ---------------------------------------------------------------------------
    
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Register hooks on init.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function register_hooks() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Always add the common hooks
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->register_hooks_common();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // When in WordPress admin...
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ( is_admin() ) {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Set context
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $this->civicrm_context_set( 'admin' );
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Handle WP admin context
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $this->register_hooks_admin();
          return;
    
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Go no further if CiviCRM not installed yet
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ( ! CIVICRM_INSTALLED ) return;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Delay everything else until query has been parsed
        add_action( 'parse_query', array( $this, 'register_hooks_front_end' ) );
    
      }
    
    
      /**
       * Register hooks for the front end.
       *
       * @since 5.6
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
       * @param WP_Query $query The WP_Query instance (passed by reference).
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      public function register_hooks_front_end( $query ) {
    
        // Bail if $query is not the main loop.
        if ( ! $query->is_main_query() ) {
          return;
        }
    
        // Bail if filters are suppressed on this query.
        if ( true == $query->get( 'suppress_filters' ) ) {
          return;
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        // Prevent multiple calls
        static $alreadyRegistered = FALSE;
        if ( $alreadyRegistered ) {
          return;
        }
        $alreadyRegistered = TRUE;
    
        // Store context
        $this->civicrm_in_wordpress_set();
    
        // When embedded via wpBasePage or AJAX call...
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ( $this->civicrm_in_wordpress() ) {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
           * Directly output CiviCRM html only in a few cases and skip WP templating:
           *
           * (a) when a snippet is set
           * (b) when there is an AJAX call
           * (c) for an iCal feed (unless 'html' is specified)
           * (d) for file download URLs
           */
          if ( ! $this->is_page_request() ) {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // Set context
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $this->civicrm_context_set( 'nonpage' );
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // Add core resources for front end
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            add_action( 'wp', array( $this, 'front_end_page_load' ) );
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // Echo all output when WP has been set up but nothing has been rendered
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            add_action( 'wp', array( $this, 'invoke' ) );
            return;
    
          }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Set context
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $this->civicrm_context_set( 'basepage' );
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // If we get here, we must be in a wpBasePage context
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $this->basepage->register_hooks();
          return;
    
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Set context
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->civicrm_context_set( 'shortcode' );
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // That leaves us with handling shortcodes, should they exist
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->shortcodes->register_hooks();
    
      }
    
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Register hooks that must always be present.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function register_hooks_common() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Register user hooks.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->users->register_hooks();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Register hooks for clean URLs.
        $this->register_hooks_clean_urls();
    
    
        if ( ! class_exists( 'CiviCRM_WP_REST\Plugin' ) ) {
    
          // Set up REST API.
          CiviCRM_WP_REST\Autoloader::add_source( $source_path = trailingslashit( CIVICRM_PLUGIN_DIR . 'wp-rest' ) );
    
          // Init REST API.
          new CiviCRM_WP_REST\Plugin;
    
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      }
    
    
      /**
       * Register hooks to handle Clean URLs.
       *
       * @since 5.12
       */
      public function register_hooks_clean_urls() {
    
        // Bail if CiviCRM is not installed.
        if (!CIVICRM_INSTALLED) {
          return;
        }
    
        // Bail if we can't initialize CiviCRM.
        if (!$this->initialize()) {
          return;
        }
    
        // Bail if CiviCRM is not using clean URLs.
        if (!defined('CIVICRM_CLEANURL') || CIVICRM_CLEANURL !== 1) {
          return;
        }
    
        // Have we flushed rewrite rules?
        if ( get_option( 'civicrm_rules_flushed' ) !== 'true' ) {
    
          // Apply custom rewrite rules, then flush rules afterwards.
          $this->rewrite_rules( true );
    
          // Set a one-time-only option to flag that this has been done.
          add_option( 'civicrm_rules_flushed', 'true' );
    
        } else {
    
          // Apply custom rewrite rules normally.
          $this->rewrite_rules();
    
        }
    
        // Add our query vars.
        add_filter( 'query_vars', array( $this, 'query_vars' ) );
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Register hooks to handle CiviCRM in a WordPress admin context.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function register_hooks_admin() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Modify the admin menu
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        add_action( 'admin_menu', array( $this, 'add_menu_items' ) );
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Set page title
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        add_filter( 'admin_title', array( $this, 'set_admin_title' ) );
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Print CiviCRM's header
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        add_action('admin_head', array( $this, 'wp_head' ), 50);
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Listen for changes to the basepage setting
        add_action( 'civicrm_postSave_civicrm_setting', array( $this, 'settings_change' ), 10 );
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // If settings file does not exist, show notice with link to installer
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ( ! CIVICRM_INSTALLED ) {
          if ( isset( $_GET['page'] ) && $_GET['page'] == 'civicrm-install' ) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // Set install type
            $_GET['civicrm_install_type'] = 'wordpress';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          } else {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // Show notice
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            add_action( 'admin_notices', array( $this, 'show_setup_warning' ) );
          }
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Enable shortcode modal
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->modal->register_hooks();
    
      }
    
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * Force rewrite rules to be recreated.
       *
       * When CiviCRM settings are saved, the method is called post-save. It checks
       * if it's the WordPress Base Page setting that has been saved and causes all
       * rewrite rules to be flushed on the next page load.
       *
       * @since 5.14
       *
       * @param obj $dao The CiviCRM database access object.
       */
      public function settings_change( $dao ) {
    
        // Delete the option if conditions are met
        if ( $dao instanceOf CRM_Core_DAO_Setting ) {
          if ( isset( $dao->name ) && $dao->name == 'wpBasePage' ) {
            delete_option( 'civicrm_rules_flushed' );
          }
        }
    
      }
    
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * Add our rewrite rules.
       *
       * @since 5.7
       *
       * @param bool $flush_rewrite_rules True if rules should be flushed, false otherwise.
       */
      public function rewrite_rules( $flush_rewrite_rules = false ) {
    
        // Kick out if not CiviCRM
        if (!$this->initialize()) {
          return;
        }
    
        // Get config
        $config = CRM_Core_Config::singleton();
    
        // Get basepage object
        $basepage = get_page_by_path( $config->wpBasePage );
    
        // Sanity check
        if (!is_object($basepage)) {
            return;
        }
    
        // Let's add rewrite rule when viewing the basepage
        add_rewrite_rule(
          '^' . $config->wpBasePage . '/([^?]*)?',
          'index.php?page_id=' . $basepage->ID . '&page=CiviCRM&q=civicrm%2F$matches[1]',
          'top'
        );
    
        // Maybe force flush
        if ($flush_rewrite_rules) {
          flush_rewrite_rules();
        }
    
        /**
         * Broadcast the rewrite rules event.
         *
         * @since 5.7
    
         * @since 5.24 Added $basepage parameter.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         *
         * @param bool $flush_rewrite_rules True if rules flushed, false otherwise.
    
         * @param WP_Post $basepage The Basepage post object.
    
        do_action( 'civicrm_after_rewrite_rules', $flush_rewrite_rules, $basepage );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
      }
    
    
      /**
       * Add our query vars.
       *
       * @since 5.7
       *
       * @param array $query_vars The existing query vars.
       * @return array $query_vars The modified query vars.
       */
      public function query_vars( $query_vars ) {
    
        // Sanity check
        if (!is_array($query_vars)) {
          $query_vars = array();
        }
    
        // Build our query vars
        $civicrm_query_vars = array(
          'page', 'q', 'reset', 'id', 'html', 'snippet', // URL query vars
          'action', 'mode', 'cid', 'gid', 'sid', 'cs', 'force', // Shortcode query vars
        );
    
        /**
         * Filter the default CiviCRM query vars.
         *
         * Use in combination with `civicrm_query_vars_assigned` action to ensure
         * that any other query vars are included in the assignment to the
         * super-global arrays.
         *
         * @since 5.7
         *
         * @param array $civicrm_query_vars The default set of query vars.
         * @return array $civicrm_query_vars The modified set of query vars.
         */
        $civicrm_query_vars = apply_filters( 'civicrm_query_vars', $civicrm_query_vars );
    
        // Now add them to WordPress
        foreach( $civicrm_query_vars as $civicrm_query_var ) {
          $query_vars[] = $civicrm_query_var;
        }
    
        return $query_vars;
    
      }
    
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      // ---------------------------------------------------------------------------
      // CiviCRM Initialisation
      // ---------------------------------------------------------------------------
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * Check that the PHP version is supported. If not, raise a fatal error with a pointed message.
       *
       * One should check this before bootstrapping Civi - after we start the class-loader, the
       * PHP-compatibility errors will become more ugly.
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      protected function assertPhpSupport() {
        if ( version_compare( PHP_VERSION, CIVICRM_WP_PHP_MINIMUM ) < 0 ) {
          echo '<p>' .
             sprintf(
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              __( 'CiviCRM requires PHP version %1$s or greater. You are running PHP version %2$s', 'civicrm' ),
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              CIVICRM_WP_PHP_MINIMUM,
              PHP_VERSION
             ) .
             '<p>';
          exit();
        }
      }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Initialize CiviCRM.
       *
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @return bool $success True if CiviCRM is initialized, false otherwise.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function initialize() {
    
        static $initialized = FALSE;
        static $failure = FALSE;
    
        if ( $failure ) {
          return FALSE;
        }
    
        if ( ! $initialized ) {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $this->assertPhpSupport();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Check for settings
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ( ! CIVICRM_INSTALLED ) {
            $error = FALSE;
          } elseif ( file_exists( CIVICRM_SETTINGS_PATH) ) {
            $error = include_once ( CIVICRM_SETTINGS_PATH );
          }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Autoload
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          require_once 'CRM/Core/ClassLoader.php';
          CRM_Core_ClassLoader::singleton()->register();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Get ready for problems
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $installLink    = admin_url() . "options-general.php?page=civicrm-install";
    
          $docLinkInstall = "https://wiki.civicrm.org/confluence/display/CRMDOC/Installing+CiviCRM+for+WordPress";
          $docLinkTrouble = "https://wiki.civicrm.org/confluence/display/CRMDOC/Installation+and+Upgrades";
          $forumLink      = "https://civicrm.stackexchange.com/";
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Construct message
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $errorMsgAdd = sprintf(
            __( 'Please review the <a href="%s">WordPress Installation Guide</a> and the <a href="%s">Trouble-shooting page</a> for assistance. If you still need help installing, you can often find solutions to your issue by searching for the error message in the <a href="%s">installation support section of the community forum</a>.', 'civicrm' ),
            $docLinkInstall,
            $docLinkTrouble,
            $forumLink
          );
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Does install message get used?
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $installMessage = sprintf(
            __( 'Click <a href="%s">here</a> for fresh install.', 'civicrm' ),
            $installLink
          );
    
          if ($error == FALSE) {
            header( 'Location: ' . admin_url() . 'options-general.php?page=civicrm-install' );
            return FALSE;
          }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Access global defined in civicrm.settings.php
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          global $civicrm_root;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // This does pretty much all of the civicrm initialization
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ( ! file_exists( $civicrm_root . 'CRM/Core/Config.php' ) ) {
            $error = FALSE;
          } else {
            $error = include_once ( 'CRM/Core/Config.php' );
          }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Have we got it?
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ( $error == FALSE ) {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // Set static flag
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $failure = TRUE;
    
            // FIX ME - why?
            wp_die(
              "<strong><p class='error'>" .
              sprintf(
                __( 'Oops! - The path for including CiviCRM code files is not set properly. Most likely there is an error in the <em>civicrm_root</em> setting in your CiviCRM settings file (%s).', 'civicrm' ),
                CIVICRM_SETTINGS_PATH
              ) .
              "</p><p class='error'> &raquo; " .
              sprintf(
                __( 'civicrm_root is currently set to: <em>%s</em>.', 'civicrm' ),
                $civicrm_root
              ) .
              "</p><p class='error'>" . $errorMsgAdd . "</p></strong>"
            );
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // Won't reach here!
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            return FALSE;
    
          }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Set static flag