Eroare fatală în Elementor: Clasa 'Elementor\Widget_Base' nu a fost găsită

17 mai 2018, 04:11:24
Vizualizări: 15.5K
Voturi: 5

Încerc să creez un widget de bază în Elementor. Când urmez documentația pentru dezvoltatori pentru a crea un widget nou, apare următoarea eroare:

Fatal error: Class 'Elementor\Widget_Base' not found

Iată codul meu (preluat în mare parte din documentația oficială)

Clasa principală a extensiei plugin:

<?php
/**
 * Plugin Name: Extensie Elementor Deo
 * Description: Extensie personalizată pentru Elementor.
 * Plugin URI:  https://elementor.com/
 * Version:     1.0.0
 * Author:      DeoThemes
 * Author URI:  https://elementor.com/
 * Text Domain: deo-elementor-extension
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Ieșire dacă accesat direct
}

/**
 * Clasa principală a extensiei de test Elementor
 *
 * Clasa principală care inițializează și rulează pluginul.
 *
 * @since 1.0.0
 */
final class Elementor_Test_Extension {

    /**
     * Versiunea pluginului
     *
     * @since 1.0.0
     *
     * @var string Versiunea pluginului.
     */
    const VERSION = '1.0.0';

    /**
     * Versiunea minimă necesară de Elementor
     *
     * @since 1.0.0
     *
     * @var string Versiunea minimă de Elementor necesară pentru a rula pluginul.
     */
    const MINIMUM_ELEMENTOR_VERSION = '2.0.0';

    /**
     * Versiunea minimă necesară de PHP
     *
     * @since 1.0.0
     *
     * @var string Versiunea minimă de PHP necesară pentru a rula pluginul.
     */
    const MINIMUM_PHP_VERSION = '7.0';

    /**
     * Instanță
     *
     * @since 1.0.0
     *
     * @access private
     * @static
     *
     * @var Elementor_Test_Extension Singura instanță a clasei.
     */
    private static $_instance = null;

    /**
     * Instanță
     *
     * Asigură că doar o singură instanță a clasei este încărcată sau poate fi încărcată.
     *
     * @since 1.0.0
     *
     * @access public
     * @static
     *
     * @return Elementor_Test_Extension O instanță a clasei.
     */
    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' ] );

    }

    /**
     * Încărcare textdomain
     *
     * Încarcă fișierele de localizare ale pluginului.
     *
     * Acționat de hook-ul `init`.
     *
     * @since 1.0.0
     *
     * @access public
     */
    public function i18n() {

        load_plugin_textdomain( 'elementor-test-extension' );

    }

    /**
     * Inițializează pluginul
     *
     * Încarcă pluginul doar după ce Elementor (și alte pluginuri) sunt încărcate.
     * Verifică cerințele de bază ale pluginului, dacă o verificare eșuează nu continuă,
     * dacă toate verificările trec, încarcă fișierele necesare pentru a rula pluginul.
     *
     * Acționat de hook-ul `plugins_loaded`.
     *
     * @since 1.0.0
     *
     * @access public
     */
    public function init() {

        // Verifică dacă Elementor este instalat și activat
        if ( ! did_action( 'elementor/loaded' ) ) {
            add_action( 'admin_notices', [ $this, 'admin_notice_missing_main_plugin' ] );
            return;
        }

        // Verifică versiunea necesară de Elementor
        if ( ! version_compare( ELEMENTOR_VERSION, self::MINIMUM_ELEMENTOR_VERSION, '>=' ) ) {
            add_action( 'admin_notices', [ $this, 'admin_notice_minimum_elementor_version' ] );
            return;
        }

        // Verifică versiunea necesară de PHP
        if ( version_compare( PHP_VERSION, self::MINIMUM_PHP_VERSION, '<' ) ) {
            add_action( 'admin_notices', [ $this, 'admin_notice_minimum_php_version' ] );
            return;
        }

        // Include fișierele pluginului
    $this->includes();

    // Înregistrează widget-urile
     add_action( 'elementor/widgets/widgets_registered', [ $this, 'register_widgets' ] );

    }

    /**
     * Notificare admin
     *
     * Avertisment când site-ul nu are Elementor instalat sau activat.
     *
     * @since 1.0.0
     *
     * @access public
     */
    public function admin_notice_missing_main_plugin() {

        if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] );

        $message = sprintf(
            /* translators: 1: Nume plugin 2: Elementor */
            esc_html__( '"%1$s" necesită "%2$s" să fie instalat și activat.', 'elementor-test-extension' ),
            '<strong>' . esc_html__( 'Extensie de test Elementor', '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 );

    }

    /**
     * Notificare admin
     *
     * Avertisment când site-ul nu are versiunea minimă necesară de Elementor.
     *
     * @since 1.0.0
     *
     * @access public
     */
    public function admin_notice_minimum_elementor_version() {

        if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] );

        $message = sprintf(
            /* translators: 1: Nume plugin 2: Elementor 3: Versiunea necesară de Elementor */
            esc_html__( '"%1$s" necesită "%2$s" versiunea %3$s sau mai nouă.', 'elementor-test-extension' ),
            '<strong>' . esc_html__( 'Extensie de test Elementor', '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 );

    }

    /**
     * Notificare admin
     *
     * Avertisment când site-ul nu are versiunea minimă necesară de PHP.
     *
     * @since 1.0.0
     *
     * @access public
     */
    public function admin_notice_minimum_php_version() {

        if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] );

        $message = sprintf(
            /* translators: 1: Nume plugin 2: PHP 3: Versiunea necesară de PHP */
            esc_html__( '"%1$s" necesită "%2$s" versiunea %3$s sau mai nouă.', 'elementor-test-extension' ),
            '<strong>' . esc_html__( 'Extensie de test Elementor', '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 fișiere
     *
     * Încarcă fișierele de bază necesare pluginului.
     *
     * @since 1.0.0
     *
     * @access public
     */
    public function includes() {

        require_once( __DIR__ . '/widgets/test-widget.php' );
        //require_once( __DIR__ . '/controls/test-control.php' );

  }


  public function register_widgets() {

    \Elementor\Plugin::instance()->widgets_manager->register_widget_type( new \Elementor_oEmbed_Widget() );

  }


}

Elementor_Test_Extension::instance();

Clasa widget-ului de test:

<?php

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Ieșire dacă accesat direct
}

