Widget creado que no aparece en el Panel de administración

2

Estoy siguiendo un tutorial en wordpress dev, y trato de crear un widget básico desde el complemento,

Así que he puesto esos tres archivos en mi directorio de complementos:

archivo de complemento 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');});
    }
}

Entonces, cuando accedo a mi panel de administración, active el complemento y luego ingrese en appearance -> widgets . No encuentro el widget llamado "Newsletter".

Estoy atrapado aquí, ¿alguien puede ayudar?

Saludos

    
pregunta Henri 26.08.2017 - 16:23

1 respuesta

5

1

En su archivo de complemento principal ( zero.php ), tiene una instanciación no válida de su objeto de complemento. Estás intentando crear un objeto dentro de un objeto que aún no existe.

Nota: Es posible crear objetos dentro de objetos, sin embargo, primero debe crear el objeto inicial desde el "mundo exterior" (por así decirlo - o A / K / A fuera de la clase).

Puede hacer un ajuste bastante simple a su archivo de complemento principal para crear su objeto de complemento principal. Observe que en mi versión de zero.php , ¿se crea una instancia de la clase desde afuera?

2

Nuevamente, en su archivo de complemento principal ( zero.php ), está cargando el boletín ( newsletter.php ) y el widget del boletín ( newsletterwidget.php ). Una vez que se haya cargado su boletín ( newsletter.php ), estará cargando el widget del boletín ( newsletterwidget.php ) OTRA VEZ por segunda vez (redundante e innecesario). Observe los cambios en la carga de archivos y la creación de instancias de clase en mis versiones de newsletter.php y newsletter-widget.php .

3

Mira tu constructor newsletter.php . Deberías evitar el uso de funciones anónimas (a menos que sea absolutamente necesario). En este caso, es totalmente innecesario utilizar una función anónima.

  

Dicho esto, por favor vea mis ajustes y comentarios a continuación. Bueno   suerte con tu innovadora idea de plugin.

Preste atención a lo que hace la clase Zero_Plugin . Es responsabilidad de cargar el archivo del boletín (newsletter.php), crear una instancia y establecer una propiedad de 'newsletter'.

Contenido 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 );

?>

Ahora que se ha cargado el archivo newsletter.php y se ha creado una instancia de la clase Zero_Newsletter .

Preste atención a lo que hace la clase Zero_Newsletter . Es responsabilidad de cargar el archivo del widget de boletín (newsletter-widget.php), crear una instancia y establecer una propiedad de widget .

Contenido 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;

    }

}

?>

Ahora que se ha cargado el archivo newsletter-widget.php y se ha creado una instancia de la clase Zero_Newsletter_Widget . Ahora debe aplicar con WordPress para listar su Widget. Si completó la información adecuada en su solicitud de registro con WordPress, WordPress aprobará su solicitud para registrar el Widget de su complemento con su ecosistema.

Contenido 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;

    }

}

?>

Esta es la estructura producida de su Objeto de complemento:

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

        )

)

Personalmente, no soy muy fanático de los plugins OOP puros. Creo que es una buena idea usar OOP, pero solo cuando sea apropiado. Eventualmente, se encontrará con inconsistencias y posibles obstáculos que lo harán de esta manera en el futuro.

Debes mezclar el código de procedimiento con OOP. Solo crea objetos cuando sea necesario. No es necesario que todo sea un objeto dentro de un objeto dentro de un objeto.

He probado este código y funciona. Espero que hayas aprendido un poco sobre OOP y WordPress Development.

    
respondido por el Michael Ecklund 26.08.2017 - 22:00

Lea otras preguntas en las etiquetas