Skip to content
Snippets Groups Projects
civicrm.php 45 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.7.0
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    Author: CiviCRM LLC
    
    Author URI: https://civicrm.org/
    Plugin URI: https://wiki.civicrm.org/confluence/display/CRMDOC/Installing+CiviCRM+for+WordPress
    
    GitHub Plugin URI: https://github.com/tadpolecc/civicrm.git
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    License: AGPL3
    Text Domain: civicrm
    Domain Path: /languages
    */
    
    
    /*
     +--------------------------------------------------------------------+
    
     | CiviCRM version 5                                                  |
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     +--------------------------------------------------------------------+
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     | Copyright CiviCRM LLC (c) 2004-2018                                |
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     +--------------------------------------------------------------------+
     | This file is a part of CiviCRM.                                    |
     |                                                                    |
     | CiviCRM is free software; you can copy, modify, and distribute it  |
     | under the terms of the GNU Affero General Public License           |
     | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
     |                                                                    |
     | CiviCRM is distributed in the hope that it will be useful, but     |
     | WITHOUT ANY WARRANTY; without even the implied warranty of         |
     | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.               |
     | See the GNU Affero General Public License for more details.        |
     |                                                                    |
     | You should have received a copy of the GNU Affero General Public   |
     | License and the CiviCRM Licensing Exception along                  |
     | with this program; if not, contact CiviCRM LLC                     |
     | at info[AT]civicrm[DOT]org. If you have questions about the        |
     | GNU Affero General Public License or the licensing of CiviCRM,     |
     | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
     +--------------------------------------------------------------------+
    */
    
    /**
     *
     * @package CRM
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * @copyright CiviCRM LLC (c) 2004-2018
    
    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/
    --------------------------------------------------------------------------------
    */
    
    
    // this file must not accessed directly
    if ( ! defined( 'ABSPATH' ) ) exit;
    
    
    // set version here: when it changes, will force JS to reload
    
    define( 'CIVICRM_PLUGIN_VERSION', '5' );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    // store reference to this file
    if (!defined('CIVICRM_PLUGIN_FILE')) {
      define( 'CIVICRM_PLUGIN_FILE', __FILE__ );
    }
    
    // store URL to this plugin's directory
    if (!defined( 'CIVICRM_PLUGIN_URL')) {
      define( 'CIVICRM_PLUGIN_URL', plugin_dir_url(CIVICRM_PLUGIN_FILE) );
    }
    
    // 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
    /**
     * 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' ) ) {
    
      /**
       * 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 Civi is installed
    if ( file_exists( CIVICRM_SETTINGS_PATH )  ) {
        define( 'CIVICRM_INSTALLED', TRUE );
      } else {
        define( 'CIVICRM_INSTALLED', FALSE );
    }
    
    // prevent CiviCRM from rendering its own header
    define( 'CIVICRM_UF_HEAD', TRUE );
    
    
    /**
     * Define CiviCRM_For_WordPress Class
     */
    class CiviCRM_For_WordPress {
    
    
      /**
       * Declare our properties
       */
    
      /**
       * @var CiviCRM_For_WordPress
       */
      private static $instance;
    
      // plugin context (broad)
      static $in_wordpress;
    
      // plugin context (specific)
      static $context;
    
      /**
       * @var CiviCRM_For_WordPress_Shortcodes
       */
      public $shortcodes;
    
      /**
       * @var CiviCRM_For_WordPress_Shortcodes_Modal
       */
      public $modal;
    
      /**
       * @var CiviCRM_For_WordPress_Basepage
       */
      public $basepage;
    
      /**
       * @var CiviCRM_For_WordPress_Users
       */
      public $users;
    
    
      // ---------------------------------------------------------------------------
      // Setup
      // ---------------------------------------------------------------------------
    
    
      /**
       * Getter method which returns the CiviCRM instance and optionally creates one
       * if it does not already exist. Standard CiviCRM singleton pattern.
       *
       * @return object CiviCRM plugin instance
       */
      public static function singleton() {
    
        // if it doesn't already exist...
        if ( ! isset( self::$instance ) ) {
    
          // create it
          self::$instance = new CiviCRM_For_WordPress;
          self::$instance->setup_instance();
    
        }
    
        // return existing instance
        return self::$instance;
    
      }
    
    
      /**
       * Dummy instance constructor
       */
      function __construct() {}
    
      /**
       * Dummy magic method to prevent CiviCRM_For_WordPress from being cloned
       */
      public function __clone() {
        _doing_it_wrong( __FUNCTION__, __( 'Only one instance of CiviCRM_For_WordPress please', 'civicrm' ), '4.4' );
      }
    
      /**
       * Dummy magic method to prevent CiviCRM_For_WordPress from being unserialized
       */
      public function __wakeup() {
        _doing_it_wrong( __FUNCTION__, __( 'Please do not serialize CiviCRM_For_WordPress', 'civicrm' ), '4.4' );
      }
    
    
      /**
       * Method that 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
       *
       * @return void
       */
      public function activate() {
    
        // set a one-time-only option
        add_option( 'civicrm_activation_in_progress', 'true' );
    
      }
    
    
      /**
       * Method that runs CiviCRM's plugin activation methods
       *
       * @return void
       */
      public function activation() {
    
        // if activating...
        if ( is_admin() && get_option( 'civicrm_activation_in_progress' ) == 'true' ) {
    
          // assign minimum capabilities for all WP roles and create 'anonymous_user' role
          $this->users->set_wp_user_capabilities();
    
          // set a one-time-only option to flag that we need to create a basepage -
          // it will not update the option once it has been set to another value nor
          // create a new option with the same name
          add_option( 'civicrm_activation_create_basepage', 'true' );
    
          // change option so this method never runs again
          update_option( 'civicrm_activation_in_progress', 'false' );
    
        }
    
        // if activating and we still haven't created the basepage...
        if (
          is_admin() &&
          get_option( 'civicrm_activation_create_basepage' ) == 'true' &&
          CIVICRM_INSTALLED
        ) {
    
          // create basepage
          add_action( 'wp_loaded', array( $this, 'create_wp_basepage' ) );
    
          // change option so this method never runs again
          update_option( 'civicrm_activation_create_basepage', 'done' );
    
        }
    
      }
    
    
      /**
       * Method that 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 the option that is set in activate() above
       *
       * @return void
       */
      public function deactivate() {
    
        // delete options
        delete_option( 'civicrm_activation_in_progress' );
        delete_option( 'civicrm_activation_create_basepage' );
    
      }
    
    
      /**
       * Set up the CiviCRM plugin instance
       *
       * @return void
       */
      public function setup_instance() {
    
        // kick out if another instance is being inited
        if ( isset( self::$in_wordpress ) ) {
          wp_die( __( 'Only one instance of CiviCRM_For_WordPress please', 'civicrm' ) );
        }
    
        // Store context
        $this->civicrm_in_wordpress_set();
    
        // there is no session handling in WP hence we start it for CiviCRM pages
        if (!session_id()) {
          session_start();
        }
    
        if ( $this->civicrm_in_wordpress() ) {
          // this is required for AJAX calls in WordPress admin
          $_GET['noheader'] = TRUE;
    
        }
    
        if ( !CIVICRM_INSTALLED && !$this->civicrm_in_wordpress() ) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $_GET['civicrm_install_type'] = 'wordpress';
        }
    
        // get classes and instantiate
        $this->include_files();
    
        // do plugin activation
        $this->activation();
    
        // register all hooks
        $this->register_hooks();
    
        // notify plugins
        do_action( 'civicrm_instance_loaded' );
    
      }
    
    
      /**
       * 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
       *
       * It is NOT true when CiviCRM is called via a shortcode
       *
       * @return void
       */
      public function civicrm_in_wordpress_set() {
    
        // store
        self::$in_wordpress = ( isset( $_GET['page'] ) && $_GET['page'] == 'CiviCRM' ) ? TRUE : FALSE;
    
      }
    
    
      /**
       * Getter for testing if CiviCRM is currently being displayed in WordPress.
       *
       * @see $this->civicrm_in_wordpress_set()
       *
       * @return bool $in_wordpress True if Civi is displayed in WordPress, false otherwise
       */
      public function civicrm_in_wordpress() {
    
        // already stored
        return apply_filters( 'civicrm_in_wordpress', self::$in_wordpress );
    
      }
    
    
      /**
       * 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
       *
       * The following codes correspond to the different contexts
       *
       * (a) 'admin'
       * (b) 'basepage'
       * (c) 'nonpage'
       * (d) 'shortcode'
       *
       * @param string $context
       *   One of the four context codes above
       * @return void
       */
      public function civicrm_context_set( $context ) {
    
        // store
        self::$context = $context;
    
      }
    
    
      /**
       * Getter for determining how CiviCRM is currently being displayed in WordPress.
       *
       * @see $this->civicrm_context_set()
       *
       * @return string
       *   The context in which Civi is displayed in WordPress
       */
      public function civicrm_context_get() {
    
        // already stored
        return apply_filters( 'civicrm_context', self::$context );
    
      }
    
    
      // ---------------------------------------------------------------------------
      // Files
      // ---------------------------------------------------------------------------
    
    
      /**
       * Include files
       *
       * @return void
       */
      public function include_files() {
    
        // include users class
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.users.php';
        $this->users = new CiviCRM_For_WordPress_Users;
    
        // include shortcodes class
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.shortcodes.php';
        $this->shortcodes = new CiviCRM_For_WordPress_Shortcodes;
    
        // include shortcodes modal dialog class
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.shortcodes.modal.php';
        $this->modal = new CiviCRM_For_WordPress_Shortcodes_Modal;
    
        // include basepage class
        include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.basepage.php';
        $this->basepage = new CiviCRM_For_WordPress_Basepage;
    
      }
    
    
      // ---------------------------------------------------------------------------
      // Hooks
      // ---------------------------------------------------------------------------
    
    
      /**
       * Register hooks
       *
       * @return void
       */
      public function register_hooks() {
    
        // always add the common hooks
        $this->register_hooks_common();
    
        // when in WordPress admin...
        if ( is_admin() ) {
    
          // set context
          $this->civicrm_context_set( 'admin' );
    
          // handle WP admin context
          $this->register_hooks_admin();
          return;
    
        }
    
        // go no further if Civi not installed yet
        if ( ! CIVICRM_INSTALLED ) return;
    
        // when embedded via wpBasePage or AJAX call...
        if ( $this->civicrm_in_wordpress() ) {
    
          /**
           * 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() ) {
    
            // set context
            $this->civicrm_context_set( 'nonpage' );
    
            // add core resources for front end
            add_action( 'wp', array( $this, 'front_end_page_load' ) );
    
            // echo all output when WP has been set up but nothing has been rendered
            add_action( 'wp', array( $this, 'invoke' ) );
            return;
    
          }
    
          // set context
          $this->civicrm_context_set( 'basepage' );
    
          // if we get here, we must be in a wpBasePage context
          $this->basepage->register_hooks();
          return;
    
        }
    
        // set context
        $this->civicrm_context_set( 'shortcode' );
    
        // that leaves us with handling shortcodes, should they exist
        $this->shortcodes->register_hooks();
    
      }
    
    
      /**
       * Register hooks that must always be present
       *
       * @return void
       */
      public function register_hooks_common() {
    
        // use translation files
        add_action( 'plugins_loaded', array( $this, 'enable_translation' ) );
    
        // register user hooks
        $this->users->register_hooks();
    
      }
    
    
      /**
       * Register hooks to handle CiviCRM in a WordPress admin context
       *
       * @return void
       */
      public function register_hooks_admin() {
    
        // modify the admin menu
        add_action( 'admin_menu', array( $this, 'add_menu_items' ) );
    
        // set page title
        add_filter( 'admin_title', array( $this, 'set_admin_title' ) );
    
        // print CiviCRM's header
        add_action('admin_head', array( $this, 'wp_head' ), 50);
    
        // if settings file does not exist, show notice with link to installer
        if ( ! CIVICRM_INSTALLED ) {
          if ( isset( $_GET['page'] ) && $_GET['page'] == 'civicrm-install' ) {
            // register hooks for installer page?
          } else {
            // show notice
            add_action( 'admin_notices', array( $this, 'show_setup_warning' ) );
          }
        }
    
        // enable shortcode modal
        $this->modal->register_hooks();
    
      }
    
    
      // ---------------------------------------------------------------------------
      // CiviCRM Initialisation
      // ---------------------------------------------------------------------------
    
    
      /**
       * Initialize CiviCRM
       *
       * @return bool $success
       */
      public function initialize() {
    
        static $initialized = FALSE;
        static $failure = FALSE;
    
        if ( $failure ) {
          return FALSE;
        }
    
        if ( ! $initialized ) {
    
          // Check for php version and ensure its greater than minPhpVersion
          $minPhpVersion = '5.3.4';
          if ( version_compare( PHP_VERSION, $minPhpVersion ) < 0 ) {
            echo '<p>' .
               sprintf(
                __( 'CiviCRM requires PHP Version %s or greater. You are running PHP Version %s', 'civicrm' ),
                $minPhpVersion,
                PHP_VERSION
               ) .
               '<p>';
            exit();
          }
    
          // check for settings
          if ( ! CIVICRM_INSTALLED ) {
            $error = FALSE;
          } elseif ( file_exists( CIVICRM_SETTINGS_PATH) ) {
            $error = include_once ( CIVICRM_SETTINGS_PATH );
          }
    
          // autoload
          require_once 'CRM/Core/ClassLoader.php';
          CRM_Core_ClassLoader::singleton()->register();
    
          // get ready for problems
          $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
          $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
          );
    
          // does install message get used?
          $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;
          }
    
          // access global defined in civicrm.settings.php
          global $civicrm_root;
    
          // this does pretty much all of the civicrm initialization
          if ( ! file_exists( $civicrm_root . 'CRM/Core/Config.php' ) ) {
            $error = FALSE;
          } else {
            $error = include_once ( 'CRM/Core/Config.php' );
          }
    
          // have we got it?
          if ( $error == FALSE ) {
    
            // set static flag
            $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>"
            );
    
            // won't reach here!
            return FALSE;
    
          }
    
          // set static flag
          $initialized = TRUE;
    
          // initialize the system by creating a config object
          $config = CRM_Core_Config::singleton();
          //print_r( $config ); die();
    
          // sync the logged in user with WP
          global $current_user;
          if ( $current_user ) {
    
            // sync procedure sets session values for logged in users
            require_once 'CRM/Core/BAO/UFMatch.php';
            CRM_Core_BAO_UFMatch::synchronize(
              $current_user, // user object
              FALSE, // do not update
              'WordPress', // CMS
              $this->users->get_civicrm_contact_type('Individual')
            );
    
          }
    
        }
    
        // notify plugins
        do_action( 'civicrm_initialized' );
    
        // success!
        return TRUE;
    
      }
    
    
      // ---------------------------------------------------------------------------
      // Plugin setup
      // ---------------------------------------------------------------------------
    
    
      /**
       * Load translation files
       * A good reference on how to implement translation in WordPress:
       * http://ottopress.com/2012/internationalization-youre-probably-doing-it-wrong/
       *
       * @return void
       */
      public function enable_translation() {
    
        // not used, as there are no translations as yet
        load_plugin_textdomain(
    
          // unique name
          'civicrm',
    
          // deprecated argument
          FALSE,
    
          // relative path to directory containing translation files
          dirname( plugin_basename( __FILE__ ) ) . '/languages/'
    
        );
    
      }
    
    
      /**
       * Adds menu items to WordPress admin menu
       * Callback method for 'admin_menu' hook as set in register_hooks()
       *
       * @return void
       */
      public function add_menu_items() {
    
    
        $civilogo = file_get_contents( plugin_dir_path( __FILE__ ) . 'assets/civilogo.svg.b64' );
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // check for settings file
        if ( CIVICRM_INSTALLED ) {
    
          // add top level menu item
          $menu_page = add_menu_page(
            __( 'CiviCRM', 'civicrm' ),
            __( 'CiviCRM', 'civicrm' ),
            'access_civicrm',
            'CiviCRM',
            array( $this, 'invoke' ),
            $civilogo,
            apply_filters( 'civicrm_menu_item_position', '3.904981' ) // 3.9 + random digits to reduce risk of conflict
          );
    
          // add core resources prior to page load
          add_action( 'load-' . $menu_page, array( $this, 'admin_page_load' ) );
    
        } else {
    
          // add top level menu item
          $menu_page = add_menu_page(
            __( 'CiviCRM Installer', 'civicrm' ),
            __( 'CiviCRM Installer', 'civicrm' ),
            'manage_options',
            'civicrm-install',
            array( $this, 'run_installer' ),
            $civilogo,
            apply_filters( 'civicrm_menu_item_position', '3.904981' ) // 3.9 + random digits to reduce risk of conflict
          );
    
          /*
          // add scripts and styles like this
          add_action( 'admin_print_scripts-' . $options_page, array( $this, 'admin_installer_js' ) );
          add_action( 'admin_print_styles-' . $options_page, array( $this, 'admin_installer_css' ) );
          add_action( 'admin_head-' . $options_page, array( $this, 'admin_installer_head' ), 50 );
          */
    
        }
    
      }
    
    
      // ---------------------------------------------------------------------------
      // Installation
      // ---------------------------------------------------------------------------
    
    
      /**
       * Callback method for add_options_page() that runs the CiviCRM installer
       *
       * @return void
       */
      public function run_installer() {
    
        $civicrmCore = CIVICRM_PLUGIN_DIR . 'civicrm';
    
        $setupPaths = array(
          implode(DIRECTORY_SEPARATOR, ['vendor', 'civicrm', 'civicrm-setup']),
          implode(DIRECTORY_SEPARATOR, ['packages', 'civicrm-setup',]),
          implode(DIRECTORY_SEPARATOR, ['setup']),
        );
        foreach ($setupPaths as $setupPath) {
          $loader = implode(DIRECTORY_SEPARATOR, [$civicrmCore, $setupPath, 'civicrm-setup-autoload.php']);
          if (file_exists($civicrmCore . DIRECTORY_SEPARATOR . '.use-civicrm-setup') && file_exists($loader)) {
            require_once $loader;
            require_once implode(DIRECTORY_SEPARATOR, [$civicrmCore, 'CRM', 'Core', 'ClassLoader.php']);
            CRM_Core_ClassLoader::singleton()->register();
            \Civi\Setup::assertProtocolCompatibility(1.0);
            \Civi\Setup::init([
              'cms' => 'WordPress',
              'srcPath' => $civicrmCore,
            ]);
            $ctrl = \Civi\Setup::instance()->createController()->getCtrl();
            $ctrl->setUrls(array(
              'ctrl' => admin_url() . "options-general.php?page=civicrm-install",
              'res' => CIVICRM_PLUGIN_URL . 'civicrm/' . strtr($setupPath, DIRECTORY_SEPARATOR, '/') . '/res/',
              'jquery.js' => CIVICRM_PLUGIN_URL . 'civicrm/bower_components/jquery/dist/jquery.min.js',
              'font-awesome.css' => CIVICRM_PLUGIN_URL . 'civicrm/bower_components/font-awesome/css/font-awesome.min.css',
              'finished' => admin_url('admin.php?page=CiviCRM&q=civicrm&reset=1'),
            ));
            \Civi\Setup\BasicRunner::run($ctrl);
            return;
          }
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        // uses CIVICRM_PLUGIN_DIR instead of WP_PLUGIN_DIR
        $installFile =
          CIVICRM_PLUGIN_DIR .
          'civicrm' . DIRECTORY_SEPARATOR .
          'install' . DIRECTORY_SEPARATOR .
          'index.php';
    
        // Notice: Undefined variable: siteDir in:
        // CIVICRM_PLUGIN_DIR/civicrm/install/index.php on line 456
        include ( $installFile );
    
      }
    
    
      /**
       * Callback method for missing settings file in register_hooks()
       *
       * @return void
       */
      public function show_setup_warning() {
    
        $installLink = admin_url() . "options-general.php?page=civicrm-install";
        echo '<div id="civicrm-warning" class="updated fade">' .
           '<p><strong>' .
           __( 'CiviCRM is almost ready.', 'civicrm' ) .
           '</strong> ' .
           sprintf(
            __( 'You must <a href="%s">configure CiviCRM</a> for it to work.', 'civicrm' ),
            $installLink
           ) .
           '</p></div>';
    
      }
    
    
      /**
       * Create WordPress basepage and save setting
       *
       * @return void
       */
      public function create_wp_basepage() {
    
        if (!$this->initialize()) {
          return;
        }
    
        $config = CRM_Core_Config::singleton();
    
        // bail if we already have a basepage setting
        if ( !empty( $config->wpBasePage ) ) {
          return;
        }
    
        // default page slug, but allow overrides
        $slug = apply_filters( 'civicrm_basepage_slug', 'civicrm' );
    
        // get existing page with that slug
        $page = get_page_by_path( $slug );
    
        // does it exist?
        if ( $page ) {
    
          // we already have a basepage
          $result = $page->ID;
    
        } else {
    
          // create the basepage
          $result = $this->create_basepage( $slug );
    
        }
    
        // were we successful?
        if ( $result !== 0 AND !is_wp_error($result) ) {
    
          // get the post object
          $post = get_post( $result );
    
          $params = array(
            'version' => 3,
            'wpBasePage' => $post->post_name,
          );
    
          // save the setting
          civicrm_api3('setting', 'create', $params);
    
        }
    
      }
    
    
      /**
       * Create a WordPress page to act as the CiviCRM base page.
       *
       * @param string $slug The unique slug for the page - same as wpBasePage setting
       * @return int|WP_Error The page ID on success. The value 0 or WP_Error on failure
       */
      private function create_basepage( $slug ) {
    
        // if multisite, switch to main site
        if ( is_multisite() && !is_main_site() ) {
    
          // store this site
          $original_site = get_current_blog_id();
    
          // switch
          global $current_site;
          switch_to_blog( $current_site->blog_id );
    
        }
    
        // define basepage
        $page = array(
          'post_status' => 'publish',
          'post_type' => 'page',
          'post_parent' => 0,
          'comment_status' => 'closed',
          'ping_status' => 'closed',
          'to_ping' => '', // quick fix for Windows
          'pinged' => '', // quick fix for Windows
          'post_content_filtered' => '', // quick fix for Windows
          'post_excerpt' => '', // quick fix for Windows
          'menu_order' => 0,
          'post_name' => $slug,
        );
    
        // default page title, but allow overrides
        $page['post_title'] = apply_filters( 'civicrm_basepage_title', __( 'CiviCRM', 'civicrm' ) );
    
        // default content
        $content = __( 'Do not delete this page. Page content is generated by CiviCRM.', 'civicrm' );
    
        // set, but allow overrides
        $page['post_content'] = apply_filters( 'civicrm_basepage_content', $content );
    
        // insert the post into the database
        $page_id = wp_insert_post( $page );
    
        // switch back if we've switched
        if ( isset( $original_site ) ) {
          restore_current_blog();
        }
    
        return $page_id;
      }
    
    
      // ---------------------------------------------------------------------------
      // HTML head
      // ---------------------------------------------------------------------------
    
    
      /**
       * Perform necessary stuff prior to CiviCRM's admin page being loaded
       * This needs to be a method because it can then be hooked into WP at the
       * right time
       *
       * @return void
       */
      public function admin_page_load() {
    
        // add resources for back end
        $this->add_core_resources( FALSE );
    
        // check setting for path to wp-load.php
        $this->add_wpload_setting();
    
      }
    
    
      /**
       * When CiviCRM is loaded in WP Admin, check for the existence of a setting