Chi Siamo Area Clienti Promo del Mese Dicono di Noi Portfolio FAQ Blog
WordPress

Creare Widget Personalizzati per Elementor: Guida Sviluppatori

Gianluca Gentile
Gianluca Gentile
· 8 min di lettura

Creare Widget Personalizzati per Elementor: Guida Sviluppatori

Elementor offre decine di widget predefiniti, ma in alcuni casi le esigenze specifiche di un progetto richiedono funzionalita che nessun widget standard puo fornire. In questi casi, la soluzione e creare un widget personalizzato. Elementor mette a disposizione una API solida e ben documentata che permette agli sviluppatori PHP di estendere il page builder con widget su misura, perfettamente integrati nel pannello di controllo visuale.

Questa guida e rivolta a sviluppatori con conoscenze di PHP, HTML e CSS. Se non sei uno sviluppatore ma hai bisogno di widget personalizzati per il tuo progetto, il nostro team di realizzazione siti web puo creare soluzioni su misura per le tue esigenze.

Architettura dei Widget di Elementor

Ogni widget di Elementor e una classe PHP che estende la classe base Widget_Base. La struttura segue un pattern chiaro e prevedibile:

File System

La struttura consigliata per un plugin che contiene widget personalizzati:

my-elementor-widgets/
├── my-elementor-widgets.php       (file principale del plugin)
├── widgets/
│   ├── cta-box.php                (widget CTA Box)
│   ├── team-member.php            (widget Team Member)
│   └── pricing-table.php          (widget Pricing Table)
├── assets/
│   ├── css/
│   │   └── widgets.css            (stili dei widget)
│   └── js/
│       └── widgets.js             (script dei widget)
└── readme.txt

Registrare il Plugin e i Widget

Il file principale del plugin deve registrare i widget con Elementor attraverso il hook appropriato:

<?php
/**
 * Plugin Name: My Elementor Widgets
 * Description: Widget personalizzati per Elementor
 * Version: 1.0.0
 * Requires PHP: 7.4
 */

if ( ! defined( 'ABSPATH' ) ) exit;

function register_custom_widgets( $widgets_manager ) {
    require_once __DIR__ . '/widgets/cta-box.php';
    $widgets_manager->register( new CTA_Box_Widget() );
}
add_action( 'elementor/widgets/register', 'register_custom_widgets' );

Pannello widget di Elementor che mostra i widget personalizzati nella categoria dedicata

La Classe Widget_Base: Metodi Fondamentali

Ogni widget personalizzato deve implementare almeno questi metodi:

get_name()

Restituisce il nome tecnico del widget (slug unico, senza spazi, in minuscolo). Questo identificativo viene usato internamente da Elementor:

public function get_name() {
    return 'cta_box';
}

get_title()

Restituisce il titolo leggibile del widget come appare nel pannello:

public function get_title() {
    return 'CTA Box Personalizzato';
}

get_icon()

Restituisce la classe della icona visualizzata nel pannello widget. Puoi usare qualsiasi classe Eicons (il set di icone di Elementor) o Font Awesome:

public function get_icon() {
    return 'eicon-call-to-action';
}

get_categories()

Definisce in quale categoria del pannello appare il widget. Puoi usare categorie esistenti o crearne di personalizzate:

public function get_categories() {
    return [ 'general' ];
}

Categorie predefinite disponibili: basic, pro-elements, general, theme-elements, woocommerce-elements.

register_controls(): Creare i Campi di Configurazione

Il metodo register_controls() definisce tutti i campi che appaiono nel pannello laterale quando il widget viene selezionato. Elementor offre decine di tipi di controllo:

Controlli di Base

Controlli di Stile

Controlli Media

Esempio Completo di register_controls()

protected function register_controls() {
    // SEZIONE CONTENUTO
    $this->start_controls_section(
        'content_section',
        [
            'label' => 'Contenuto',
            'tab'   => ElementorControls_Manager::TAB_CONTENT,
        ]
    );

    $this->add_control(
        'title',
        [
            'label'       => 'Titolo',
            'type'        => ElementorControls_Manager::TEXT,
            'default'     => 'Titolo CTA',
            'placeholder' => 'Inserisci il titolo',
        ]
    );

    $this->add_control(
        'description',
        [
            'label'   => 'Descrizione',
            'type'    => ElementorControls_Manager::TEXTAREA,
            'default' => 'Descrizione della call to action.',
            'rows'    => 5,
        ]
    );

    $this->add_control(
        'button_text',
        [
            'label'   => 'Testo Pulsante',
            'type'    => ElementorControls_Manager::TEXT,
            'default' => 'Scopri di piu',
        ]
    );

    $this->add_control(
        'button_url',
        [
            'label'       => 'Link Pulsante',
            'type'        => ElementorControls_Manager::URL,
            'placeholder' => 'https://tuosito.it',
            'default'     => [ 'url' => '#' ],
        ]
    );

    $this->add_control(
        'image',
        [
            'label'   => 'Immagine',
            'type'    => ElementorControls_Manager::MEDIA,
            'default' => [
                'url' => ElementorUtils::get_placeholder_image_src(),
            ],
        ]
    );

    $this->end_controls_section();

    // SEZIONE STILE
    $this->start_controls_section(
        'style_section',
        [
            'label' => 'Stile',
            'tab'   => ElementorControls_Manager::TAB_STYLE,
        ]
    );

    $this->add_control(
        'title_color',
        [
            'label'     => 'Colore Titolo',
            'type'      => ElementorControls_Manager::COLOR,
            'selectors' => [
                '{{WRAPPER}} .cta-title' => 'color: {{VALUE}}',
            ],
        ]
    );

    $this->add_group_control(
        ElementorGroup_Control_Typography::get_type(),
        [
            'name'     => 'title_typography',
            'label'    => 'Tipografia Titolo',
            'selector' => '{{WRAPPER}} .cta-title',
        ]
    );

    $this->end_controls_section();
}

