Skip to content

Instantly share code, notes, and snippets.

@DeoThemes
Last active June 15, 2022 17:14
Show Gist options
  • Save DeoThemes/af8a369b33dc8920118c82cae2af3078 to your computer and use it in GitHub Desktop.
Save DeoThemes/af8a369b33dc8920118c82cae2af3078 to your computer and use it in GitHub Desktop.
A simple Elementor extension to create icon boxes with custom icon font.
<?php
/**
* Plugin Name: Deo Elementor Extension
* Description: Custom Elementor extension.
* Plugin URI: https://elementor.com/
* Version: 1.0.0
* Author: DeoThemes
* Author URI: https://elementor.com/
* Text Domain: deo-elementor-extension
*/
namespace DeoThemes;
use DeoThemes\Widgets\Deo_Icon_Box_Widget;
use DeoThemes\Controls\Deo_Icon_Box_Control;
define( 'DEO_PLUGIN_PATH', plugin_dir_path( __FILE__ ) );
define( 'DEO_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly.
/**
* Main Elementor Test Extension Class
*
* The main class that initiates and runs the plugin.
*
* @since 1.0.0
*/
final class Deo_Elementor_Extension {
/**
* Plugin Version
*
* @since 1.0.0
*
* @var string The plugin version.
*/
const VERSION = '1.0.0';
/**
* Minimum Elementor Version
*
* @since 1.0.0
*
* @var string Minimum Elementor version required to run the plugin.
*/
const MINIMUM_ELEMENTOR_VERSION = '2.0.0';
/**
* Minimum PHP Version
*
* @since 1.0.0
*
* @var string Minimum PHP version required to run the plugin.
*/
const MINIMUM_PHP_VERSION = '7.0';
/**
* Instance
*
* @since 1.0.0
*
* @access private
* @static
*
* @var Elementor_Test_Extension The single instance of the class.
*/
private static $_instance = null;
/**
* Instance
*
* Ensures only one instance of the class is loaded or can be loaded.
*
* @since 1.0.0
*
* @access public
* @static
*
* @return Elementor_Test_Extension An instance of the class.
*/
public static function instance() {
if ( is_null( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
/**
* Constructor
*
* @since 1.0.0
*
* @access public
*/
public function __construct() {
add_action( 'init', [ $this, 'i18n' ] );
add_action( 'plugins_loaded', [ $this, 'init' ] );
}
/**
* Load Textdomain
*
* Load plugin localization files.
*
* Fired by `init` action hook.
*
* @since 1.0.0
*
* @access public
*/
public function i18n() {
load_plugin_textdomain( 'elementor-test-extension' );
}
/**
* Initialize the plugin
*
* Load the plugin only after Elementor (and other plugins) are loaded.
* Checks for basic plugin requirements, if one check fail don't continue,
* if all check have passed load the files required to run the plugin.
*
* Fired by `plugins_loaded` action hook.
*
* @since 1.0.0
*
* @access public
*/
public function init() {
// Check if Elementor installed and activated
if ( ! did_action( 'elementor/loaded' ) ) {
add_action( 'admin_notices', [ $this, 'admin_notice_missing_main_plugin' ] );
return;
}
// Check for required Elementor version
if ( ! version_compare( ELEMENTOR_VERSION, self::MINIMUM_ELEMENTOR_VERSION, '>=' ) ) {
add_action( 'admin_notices', [ $this, 'admin_notice_minimum_elementor_version' ] );
return;
}
// Check for required PHP version
if ( version_compare( PHP_VERSION, self::MINIMUM_PHP_VERSION, '<' ) ) {
add_action( 'admin_notices', [ $this, 'admin_notice_minimum_php_version' ] );
return;
}
// Include plugin files
//$this->includes();
// Register assets
//add_action( 'elementor/frontend/after_register_scripts', [ $this, 'register_assets' ] );
add_action( 'elementor/frontend/after_register_styles', [ $this, 'register_styles' ] );
// ICOMOON STYLES
add_action( 'elementor/editor/after_enqueue_scripts', [ $this, 'register_styles' ] );
add_action( 'elementor/frontend/after_register_styles', [ $this, 'register_styles' ] );
add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'register_styles' ] );
// Register widgets
add_action( 'elementor/widgets/widgets_registered', [ $this, 'on_widgets_registered' ] );
// Register controls
add_action( 'elementor/controls/controls_registered', [ $this, 'on_widgets_registered' ] );
}
/**
* On Widgets Registered
*
* @since 1.0.0
*
* @access public
*/
public function on_widgets_registered() {
$this->includes();
$this->register_widgets();
$this->register_controls();
}
/**
* Admin notice
*
* Warning when the site doesn't have Elementor installed or activated.
*
* @since 1.0.0
*
* @access public
*/
public function admin_notice_missing_main_plugin() {
if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] );
$message = sprintf(
/* translators: 1: Plugin name 2: Elementor */
esc_html__( '"%1$s" requires "%2$s" to be installed and activated.', 'elementor-test-extension' ),
'<strong>' . esc_html__( 'Elementor Test Extension', 'elementor-test-extension' ) . '</strong>',
'<strong>' . esc_html__( 'Elementor', 'elementor-test-extension' ) . '</strong>'
);
printf( '<div class="notice notice-warning is-dismissible"><p>%1$s</p></div>', $message );
}
/**
* Admin notice
*
* Warning when the site doesn't have a minimum required Elementor version.
*
* @since 1.0.0
*
* @access public
*/
public function admin_notice_minimum_elementor_version() {
if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] );
$message = sprintf(
/* translators: 1: Plugin name 2: Elementor 3: Required Elementor version */
esc_html__( '"%1$s" requires "%2$s" version %3$s or greater.', 'elementor-test-extension' ),
'<strong>' . esc_html__( 'Elementor Test Extension', 'elementor-test-extension' ) . '</strong>',
'<strong>' . esc_html__( 'Elementor', 'elementor-test-extension' ) . '</strong>',
self::MINIMUM_ELEMENTOR_VERSION
);
printf( '<div class="notice notice-warning is-dismissible"><p>%1$s</p></div>', $message );
}
/**
* Admin notice
*
* Warning when the site doesn't have a minimum required PHP version.
*
* @since 1.0.0
*
* @access public
*/
public function admin_notice_minimum_php_version() {
if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] );
$message = sprintf(
/* translators: 1: Plugin name 2: PHP 3: Required PHP version */
esc_html__( '"%1$s" requires "%2$s" version %3$s or greater.', 'elementor-test-extension' ),
'<strong>' . esc_html__( 'Elementor Test Extension', 'elementor-test-extension' ) . '</strong>',
'<strong>' . esc_html__( 'PHP', 'elementor-test-extension' ) . '</strong>',
self::MINIMUM_PHP_VERSION
);
printf( '<div class="notice notice-warning is-dismissible"><p>%1$s</p></div>', $message );
}
/**
* Include Files
*
* Load required plugin core files.
*
* @since 1.0.0
*
* @access public
*/
public function includes() {
require_once( __DIR__ . '/widgets/deo-icon-box-widget.php' );
require_once( __DIR__ . '/controls/deo-icon-box-control.php' );
}
public function register_widgets() {
\Elementor\Plugin::instance()->widgets_manager->register_widget_type( new Deo_Icon_Box_Widget() );
}
public function register_controls() {
$controls_manager = \Elementor\Plugin::$instance->controls_manager;
$controls_manager->register_control( 'icon', new Deo_Icon_Box_Control );
}
public function register_styles() {
wp_enqueue_style( 'font-icons', plugins_url( '/assets/css/font-icons.css', __FILE__ ) );
wp_enqueue_style( 'icomoon', plugins_url( 'style.css', __FILE__ ) );
wp_enqueue_style( 'icomoon', plugins_url( 'style.css', __FILE__ ) );
wp_enqueue_style( 'icomoon', plugins_url( 'style.css', __FILE__ ) );
}
}
Deo_Elementor_Extension::instance();
<?php
namespace DeoThemes\Controls;
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly.
class Deo_Icon_Box_Control extends \Elementor\Base_Control {
// Retrieve icon control type.
public function get_type() {
return 'icon';
}
// Retrieve icons.
// Make your own list, and use the IcoMoon font 'style.css' Classes to build your array
public static function get_icons() {
return [
'icon-noun_977768' => 'noun professional',
'icon-noun_977793' => 'health safety',
'icon-noun_1245026' => 'bicycle',
'icon-noun_1248182' => 'engineer mechanical',
'icon-noun_1258170' => 'engineer solve',
'icon-noun_1267333' => 'human resources',
'icon-noun_1273446' => 'engineer fit',
'icon-noun_1273443' => 'manager',
'icon-noun_1278287' => 'weather cold',
'icon-noun_977698' => 'technician',
];
}
// Retrieve the default settings of the icons control to return the default settings while initializing the icons control.
protected function get_default_settings() {
return [
'icons' => self::get_icons(),
];
}
// Render icons control output in the editor.
public function content_template() {
?>
<div class="elementor-control-field">
<label class="elementor-control-title">{{{ data.label }}}</label>
<div class="elementor-control-input-wrapper">
<select class="elementor-control-icon" data-setting="{{ data.name }}" data-placeholder="<?php _e( 'Select Icon', 'elementor' ); ?>">
<option value=""><?php _e( 'Select Icon', 'elementor' ); ?></option>
<# _.each( data.icons, function( option_title, option_value ) { #>
<option value="{{ option_value }}">{{{ option_title }}}</option>
<# } ); #>
</select>
</div>
</div>
<# if ( data.description ) { #>
<div class="elementor-control-field-description">{{ data.description }}</div>
<# } #>
<?php
}
}
<?php
namespace DeoThemes\Widgets;
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly.
class Deo_Icon_Box_Widget extends \Elementor\Widget_Base {
/**
* Get widget name.
*
* Retrieve oEmbed widget name.
*
* @since 1.0.0
* @access public
*
* @return string Widget name.
*/
public function get_name() {
return 'oembed';
}
/**
* Get widget title.
*
* Retrieve oEmbed widget title.
*
* @since 1.0.0
* @access public
*
* @return string Widget title.
*/
public function get_title() {
return __( 'Deo Icon Box', 'plugin-name' );
}
/**
* Get widget icon.
*
* Retrieve oEmbed widget icon.
*
* @since 1.0.0
* @access public
*
* @return string Widget icon.
*/
public function get_icon() {
return 'fa fa-code';
}
/**
* Get widget categories.
*
* Retrieve the list of categories the oEmbed widget belongs to.
*
* @since 1.0.0
* @access public
*
* @return array Widget categories.
*/
public function get_categories() {
return [ 'general' ];
}
/**
* Register oEmbed widget controls.
*
* Adds different input fields to allow the user to change and customize the widget settings.
*
* @since 1.0.0
* @access protected
*/
protected function _register_controls() {
$this->start_controls_section(
'content_section',
[
'label' => __( 'Content', 'plugin-name' ),
'tab' => \Elementor\Controls_Manager::TAB_CONTENT,
]
);
$this->add_control(
'icon',
[
'label' => __( 'Icons', 'plugin-name' ),
'type' => \Elementor\Controls_Manager::ICON,
'include' => [
'icon-noun_977768',
'icon-noun_977793'
],
'default' => 'icon-noun_977768',
]
);
$this->end_controls_section();
}
/**
* Render widget output on the frontend.
*
* Written in PHP and used to generate the final HTML.
*
* @since 1.0.0
* @access protected
*/
protected function render() {
$settings = $this->get_settings_for_display();
echo '<svg class="feature__icon"><use xlink:href="' . DEO_PLUGIN_URL . 'assets/img/icons/orion-svg-sprite.svg#' . $settings['icon'] . '"></use></svg>';
echo '<i class="' . $settings['icon'] . '" aria-hidden="true"></i>';
}
protected function _content_template() {
?>
<i class="{{ settings.icon }}" aria-hidden="true"></i>
<?php
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment