it-swarm.com.de

Erstelltes Widget wird im Admin-Bereich nicht angezeigt

Ich verfolge ein Tutorial über WordPress-Entwickler und versuche, ein einfaches Widget aus dem Plugin zu erstellen.

Also habe ich diese drei Dateien in mein Plugin-Verzeichnis gestellt:

haupt-Plugin-Datei (zero.php):

<?php

/*
Plugin Name: Zero plugin
*/

class Zero_Plugin
{
  public function __construct()
  {
    //...
    include_once plugin_dir_path( __FILE__ ).'/newsletter.php';
    include_once plugin_dir_path( __FILE__ ).'/newsletterwidget.php';
    new Zero_Newsletter();
   }
}

newsletterwidget.php:

<?php
class Zero_Newsletter_Widget extends WP_Widget
{
    public function __construct()
    {
        parent::__construct('zero_newsletter', 'Newsletter', array('description' => 'Un formulaire d\'inscription à la newsletter.'));
    }
    public function widget($args, $instance)
    {
        echo 'widget newsletter';
    }
}

newsletter.php:

<?php
include_once plugin_dir_path( __FILE__ ).'/newsletterwidget.php';
class Zero_Newsletter
{
    public function __construct()
    {
        add_action('widgets_init', function(){register_widget('Zero_Newsletter_Widget');});
    }
}

Also, wenn ich auf meinem Admin-Panel gehe, aktiviere das Plugin und gehe dann in appearance -> widgets. Ich finde das Widget namens "Newsletter" nicht.

Ich stecke hier fest, kann mir jemand helfen?

Prost

2
Henri

1

In Ihrer Haupt-Plugin-Datei (zero.php) haben Sie eine ungültige Instanziierung Ihres Plugin-Objekts. Sie versuchen, ein Objekt in einem Objekt zu erstellen, das noch nicht existiert.

Hinweis: Es ist möglich, Objekte innerhalb von Objekten zu erstellen. Sie müssen jedoch zuerst das ursprüngliche Objekt aus der "Außenwelt" erstellen (sozusagen - oder A/K/A außerhalb der Klasse).

Sie können eine ziemlich einfache Anpassung an Ihrer Haupt-Plugin-Datei vornehmen, um Ihr Haupt-Plugin-Objekt zu erstellen. Beachten Sie, dass in meiner Version von zero.php die Klasse von außen instanziiert wird?

2

Wiederum laden Sie in Ihrer Haupt-Plugin-Datei (zero.php) sowohl den Newsletter (newsletter.php) als auch das Newsletter-Widget (newsletterwidget.php). Sobald Ihr Newsletter (newsletter.php) geladen wurde, laden Sie das Newsletter-Widget (newsletterwidget.php) erneut (redundant und unnötig). Bitte beachten Sie die Änderungen beim Laden von Dateien und bei der Klasseninstanziierung in meinen Versionen von newsletter.php und newsletter-widget.php.

3

Schauen Sie sich Ihren newsletter.php-Konstruktor an. Sie sollten es wirklich vermeiden, anonyme Funktionen zu verwenden (es sei denn, Sie müssen dies unbedingt tun). In diesem Fall ist es völlig unnötig, eine anonyme Funktion zu verwenden.


Davon abgesehen sehen Sie bitte meine Anpassungen und Kommentare weiter unten. Viel Glück mit Ihrer innovativen Plugin-Idee.


Bitte achten Sie darauf, was die Klasse Zero_Plugin macht. Es liegt in der Verantwortung, die Newsletter-Datei (newsletter.php) zu laden, sie zu instanziieren und eine Eigenschaft von "newsletter" festzulegen.

Inhalt von ./wp-content/plugins/zero/zero.php:

<?php

/*
Plugin Name: Zero plugin
*/


/**
 * Class Zero_Plugin
 *
 * Main plugin file to do whatever it is that your plugin does.
 *
 * @author Michael Ecklund
 * @author_url https://www.michaelbrentecklund.com
 *
 */
class Zero_Plugin {

    /**
     * @var null
     */
    public $newsletter = null;

    /**
     * Zero_Plugin constructor.
     *
     * Load the newsletter functionality.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     */
    public function __construct() {

        $this->load_newsletter();

    }

    /**
     * Load the Newsletter file, then instantiate the newsletter class, and assign it a property of this class.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     * @return bool
     *
     */
    private function load_newsletter() {

        require_once( plugin_dir_path( __FILE__ ) . '/newsletter.php' );
        $this->newsletter = new Zero_Newsletter();

        return true;

    }

}