render(): Generare il Codice HTML

Il metodo render() genera il codice HTML che viene visualizzato nel frontend del sito. Qui accedi ai valori impostati nei controlli tramite $this->get_settings_for_display():

protected function render() {
    $settings = $this->get_settings_for_display();
    $target   = $settings['button_url']['is_external'] ? ' target="_blank"' : '';
    $nofollow = $settings['button_url']['nofollow'] ? ' rel="nofollow"' : '';

    echo '<div class="cta-box">';
    if ( ! empty( $settings['image']['url'] ) ) {
        echo '<img src="' . esc_url( $settings['image']['url'] ) . '" alt="" class="cta-image" />';
    }
    echo '<h3 class="cta-title">' . esc_html( $settings['title'] ) . '</h3>';
    echo '<p class="cta-desc">' . esc_html( $settings['description'] ) . '</p>';
    if ( ! empty( $settings['button_url']['url'] ) ) {
        echo '<a href="' . esc_url( $settings['button_url']['url'] ) . '"' . $target . $nofollow . ' class="cta-btn">';
        echo esc_html( $settings['button_text'] );
        echo '</a>';
    }
    echo '</div>';
}

Funzionalita avanzate di Elementor per lo sviluppo di widget personalizzati

content_template(): Anteprima Live nel Builder

Il metodo content_template() e opzionale ma fortemente consigliato. Genera la anteprima in tempo reale nel builder usando la sintassi Backbone.js (template JavaScript). Senza questo metodo, Elementor deve fare una chiamata AJAX al server per ogni modifica, rallentando la esperienza di editing:

protected function content_template() {
    ?>
    <div class="cta-box">
        <# if ( settings.image.url ) { #>
            <img src="{{ settings.image.url }}" alt="" class="cta-image" />
        <# } #>
        <h3 class="cta-title">{{{ settings.title }}}</h3>
        <p class="cta-desc">{{{ settings.description }}}</p>
        <# if ( settings.button_url.url ) { #>
            <a href="{{ settings.button_url.url }}" class="cta-btn">
                {{{ settings.button_text }}}
            </a>
        <# } #>
    </div>
    <?php
}

Nota la differenza di sintassi: {{ }} per i valori con escape e {{{ }}} per i valori senza escape (HTML grezzo).

Caricare CSS e JavaScript

Se il tuo widget richiede fogli di stile o script personalizzati, registrali nei metodi dedicati:

public function get_style_depends() {
    return [ 'my-widget-styles' ];
}

public function get_script_depends() {
    return [ 'my-widget-scripts' ];
}

Registra gli asset nel file principale del plugin:

function register_widget_assets() {
    wp_register_style( 'my-widget-styles', plugins_url( 'assets/css/widgets.css', __FILE__ ) );
    wp_register_script( 'my-widget-scripts', plugins_url( 'assets/js/widgets.js', __FILE__ ), [ 'jquery' ], '1.0.0', true );
}
add_action( 'wp_enqueue_scripts', 'register_widget_assets' );

Categorie Personalizzate

Per organizzare i tuoi widget in una categoria dedicata nel pannello:

function add_custom_widget_category( $elements_manager ) {
    $elements_manager->add_category(
        'my-custom-widgets',
        [
            'title' => 'I Miei Widget',
            'icon'  => 'fa fa-plug',
        ]
    );
}
add_action( 'elementor/elements/categories_registered', 'add_custom_widget_category' );

Pacchettizzare come Plugin

Una volta sviluppati e testati i widget, pacchettizza il tutto come un plugin WordPress standard:

  1. Aggiungi le intestazioni corrette nel file principale del plugin
  2. Verifica che Elementor sia attivo prima di registrare i widget (controlla did_action( 'elementor/loaded' ))
  3. Gestisci la compatibilita con le versioni di Elementor (controlla ELEMENTOR_VERSION)
  4. Aggiungi un file readme.txt se intendi distribuirlo
  5. Crea un file ZIP per la distribuzione

Conclusione

Creare widget personalizzati per Elementor e un processo strutturato che richiede conoscenze di PHP e comprensione della architettura del page builder. Una volta padroneggiata la API, le possibilita sono praticamente illimitate: puoi creare widget per qualsiasi esigenza, da semplici box informativi a integrazioni complesse con API esterne.

Se hai bisogno di widget personalizzati per il tuo progetto ma non hai le competenze di sviluppo necessarie, contattaci per una consulenza tecnica.

Guide Correlate della Serie Elementor

#elementor custom widget #elementor developer #sviluppo elementor #widget personalizzati