Skip to content
Snippets Groups Projects
civicrm.php 37.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • Kevin Cristiano's avatar
    Kevin Cristiano committed
    <?php
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    /**
     * Plugin Name: CiviCRM
     * Description: CiviCRM - Growing and Sustaining Relationships
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * Version: 5.46.2
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * Requires at least: 4.9
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * Requires PHP:      7.2
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * Author: CiviCRM LLC
     * Author URI: https://civicrm.org/
     * Plugin URI: https://docs.civicrm.org/sysadmin/en/latest/install/wordpress/
     * License: AGPL3
     * Text Domain: civicrm
     * Domain Path: /languages
     */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    /*
     +--------------------------------------------------------------------+
    
    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
     +--------------------------------------------------------------------+
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     */
    
    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:
     * https://developer.wordpress.org/coding-standards/wordpress-coding-standards/php/
     *
     * WordPress HTML standards:
     * https://make.wordpress.org/core/handbook/best-practices/coding-standards/html/
     *
     * WordPress JavaScript standards:
     * https://developer.wordpress.org/coding-standards/wordpress-coding-standards/javascript/
     * -----------------------------------------------------------------------------
     */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    // This file must not accessed directly.
    if (!defined('ABSPATH')) {
      exit;
    }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    // Set version here: when it changes, will force Javascript & CSS to reload.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    define('CIVICRM_PLUGIN_VERSION', '5.46.2');
    
    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')) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      define('CIVICRM_PLUGIN_FILE', __FILE__);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    // Store URL to this plugin's directory.
    if (!defined('CIVICRM_PLUGIN_URL')) {
      define('CIVICRM_PLUGIN_URL', plugin_dir_url(CIVICRM_PLUGIN_FILE));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    // Store PATH to this plugin's directory.
    if (!defined('CIVICRM_PLUGIN_DIR')) {
      define('CIVICRM_PLUGIN_DIR', plugin_dir_path(CIVICRM_PLUGIN_FILE));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    if (!defined('CIVICRM_WP_PHP_MINIMUM')) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Minimum required PHP.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Note: This duplicates `CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER`.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * The duplication helps avoid dependency issues. (Reading
       * `CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER` requires loading
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * `civicrm.settings.php`, but that triggers a parse-error 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.2.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.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    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
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * `CIVICRM_SETTINGS_PATH`, otherwise use the new location.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
    
    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';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      $wp_civi_settings_deprectated = CIVICRM_PLUGIN_DIR . 'civicrm.settings.php';
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      if (file_exists($wp_civi_settings_deprectated)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        define('CIVICRM_SETTINGS_PATH', $wp_civi_settings_deprectated);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      else {
        define('CIVICRM_SETTINGS_PATH', $wp_civi_settings);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    // Test if CiviCRM is installed.
    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.
    define('CIVICRM_UF_HEAD', TRUE);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * 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'.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * Use for test purposes, may affect mailing performance.
     *
     * @see CiviCRM_WP_REST\Plugin::replace_tracking_urls()
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    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
       * @var object
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Plugin instance.
       * @since 4.4
       * @access private
    
    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
       * @var bool
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Plugin context (broad).
       * @since 4.4
       * @access public
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      public static $in_wordpress;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @var string
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Plugin context (specific).
       * @since 4.4
       * @access public
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      public static $context;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @var object
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Shortcodes management object.
       * @since 4.4
       * @access public
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public $shortcodes;
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @var object
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Modal dialog management object.
       * @since 4.4
       * @access public
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public $modal;
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @var object
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Basepage management object.
       * @since 4.4
       * @access public
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public $basepage;
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @var object
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * User management object.
       * @since 4.4
       * @access public
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public $users;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @var object
       * The plugin compatibility object.
    
       * @since 5.24
       * @access public
       */
      public $compat;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * @var object
       * Admin object.
       * @since 5.33
       * @access public
       */
      public $admin;
    
    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.
        if (!isset(self::$instance)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Create instance.
          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', [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
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      public function __construct() {}
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
      /**
    
    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() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        _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() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        _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
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * other plugins to be able to interact with CiviCRM's activation, we wait until
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * 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.
        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') {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Bail if not in WordPress admin.
        if (!is_admin()) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          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
         */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        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
    
        // Try and redirect to the Installer page.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!is_multisite() && !isset($_GET['activate-multi']) && !CIVICRM_INSTALLED) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          wp_redirect(admin_url('admin.php?page=civicrm-install'));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          exit;
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Plugin deactivation.
       *
       * This method is called only when CiviCRM plugin is deactivated. In order for
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * other plugins to be able to interact with CiviCRM's activation, we need to
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * 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.
        delete_option('civicrm_activation_in_progress');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        /**
         * Broadcast that deactivation actions need to happen now.
         *
         * @since 5.6
         */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        do_action('civicrm_deactivation');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      // ---------------------------------------------------------------------------
      // Plugin set up
      // ---------------------------------------------------------------------------
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
      /**
    
    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.
        if (isset(self::$in_wordpress)) {
          wp_die(__('Only one instance of CiviCRM_For_WordPress please', 'civicrm'));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Maybe start session.
        $this->maybe_start_session();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    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
        // Include class files and instantiate.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->include_files();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->setup_objects();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    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.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->enable_translation();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Register all hooks on init.
        add_action('init', [$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
      /**
       * Maybe start a session for CiviCRM.
       *
       * There is no session handling in WordPress so start it for CiviCRM pages.
       *
       * Not needed when running:
       *
       * - via WP-CLI
       * - via wp-cron.php
       * - via PHP on the command line
       *
       * none of which require sessions.
       *
       * @since 5.28
       */
      public function maybe_start_session() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Get existing session ID.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $session_id = session_id();
    
        // Check WordPress pseudo-cron.
        $wp_cron = FALSE;
        if (function_exists('wp_doing_cron') && wp_doing_cron()) {
          $wp_cron = TRUE;
        }
    
        // Check WP-CLI.
        $wp_cli = FALSE;
        if (defined('WP_CLI') && WP_CLI) {
          $wp_cli = TRUE;
        }
    
        // Check PHP on the command line - e.g. `cv`.
        $php_cli = TRUE;
        if (PHP_SAPI !== 'cli') {
          $php_cli = FALSE;
        }
    
        // Maybe start session.
        if (empty($session_id) && !$wp_cron && !$wp_cli && !$php_cli) {
          session_start();
        }
    
      }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
    
    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
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      public function include_files() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Include class files.
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.admin.php';
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.users.php';
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.shortcodes.php';
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.shortcodes.modal.php';
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.basepage.php';
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.compat.php';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Maybe include REST API autoloader class.
        if (!class_exists('CiviCRM_WP_REST\Autoloader')) {
          require_once CIVICRM_PLUGIN_DIR . 'wp-rest/Autoloader.php';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * Instantiate objects.
       *
       * @since 5.33
       */
      public function setup_objects() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Instantiate objects.
        $this->admin = new CiviCRM_For_WordPress_Admin();
        $this->users = new CiviCRM_For_WordPress_Users();
        $this->shortcodes = new CiviCRM_For_WordPress_Shortcodes();
        $this->modal = new CiviCRM_For_WordPress_Shortcodes_Modal();
        $this->basepage = new CiviCRM_For_WordPress_Basepage();
        $this->compat = new CiviCRM_For_WordPress_Compat();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * Load translation files.
       *
       * A good reference on how to implement translation in WordPress:
       * http://ottopress.com/2012/internationalization-youre-probably-doing-it-wrong/
       *
       * Also see:
       * https://developer.wordpress.org/plugins/internationalization/
       *
       * @since 4.4
       */
      public function enable_translation() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Load translations.
        load_plugin_textdomain(
          // Unique name.
          'civicrm',
          // Deprecated argument.
          FALSE,
          // Relative path to translation files.
          dirname(plugin_basename(__FILE__)) . '/languages/'
        );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      // ---------------------------------------------------------------------------
      // Context
      // ---------------------------------------------------------------------------
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
    
    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.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $page = get_query_var('civiwp');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Store.
        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
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      public function civicrm_context_set($context) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    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);
    
    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.
        if (is_admin()) {
    
          // Set context.
          $this->civicrm_context_set('admin');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Handle WordPress Admin context.
          $this->admin->register_hooks();
    
          // Enable shortcode modal.
          $this->modal->register_hooks();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Go no further if CiviCRM not installed yet.
        if (!CIVICRM_INSTALLED) {
          return;
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Attempt to replace 'page' query arg with 'civiwp'.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        add_filter('request', [$this, 'maybe_replace_page_query_var']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        // Add our query vars.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        add_filter('query_vars', [$this, 'query_vars']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Delay everything else until query has been parsed.
        add_action('parse_query', [$this, 'register_hooks_front_end']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
      }
    
      /**
       * 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) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        // Bail if $query is not the main loop.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!$query->is_main_query()) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return;
        }
    
        // Bail if filters are suppressed on this query.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (TRUE == $query->get('suppress_filters')) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return;
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Prevent multiple calls.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        static $alreadyRegistered = FALSE;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ($alreadyRegistered) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return;
        }
        $alreadyRegistered = TRUE;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Redirect if old query var is present.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ('CiviCRM' == get_query_var('page') && 'CiviCRM' != get_query_var('civiwp')) {
          $redirect_url = remove_query_arg('page', FALSE);
          $redirect_url = add_query_arg('civiwp', 'CiviCRM', $redirect_url);
          wp_redirect($redirect_url, 301);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          exit();
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Store context.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->civicrm_in_wordpress_set();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // When the CiviCRM query var is detected.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ($this->civicrm_in_wordpress()) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
           * Directly output CiviCRM html only in a few cases and skip WordPress
           * templating:
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
           *
           * (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
           */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!$this->is_page_request()) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // Set context.
            $this->civicrm_context_set('nonpage');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // Add core resources for front end.
            add_action('wp', [$this, 'front_end_page_load']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // Echo all output when WordPress has been set up but nothing has been rendered.
            add_action('wp', [$this, 'invoke']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Let the classes decide how to handle other requests.
        $this->basepage->register_hooks();
    
    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();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!class_exists('CiviCRM_WP_REST\Plugin')) {
    
    
          // Set up REST API.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          CiviCRM_WP_REST\Autoloader::add_source($source_path = trailingslashit(CIVICRM_PLUGIN_DIR . 'wp-rest'));
    
          // Init REST API.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          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;
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Bail if CiviCRM is not using Clean URLs.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!defined('CIVICRM_CLEANURL') || CIVICRM_CLEANURL !== 1) {
          return;
        }
    
        // Have we flushed rewrite rules?
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (get_option('civicrm_rules_flushed') !== 'true') {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          // Apply custom rewrite rules, then flush rules afterwards.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $this->rewrite_rules(TRUE);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          // Set a one-time-only option to flag that this has been done.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          add_option('civicrm_rules_flushed', 'true');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        }
        else {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          // Apply custom rewrite rules normally.
          $this->rewrite_rules();
    
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      // ---------------------------------------------------------------------------
      // Construction of URLs
      // ---------------------------------------------------------------------------
    
    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.
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      public function rewrite_rules($flush_rewrite_rules = FALSE) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Kick out if not CiviCRM.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!$this->initialize()) {
          return;
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Get config.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $config = CRM_Core_Config::singleton();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Get basepage object.
        $basepage = get_page_by_path($config->wpBasePage);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Sanity check.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!is_object($basepage)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Let's add rewrite rule when viewing the basepage.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        add_rewrite_rule(
          '^' . $config->wpBasePage . '/([^?]*)?',
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          'index.php?page_id=' . $basepage->ID . '&civiwp=CiviCRM&q=civicrm%2F$matches[1]',
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Maybe force flush.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        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.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        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.
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      public function query_vars($query_vars) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Sanity check.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!is_array($query_vars)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $query_vars = [];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Build our query vars.
        $civicrm_query_vars = [
          // URL query vars.
          'civiwp', 'q', 'reset', 'id', 'html', 'snippet',
          // Shortcode query vars.
          'action', 'mode', 'cid', 'gid', 'sid', 'cs', 'force',
        ];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        /**
         * 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.
         */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $civicrm_query_vars = apply_filters('civicrm_query_vars', $civicrm_query_vars);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Now add them to WordPress.
        foreach ($civicrm_query_vars as $civicrm_query_var) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $query_vars[] = $civicrm_query_var;
        }
    
        return $query_vars;
    
      }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Filters the request right after WordPress has parsed it and replaces the
       * 'page' query variable with 'civiwp' if applicable.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
       * Prevents old URLs like example.org/civicrm/?page=CiviCRM&q=what/ever/path&reset=1
       * being redirected to example.org/civicrm/?civiwp=CiviCRM&q=what/ever/path&reset=1
       *
       * @see https://lab.civicrm.org/dev/wordpress/-/issues/49
       *
       * @since 5.26
       *
       * @param array $query_vars The existing query vars.
       * @return array $query_vars The modified query vars.
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      public function maybe_replace_page_query_var($query_vars) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $civi_query_arg = array_search('CiviCRM', $query_vars);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        // Bail if the query var is not 'page'.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (FALSE === $civi_query_arg || $civi_query_arg !== 'page') {
          return $query_vars;
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        unset($query_vars['page']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $query_vars['civiwp'] = 'CiviCRM';
    
        return $query_vars;
    
      }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      // ---------------------------------------------------------------------------
      // CiviCRM Initialisation
      // ---------------------------------------------------------------------------
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Initialize CiviCRM.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * This method has been moved to "includes/civicrm.admin.php"
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.33 Placeholder for backwards (and semantic) compatibility.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @return bool True if CiviCRM is initialized, false otherwise.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      public function initialize() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Pass to method in admin class.
        return $this->admin->initialize();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
      }
    
      // ---------------------------------------------------------------------------
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      // Load Resources
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      // ---------------------------------------------------------------------------
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Perform necessary stuff prior to CiviCRM being loaded on the front end.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * This needs to be a method because it can then be hooked into WordPress at
       * the right time.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.6
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function front_end_page_load() {
    
        static $frontend_loaded = FALSE;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ($frontend_loaded) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return;
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Add resources for front end.
        $this->add_core_resources(TRUE);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Merge CiviCRM's HTML header with the WordPress theme's header.
        add_action('wp_head', [$this, 'wp_head']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Set flag so this only happens once.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $frontend_loaded = TRUE;
    
      }
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Load only the CiviCRM CSS.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * This is needed because $this->front_end_page_load() is only called when
       * there is a single CiviCRM entity present on a page or archive and, whilst
       * we don't want all the Javascript to load, we do want stylesheets.
       *
       * @since 4.6
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function front_end_css_load() {
    
        static $frontend_css_loaded = FALSE;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ($frontend_css_loaded) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return;
        }
    
        if (!$this->initialize()) {
          return;
        }
    
        $config = CRM_Core_Config::singleton();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Default custom CSS to standalone.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $dependent = NULL;