web-dev-qa-db-fra.com

Le widget créé ne s'affiche pas dans le panneau d'administration

Je suis un tutoriel sur wordpress dev, et j'essaie de créer un widget de base à partir du plugin,

J'ai donc mis ces trois fichiers dans mon répertoire plugin:

fichier plugin principal (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');});
    }
}

Donc, quand je vais sur mon panneau d'administration, activez le plugin puis allez dans appearance -> widgets Je ne trouve pas le widget appelé "Newsletter".

Je suis coincé ici, n'importe qui peut aider?

À votre santé

2
Henri

1

Dans votre fichier de plugin principal (zero.php), vous avez une instanciation non valide de votre objet de plugin. Vous essayez de créer un objet à l'intérieur d'un objet qui n'existe pas encore.

Remarque: Il est possible de créer des objets dans des objets, cependant, vous devez d'abord créer l'objet initial à partir du "monde extérieur" (pour ainsi dire - ou A/K/A en dehors de la classe).

Vous pouvez faire un ajustement assez simple à votre fichier de plugin principal pour créer votre objet de plugin principal. Remarquez dans ma version de zero.php, la classe est instanciée de l'extérieur?

2

Encore une fois, dans votre fichier de plugin principal (zero.php), vous chargez à la fois la newsletter (newsletter.php) et le widget newsletter (newsletterwidget.php). Une fois que votre newsletter (newsletter.php) a été chargée, vous chargez le widget de newsletter (newsletterwidget.php) à nouveau (redondant et inutile). Veuillez observer les changements de chargement de fichier et d'instanciation de classe dans les versions de newsletter.php et newsletter-widget.php.

3

Regardez votre constructeur newsletter.php. Vous devriez vraiment éviter d'utiliser des fonctions anonymes (sauf si vous en avez absolument besoin). Dans ce cas, il est totalement inutile d'utiliser une fonction anonyme.


Cela étant dit, veuillez consulter mes ajustements et commentaires ci-dessous. Bonne chance avec votre idée de plugin innovant.


Faites attention à ce que fait la classe Zero_Plugin. Sa responsabilité est de charger le fichier Newsletter (newsletter.php), de l'instancier et de définir une propriété de `newsletter '.

Contenu de ./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 );

?>

Maintenant que le fichier newsletter.php a été chargé et que la classe Zero_Newsletter a été instanciée.

Faites attention à ce que fait la classe Zero_Newsletter. Sa responsabilité est de charger le fichier Newsletter Widget (newsletter-widget.php), de l'instancier et de définir une propriété de widget.

Contenu de ./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;

    }

}

?>

Maintenant que le fichier newsletter-widget.php a été chargé et que la classe Zero_Newsletter_Widget a été instanciée. Vous devez maintenant appliquer avec WordPress pour répertorier votre Widget. Si vous avez fourni des informations adéquates sur votre demande d'enregistrement avec WordPress, WordPress approuvera votre demande pour enregistrer le widget de votre plugin avec son écosystème.

Contenu de ./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;

    }

}

?>

Voici la structure produite par votre objet Plugin:

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] => 
                )

        )

)

Personnellement, je ne suis pas très fan des plugins purs OOP. Je pense que c'est une bonne idée d'utiliser la programmation orientée objet, mais uniquement lorsque cela est approprié. Vous allez éventuellement rencontrer des incohérences et des obstacles potentiels en procédant ainsi.

Vous devez mélanger le code de procédure avec la POO. Ne créez des objets que lorsque cela est nécessaire. Tout n'a pas besoin d'être un objet à l'intérieur d'un objet à l'intérieur d'un objet.

J'ai testé ce code et cela fonctionne. J'espère que vous avez appris un peu sur OOP et le développement WordPress.

5
Michael Ecklund