Skip to content
Snippets Groups Projects
civicrm.php 42 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Load core CSS.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'disable_core_css')) {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Enqueue stylesheet.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          wp_enqueue_style(
            'civicrm_css',
            $config->resourceBase . 'css/civicrm.css',
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // Dependencies.
            NULL,
            // Version.
            CIVICRM_PLUGIN_VERSION,
            // Media.
            'all'
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Custom CSS is dependent.
          $dependent = ['civicrm_css'];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Load custom CSS.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!empty($config->customCSSURL)) {
          wp_enqueue_style(
            'civicrm_custom_css',
            $config->customCSSURL,
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // Dependencies.
            $dependent,
            // Version.
            CIVICRM_PLUGIN_VERSION,
            // Media.
            'all'
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Set flag so this only happens once.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $frontend_css_loaded = TRUE;
    
      }
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Add CiviCRM core resources.
       *
       * @since 4.6
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @param bool $front_end True if on WordPress front end, false otherwise.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      public function add_core_resources($front_end = TRUE) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        if (!$this->initialize()) {
          return;
        }
    
        $config = CRM_Core_Config::singleton();
        $config->userFrameworkFrontend = $front_end;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Add CiviCRM core resources.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        CRM_Core_Resources::singleton()->addCoreResources();
    
      }
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Merge CiviCRM's HTML header with the WordPress theme's header.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Callback from WordPress 'admin_head' and 'wp_head' hooks.
       *
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function wp_head() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!$this->initialize()) {
          return;
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /*
         * CRM-11823
         * If CiviCRM bootstrapped, then merge its HTML header with the CMS's header.
         */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        global $civicrm_root;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (empty($civicrm_root)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return;
        }
    
        $region = CRM_Core_Region::instance('html-header', FALSE);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ($region) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          echo '<!-- CiviCRM html header -->';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          echo $region->render('');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        }
    
      }
    
      // ---------------------------------------------------------------------------
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      // CiviCRM Invocation (this outputs CiviCRM's markup)
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      // ---------------------------------------------------------------------------
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Invoke CiviCRM in a WordPress context.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Callback function from add_menu_page()
       * Callback from WordPress 'init' and 'the_content' hooks
       * Also called by shortcode_render() and _civicrm_update_user()
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function invoke() {
    
        static $alreadyInvoked = FALSE;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ($alreadyInvoked) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return;
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Bail if this is called via a content-preprocessing plugin.
        if ($this->is_page_request() && !in_the_loop() && !is_admin()) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return;
        }
    
        if (!$this->initialize()) {
          return;
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /*
         * CRM-12523
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * WordPress has it's own timezone calculations. CiviCRM relies on the PHP
         * default timezone which WordPress overrides with UTC in wp-settings.php
    
        $original_timezone = date_default_timezone_get();
        $wp_site_timezone = $this->get_timezone_string();
        if ($wp_site_timezone) {
    
          // phpcs:ignore WordPress.DateTime.RestrictedFunctions.timezone_change_date_default_timezone_set
    
          date_default_timezone_set($wp_site_timezone);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          CRM_Core_Config::singleton()->userSystem->setMySQLTimeZone();
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /*
         * CRM-95XX
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * At this point we are in a CiviCRM context. WordPress always quotes the
         * request, so CiviCRM needs to reverse what it just did.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->remove_wp_magic_quotes();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Required for AJAX calls.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ($this->civicrm_in_wordpress()) {
          $_REQUEST['noheader'] = $_GET['noheader'] = TRUE;
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Code inside invoke() requires the current user to be set up.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $current_user = wp_get_current_user();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Bypass synchronize if running upgrade to avoid any serious non-recoverable
         * error which might hinder the upgrade process.
         */
    
        // phpcs:ignore WordPress.Security.NonceVerification.Recommended
        if (CRM_Utils_Array::value('q', $_GET) !== 'civicrm/upgrade') {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $this->users->sync_user($current_user);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Set flag.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $alreadyInvoked = TRUE;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Get args.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $argdata = $this->get_request_args();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Set dashboard as default if args are empty.
        if (empty($argdata['argString'])) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $_GET['q'] = 'civicrm/dashboard';
          $_GET['reset'] = 1;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $argdata['args'] = ['civicrm', 'dashboard'];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Do the business.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        CRM_Core_Invoke::invoke($argdata['args']);
    
    
        // Restore original timezone.
        if ($original_timezone) {
    
          // phpcs:ignore WordPress.DateTime.RestrictedFunctions.timezone_change_date_default_timezone_set
    
          date_default_timezone_set($original_timezone);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Restore WordPress's arrays.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->restore_wp_magic_quotes();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /**
         * Broadcast that CiviCRM has been invoked.
         *
         * @since 4.4
         */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        do_action('civicrm_invoked');
    
      /**
       * Returns the timezone string for the current WordPress site.
       *
       * If a timezone identifier is used, return that.
       * If an offset is used, try to build a suitable timezone.
       * If all else fails, uses UTC.
       *
       * @since 5.64
       *
       * @return string $tzstring The site timezone string.
       */
      private function get_timezone_string() {
    
        // Return the timezone string when set.
        $tzstring = get_option('timezone_string');
        if (!empty($tzstring)) {
          return $tzstring;
        }
    
        /*
         * Try and build a deprecated (but currently valid) timezone string
         * from the GMT offset value.
         *
         * Note: manual offsets should be discouraged. WordPress works more
         * reliably when setting an actual timezone (e.g. "Europe/London")
         * because of support for Daylight Saving changes.
         *
         * Note: the IANA timezone database that provides PHP's timezone
         * support uses (reversed) POSIX style signs.
         *
         * @see https://www.php.net/manual/en/timezones.others.php
         */
        $offset = get_option('gmt_offset');
    
        // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
    
        if (0 != $offset && floor($offset) == $offset) {
    
          $offset_int = (int) $offset;
          $offset_string = $offset > 0 ? "-$offset" : '+' . abs($offset_int);
    
          $tzstring = 'Etc/GMT' . $offset_string;
        }
    
        // Default to "UTC" if the timezone string is still empty.
        if (empty($tzstring)) {
          $tzstring = 'UTC';
        }
    
        return $tzstring;
    
      }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Non-destructively override WordPress magic quotes.
       *
       * Only called by invoke() to undo WordPress default behaviour.
    
    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.7 Rewritten to work with query vars.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      private function remove_wp_magic_quotes() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
        // phpcs:disable WordPress.Security.NonceVerification.Recommended
        // phpcs:disable WordPress.Security.NonceVerification.Missing
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Save original arrays.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->wp_get     = $_GET;
        $this->wp_post    = $_POST;
        $this->wp_cookie  = $_COOKIE;
        $this->wp_request = $_REQUEST;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Reassign globals.
        $_GET     = stripslashes_deep($_GET);
        $_POST    = stripslashes_deep($_POST);
        $_COOKIE  = stripslashes_deep($_COOKIE);
        $_REQUEST = stripslashes_deep($_REQUEST);
    
        // phpcs:enable WordPress.Security.NonceVerification.Recommended
        // phpcs:enable WordPress.Security.NonceVerification.Missing
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Test for query var.
        $q = get_query_var('q');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!empty($q)) {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $page = get_query_var('civiwp');
          $reset = get_query_var('reset');
          $id = get_query_var('id');
          $html = get_query_var('html');
          $snippet = get_query_var('snippet');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $action = get_query_var('action');
          $mode = get_query_var('mode');
          $cid = get_query_var('cid');
          $gid = get_query_var('gid');
          $sid = get_query_var('sid');
          $cs = get_query_var('cs');
          $force = get_query_var('force');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          $_REQUEST['q'] = $_GET['q'] = $q;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $_REQUEST['civiwp'] = $_GET['civiwp'] = 'CiviCRM';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!empty($reset)) {
            $_REQUEST['reset'] = $_GET['reset'] = $reset;
          }
          if (!empty($id)) {
            $_REQUEST['id'] = $_GET['id'] = $id;
          }
          if (!empty($html)) {
            $_REQUEST['html'] = $_GET['html'] = $html;
          }
          if (!empty($snippet)) {
            $_REQUEST['snippet'] = $_GET['snippet'] = $snippet;
          }
    
          if (!empty($action)) {
            $_REQUEST['action'] = $_GET['action'] = $action;
          }
          if (!empty($mode)) {
            $_REQUEST['mode'] = $_GET['mode'] = $mode;
          }
          if (!empty($cid)) {
            $_REQUEST['cid'] = $_GET['cid'] = $cid;
          }
          if (!empty($gid)) {
            $_REQUEST['gid'] = $_GET['gid'] = $gid;
          }
          if (!empty($sid)) {
            $_REQUEST['sid'] = $_GET['sid'] = $sid;
          }
          if (!empty($cs)) {
            $_REQUEST['cs'] = $_GET['cs'] = $cs;
          }
          if (!empty($force)) {
            $_REQUEST['force'] = $_GET['force'] = $force;
          }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          /**
           * Broadcast that CiviCRM query vars have been assigned.
           *
           * Use in combination with `civicrm_query_vars` filter to ensure that any
           * other query vars are included in the assignment to the super-global
           * arrays.
           *
           * @since 5.7
           */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          do_action('civicrm_query_vars_assigned');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Restore WordPress magic quotes.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Only called by invoke() to redo WordPress default behaviour.
       *
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      private function restore_wp_magic_quotes() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Restore original arrays.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $_GET     = $this->wp_get;
        $_POST    = $this->wp_post;
        $_COOKIE  = $this->wp_cookie;
        $_REQUEST = $this->wp_request;
    
    
        unset($this->wp_get, $this->wp_post, $this->wp_cookie, $this->wp_request);
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Detect Ajax, snippet, or file requests.
       *
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @return boolean $is_page True if request is for a CiviCRM page, false otherwise.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function is_page_request() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Assume not a CiviCRM page.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $is_page = FALSE;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Bail if no CiviCRM.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!$this->initialize()) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return $return;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Get request args.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $argdata = $this->get_request_args();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Try and populate "html" query var for testing snippet requests.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $html = get_query_var('html');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (empty($html)) {
    
          // We do not use $html apart to test for empty.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
    
          $html = isset($_GET['html']) ? wp_unslash($_GET['html']) : '';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /*
         * FIXME: It's not sustainable to hardcode a whitelist of all of non-HTML
         * pages. Maybe the menu-XML should include some metadata to make this
         * unnecessary?
         */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        // Is this an AJAX request?
        $is_ajax = (CRM_Utils_Array::value('HTTP_X_REQUESTED_WITH', $_SERVER) === 'XMLHttpRequest') ? TRUE : FALSE;
    
        // Is this a non-page CiviCRM path?
        $paths = ['ajax', 'file', 'asset'];
        $is_civicrm_path = ($argdata['args'][0] === 'civicrm' && in_array($argdata['args'][1], $paths)) ? TRUE : FALSE;
    
        // Is this a CiviCRM "snippet" request?
        // phpcs:ignore WordPress.Security.NonceVerification.Recommended
        $is_snippet = !empty($_REQUEST['snippet']) ? TRUE : FALSE;
    
        // Is this a CiviCRM iCal file request?
        $is_ical = (strpos($argdata['argString'], 'civicrm/event/ical') === 0 && empty($html)) ? TRUE : FALSE;
    
        // Is this a CiviCRM image file request?
        $is_image = (strpos($argdata['argString'], 'civicrm/contact/imagefile') === 0) ? TRUE : FALSE;
    
        // Any one of the above conditions being true means this is a "non-page" request.
        $non_page = ($is_ajax || $is_civicrm_path || $is_snippet || $is_ical || $is_image) ? TRUE : FALSE;
    
        /**
         * Filter the result of the "non-page" checks.
         *
         * This filter can be used to force CiviCRM into considering a given request to be
         * a "non-page" request (return TRUE) or a "page" request (return FALSE).
         *
         * @since 5.74
         *
         * @param bool $non_page Boolean TRUE for requests that CiviCRM should not render as a "page".
         * @param array $argdata The arguments and request string from query vars.
         */
        $non_page = apply_filters('civicrm_is_non_page_request', $non_page, $argdata);
    
        if ($non_page) {
          $is_page = FALSE;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        }
        else {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $is_page = TRUE;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        return $is_page;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Get arguments and request string from query vars.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.6
       *
    
       * @return array{args: array, argString: string}
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function get_request_args() {
    
    
        $argString = '';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $args = [];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Get path from query vars.
        $q = get_query_var('q');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (empty($q)) {
    
          // phpcs:disable WordPress.Security.NonceVerification.Recommended
          $q = isset($_GET['q']) ? sanitize_text_field(wp_unslash($_GET['q'])) : '';
          // phpcs:enable WordPress.Security.NonceVerification.Recommended
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /*
         * Fix 'civicrm/civicrm' elements derived from CRM:url()
         * @see https://lab.civicrm.org/dev/rc/issues/5#note_16205
         */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (defined('CIVICRM_CLEANURL') && CIVICRM_CLEANURL) {
          if (substr($q, 0, 16) === 'civicrm/civicrm/') {
            $q = str_replace('civicrm/civicrm/', 'civicrm/', $q);
            $_REQUEST['q'] = $_GET['q'] = $q;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            set_query_var('q', $q);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
        }
    
        if (!empty($q)) {
          $argString = trim($q);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Remove / from the beginning and ending of query string.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $argString = trim($argString, '/');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $args = explode('/', $argString);
        }
        $args = array_pad($args, 2, '');
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        return [
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          'args' => $args,
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          'argString' => $argString,
        ];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Get base URL.
       *
    
       * Clone of CRM_Utils_System_WordPress::getBaseUrl() whose access was set to
       * private. Now that it is public, we can access that method instead.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
       * @since 4.4
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @param bool $absolute Passing TRUE prepends the scheme and domain, FALSE doesn't.
       * @param bool $frontend Passing FALSE returns the admin URL.
    
       * @param bool $forceBackend Passing TRUE overrides $frontend and returns the admin URL.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @return mixed|null|string
       */
      public function get_base_url($absolute, $frontend, $forceBackend) {
    
        _deprecated_function(__METHOD__, '5.69', 'CRM_Utils_System::getBaseUrl');
    
        $config = CRM_Core_Config::singleton();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ((is_admin() && !$frontend) || $forceBackend) {
    
          return Civi::paths()->getUrl('[wp.backend]/.', $absolute ? 'absolute' : 'relative');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        }
    
        else {
          return Civi::paths()->getUrl('[wp.frontend]/.', $absolute ? 'absolute' : 'relative');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * -----------------------------------------------------------------------------
     * Procedures start here
     * -----------------------------------------------------------------------------
     */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    /**
     * The main function responsible for returning the CiviCRM_For_WordPress instance
     * to functions everywhere.
     *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * Use this function like you would a global variable, except without needing to
     * declare the global.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     *
     * Example: $civi = civi_wp();
     *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * @since 4.4
     *
     * @return CiviCRM_For_WordPress The plugin instance.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     */
    function civi_wp() {
      return CiviCRM_For_WordPress::singleton();
    }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    /*
     * Instantiate CiviCRM_For_WordPress immediately.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     *
     * @see CiviCRM_For_WordPress::setup_instance()
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    civi_wp();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * Tell WordPress to call plugin activation method - no longer calls legacy
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * global scope function.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    register_activation_hook(CIVICRM_PLUGIN_FILE, [civi_wp(), 'activate']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * Tell WordPress to call plugin deactivation method - needed in order to reset
     * the option that is set on activation.
     */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    register_deactivation_hook(CIVICRM_PLUGIN_FILE, [civi_wp(), 'deactivate']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * Uninstall uses the 'uninstall.php' method.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * @see https://developer.wordpress.org/reference/functions/register_uninstall_hook/
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     */