class Elementor_oEmbed_Widget extends \Elementor\Widget_Base {

    /**
     * Obține numele widget-ului.
     *
     * Returnează numele widget-ului oEmbed.
     *
     * @since 1.0.0
     * @access public
     *
     * @return string Numele widget-ului.
     */
    public function get_name() {
        return 'oembed';
    }

    /**
     * Obține titlul widget-ului.
     *
     * Returnează titlul widget-ului oEmbed.
     *
     * @since 1.0.0
     * @access public
     *
     * @return string Titlul widget-ului.
     */
    public function get_title() {
        return __( 'oEmbed', 'plugin-name' );
    }

    /**
     * Obține iconița widget-ului.
     *
     * Returnează iconița widget-ului oEmbed.
     *
     * @since 1.0.0
     * @access public
     *
     * @return string Iconița widget-ului.
     */
    public function get_icon() {
        return 'fa fa-code';
    }

    /**
     * Obține categoriile widget-ului.
     *
     * Returnează lista de categorii cărora le aparține widget-ul oEmbed.
     *
     * @since 1.0.0
     * @access public
     *
     * @return array Categoriile widget-ului.
     */
    public function get_categories() {
        return [ 'general' ];
    }

    /**
     * Înregistrează controalele widget-ului oEmbed.
     *
     * Adaugă diferite câmpuri de input pentru a permite utilizatorului să schimbe și să personalizeze setările widget-ului.
     *
     * @since 1.0.0
     * @access protected
     */
    protected function _register_controls() {

        $this->start_controls_section(
            'content_section',
            [
                'label' => __( 'Conținut', 'plugin-name' ),
                'tab' => \Elementor\Controls_Manager::TAB_CONTENT,
            ]
        );

        $this->add_control(
            'url',
            [
                'label' => __( 'URL de încorporat', 'plugin-name' ),
                'type' => \Elementor\Controls_Manager::TEXT,
                'input_type' => 'url',
                'placeholder' => __( 'https://your-link.com', 'plugin-name' ),
            ]
        );

        $this->end_controls_section();

    }

    /**
     * Randare output widget oEmbed pe frontend.
     *
     * Scris în PHP și folosit pentru a genera HTML-ul final.
     *
     * @since 1.0.0
     * @access protected
     */
    protected function render() {

        $settings = $this->get_settings_for_display();

        $html = wp_oembed_get( $settings['url'] );

        echo '<div class="oembed-elementor-widget">';

        echo ( $html ) ? $html : $settings['url'];

        echo '</div>';

    }

}
0
Toate răspunsurile la întrebare 2
1

Am avut aceeași problemă. Mută $this->includes(); din metoda init și pune-o în metoda register_widgets:

public function init() {

   ...

   // Include fișierele pluginului
   // $this->includes(); // <-- elimină această linie

}

public function register_widgets() {

    $this->includes(); // <- pune-o aici
    \Elementor\Plugin::instance()->widgets_manager->register_widget_type( new \Elementor_oEmbed_Widget() );

}
21 mai 2018 07:57:58
Comentarii

Mulțumesc mult, Frank! Exact asta am descoperit și eu ieri. Am creat o metodă separată și am pus $this->includes acolo și a funcționat. Am publicat problema pe repository-ul Elementor de pe Github. Nu știu de ce alții au dat downvote acestui post, este evident că ceva nu este în regulă fie cu codul din documentație, fie cu nucleul. Dar repository-ul Github este dezactivat acum din cauza DMCA :) Oricum, răspunsul tău este corect.

Alexander Alexander
21 mai 2018 08:33:30
1

mergi la /var/www/wordpress/wp-content/themes/ReservoirLabs_v2

și deschide fișierul functions.php

și comentează linia require( get_template_directory()

20 mai 2020 22:12:58
Comentarii

Nu ar însemna acest lucru editarea fișierelor temei de bază ReservoirLabs_v2 și, astfel, nu ar putea fi actualizată fără a pierde modificările, în cel mai bun caz, sau chiar riscând să stric alte funcționalități, în cel mai rău caz? Te rog să încerci să incluzi și o explicație despre cum funcționează răspunsul tău și ce încearcă să realizeze.

Tony Djukic Tony Djukic
20 mai 2020 23:11:10