# Instantiate the main Plugin class and assign it a variable for reference elsewhere. This creates your plugin object.
$zero_plugin = new Zero_Plugin();

//print_r( $zero_plugin );

?>

Nachdem die Datei newsletter.php geladen und die Klasse Zero_Newsletter instanziiert wurde.

Achten Sie darauf, was die Klasse Zero_Newsletter macht. Es liegt in der Verantwortung, die Newsletter Widget-Datei (newsletter-widget.php) zu laden, sie zu instanziieren und eine Eigenschaft von widget festzulegen.

Inhalt von ./wp-content/plugins/zero/newsletter.php:

<?php

/**
 * Class Zero_Newsletter
 *
 * Tell WordPress that your plugin has a widget.
 *
 * @author Michael Ecklund
 * @author_url https://www.michaelbrentecklund.com
 *
 */
class Zero_Newsletter {

    /**
     * @var null
     */
    public $widget = null;

    /**
     * Zero_Newsletter constructor.
     *
     * Make sure you have your widget with you, while you stand in line to apply for widget registration with WordPress.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     */
    public function __construct() {

        $this->load_newsletter_widget();

        add_action( 'widgets_init', array( $this, 'register_widget' ) );

    }

    /**
     * Load the widget file, then instantiate the widget class, and assign it a property of this class.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     * @return bool
     *
     */
    public function load_newsletter_widget() {

        require_once( plugin_dir_path( __FILE__ ) . '/newsletter-widget.php' );
        $this->widget = new Zero_Newsletter_Widget();

        return true;

    }

    /**
     * Tell WordPress about your Widget.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     * @return bool
     *
     */
    public function register_widget() {

        if ( ! $this->widget ) {
            return false;
        }

        register_widget( 'Zero_Newsletter_Widget' );

        return true;

    }

}

?>

Nachdem die Datei newsletter-widget.php geladen und die Klasse Zero_Newsletter_Widget instanziiert wurde. Sie müssen sich jetzt mit WordPress bewerben, um Ihr Widget aufzulisten. Wenn Sie ausreichende Informationen zu Ihrer Registrierungsanwendung in WordPress eingegeben haben, genehmigt WordPress Ihre Anwendung, um das Widget Ihres Plugins in seinem Ökosystem zu registrieren.

Inhalt von ./wp-content/plugins/zero/newsletter-widget.php:

<?php

/**
 * Class Zero_Newsletter_Widget
 *
 * Tell WordPress about your Plugin's widget.
 *
 * @author Michael Ecklund
 * @author_url https://www.michaelbrentecklund.com
 *
 */
class Zero_Newsletter_Widget extends WP_Widget {

    /**
     * Zero_Newsletter_Widget constructor.
     *
     * Registration application with WordPress. WordPress will either accept or reject your registration application
     * based on the contents of your constructor.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     */
    public function __construct() {

        parent::__construct(
            'zero_newsletter',
            'Newsletter',
            array( 'description' => 'Un formulaire d\'inscription à la newsletter.' )
        );

    }

    /**
     * Output the contents of the widget.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     * @param array $args
     * @param array $instance
     *
     * @return bool|void
     */
    public function widget( $args, $instance ) {

        echo 'widget newsletter';

        return true;

    }

}

?>

Dies ist die erzeugte Struktur Ihres Plugin-Objekts:

Zero_Plugin Object
(
    [newsletter] => Zero_Newsletter Object
        (
            [widget] => Zero_Newsletter_Widget Object
                (
                    [id_base] => zero_newsletter
                    [name] => Newsletter
                    [option_name] => widget_zero_newsletter
                    [alt_option_name] => 
                    [widget_options] => Array
                        (
                            [classname] => widget_zero_newsletter
                            [customize_selective_refresh] => 
                            [description] => Un formulaire d'inscription à la newsletter.
                        )

                    [control_options] => Array
                        (
                            [id_base] => zero_newsletter
                        )

                    [number] => 
                    [id] => 
                    [updated] => 
                )

        )

)

Persönlich bin ich kein großer Fan von reinen OOP Plugins. Ich halte es für eine gute Idee, OOP zu verwenden, aber nur, wenn dies angemessen ist. Sie werden irgendwann auf Inkonsistenzen und potenzielle Straßensperren stoßen, wenn Sie dies auf diese Weise tun.

Sie sollten prozeduralen Code mit OOP mischen. Erstellen Sie Objekte nur bei Bedarf. Es muss nicht alles ein Objekt innerhalb eines Objekts innerhalb eines Objekts sein.

Ich habe diesen Code getestet und es funktioniert. Ich hoffe, Sie haben ein wenig über OOP und WordPress Development gelernt.

5
Michael Ecklund