it-roy-ru.com

Созданный виджет не отображается на панели администратора

Я следую учебнику по WordPress Dev, и я пытаюсь создать базовый виджет из плагина,

Итак, я поместил эти три файла в каталог плагинов:

основной файл плагина (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');});
    }
}

Поэтому, когда я захожу в свою админ-панель, активирую плагин, затем захожу в appearance -> widgets Я не нахожу виджет под названием "Newsletter".

Я застрял здесь, кто-нибудь может помочь?

Ура

2
Henri

1

В вашем основном файле плагина (zero.php) у вас недопустимая реализация вашего объекта плагина. Вы пытаетесь создать объект внутри объекта, который еще не существует.

Примечание: Можно создавать объекты внутри объектов, однако сначала необходимо создать исходный объект из "внешнего мира" (так сказать - или A/K/A вне класса).

Вы можете сделать довольно простую настройку основного файла плагина, чтобы создать основной объект плагина. Обратите внимание, что в моей версии zero.php экземпляр класса создается снаружи?

2

Опять же, в вашем основном файле плагина (zero.php) вы загружаете как новостную рассылку (newsletter.php), так и виджет новостной рассылки (newsletterwidget.php). После того, как ваша новостная рассылка (newsletter.php) была загружена, вы загружаете виджет новостной рассылки (newsletterwidget.php) СНОВА снова (избыточный и ненужный). Пожалуйста, наблюдайте за изменениями загрузки файлов и создания экземпляров классов в моих версиях newsletter.php и newsletter-widget.php.

3

Посмотрите на свой newsletter.php конструктор. Вы действительно должны избегать использования анонимных функций (если вам абсолютно не нужно). В этом случае совершенно не нужно использовать анонимную функцию.


При этом, пожалуйста, смотрите мои корректировки и комментарии ниже. Удачи с вашей инновационной идеей плагина.


Обратите внимание на то, что делает класс Zero_Plugin. В его обязанности входит загрузка файла информационного бюллетеня (newsletter.php), создание его экземпляра и установка свойства "информационного бюллетеня".

Содержимое ./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 );

?>

Теперь, когда файл newsletter.php был загружен, а класс Zero_Newsletter был создан.

Обратите внимание на то, что делает класс Zero_Newsletter. Он обязан загрузить файл виджета Newsletter (newsletter-widget.php), создать его экземпляр и установить свойство widget.

Содержимое ./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;

    }

}

?>

Теперь, когда файл newsletter-widget.php был загружен, а класс Zero_Newsletter_Widget был создан. Теперь вы должны подать заявку с WordPress, чтобы перечислить свой виджет. Если вы заполнили адекватную информацию в своем заявлении на регистрацию с помощью WordPress, тогда WordPress утвердит ваше приложение для регистрации виджета вашего плагина в его экосистеме.

Содержимое ./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;

    }

}

?>

Это созданная структура вашего Plugin Object:

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

        )

)

Лично я не большой поклонник чистых плагинов OOP. Я думаю, что это хорошая идея - использовать ООП, но только там, где это необходимо. В конечном итоге вы столкнетесь с несоответствиями и потенциальными препятствиями, делая это таким образом в будущем.

Вы должны смешать процедурный код с ООП. Создавайте объекты только при необходимости. Все не должно быть объектом внутри объекта внутри объекта.

Я проверил этот код, и он работает. Надеюсь, вы немного узнали о OOP и ​​разработке WordPress.

5
Michael Ecklund