Skip to content
Snippets Groups Projects
civicrm.shortcodes.modal.php 4.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • Kevin Cristiano's avatar
    Kevin Cristiano committed
    <?php
    /*
     +--------------------------------------------------------------------+
    
    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
     *
     */
    
    
    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
     * Define CiviCRM_For_WordPress_Shortcodes_Modal Class.
     *
     * @since 4.6
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     */
    class CiviCRM_For_WordPress_Shortcodes_Modal {
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @var object
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Plugin object reference.
       * @since 4.6
       * @access public
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public $civi;
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Instance constructor.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.6
    
    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
        // Store reference to CiviCRM plugin object.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->civi = civi_wp();
    
      }
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Register hooks to handle the shortcode modal.
    
    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 register_hooks() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Bail if CiviCRM not installed yet.
        if (!CIVICRM_INSTALLED) {
          return;
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /*
         * Adds the CiviCRM button to post and page edit screens.
         * Use priority 100 to position button to the far right.
         */
        add_action('media_buttons', [$this, 'add_form_button'], 100);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Add the Javascript and styles to make it all happen.
        add_action('load-post.php', [$this, 'add_core_resources']);
        add_action('load-post-new.php', [$this, 'add_core_resources']);
        add_action('load-page.php', [$this, 'add_core_resources']);
        add_action('load-page-new.php', [$this, 'add_core_resources']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Add button to editor for selected WordPress Post Types.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Callback method for 'media_buttons' hook as set in register_hooks().
       *
       * @since 4.7
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function add_form_button() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Add button to selected WordPress Post Types, if allowed.
        if ($this->post_type_has_button()) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
          // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $civilogo = file_get_contents(CIVICRM_PLUGIN_DIR . 'assets/images/civilogo.svg.b64');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $url = admin_url('admin.php?page=CiviCRM&q=civicrm/shortcode&reset=1');
          echo '<a href= "' . $url . '" class="button crm-shortcode-button" style="padding-left: 4px;" title="' . __('Add CiviCRM Public Pages', 'civicrm') . '"><img src="' . $civilogo . '" height="15" width="15" alt="' . __('Add CiviCRM Public Pages', 'civicrm') . '" style="margin: -3px 1px 0 -2px;" />' . __('CiviCRM', 'civicrm') . '</a>';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Add core resources.
       *
       * Callback method as set in register_hooks().
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.7
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function add_core_resources() {
        if ($this->civi->initialize()) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          Civi::resources()
            ->addCoreResources()
            ->addScriptFile('civicrm', 'js/crm.insert-shortcode.js', 0, 'html-header');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        }
      }
    
      /**
       * Does a WordPress post type have the CiviCRM button on it?
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.6
       *
       * @return bool $has_button True if the post type has the button, false otherwise.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function post_type_has_button() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Get screen object.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $screen = get_current_screen();
    
    
        // Bail if no post type - e.g. Ninja Forms.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!isset($screen->post_type)) {
          return;
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Get post types that support the editor.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $capable_post_types = $this->get_post_types_with_editor();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Default allowed to true on all capable post types.
        $allowed = (in_array($screen->post_type, $capable_post_types)) ? TRUE : FALSE;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /**
         * Filter the appearance of the CiviCRM button.
         *
         * @since 4.6
         *
         * @param bool $allowed True if the button is allowed, false otherwise.
         * @param object $screen The current WordPress screen object.
         */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $allowed = apply_filters('civicrm_restrict_button_appearance', $allowed, $screen);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        return $allowed;
    
      }
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Get WordPress post types that support the editor.
       *
       * @since 4.6
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @return array $supported_post_types Array of post types that have an editor.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function get_post_types_with_editor() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        static $supported_post_types = [];
        if (!empty($supported_post_types)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return $supported_post_types;
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Get only post types with an admin UI.
        $args = [
          'public' => TRUE,
          'show_ui' => TRUE,
        ];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Get post types.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $post_types = get_post_types($args);
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        foreach ($post_types as $post_type) {
          // Filter only those which have an editor.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (post_type_supports($post_type, 'editor')) {
            $supported_post_types[] = $post_type;
          }
        }
    
        return $supported_post_types;
      }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    }