创建的小部件未显示在管理面板上

时间:2017-08-26 作者:Henri

我正在学习wordpress开发的教程,并尝试从插件创建一个基本的小部件,

因此,我将这三个文件放在我的插件目录中:

主插件文件(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 我找不到名为“新闻稿”的小部件。

我被困在这里了,有人能帮忙吗?

干杯

1 个回复
SO网友:Michael Ecklund

1在主插件文件中(zero.php), 插件对象的实例化无效。你试图在一个还不存在的对象中创建一个对象。

Note: 可以在对象内创建对象,但是,您必须首先从“外部世界”(也就是说,或类外的A/K/A)创建初始对象。

您可以对主插件文件进行非常简单的调整,以创建主插件对象。我的版本中的通知zero.php, 类是从外部实例化的吗?

2同样,在主插件文件中(zero.php), 您正在加载两个新闻稿(newsletter.php) 和新闻稿小部件(newsletterwidget.php) . 一旦您的新闻稿(newsletter.php) 已加载,您正在加载新闻稿小部件(newsletterwidget.php) 第二次(多余和不必要)。请注意我的版本中的文件加载和类实例化更改newsletter.phpnewsletter-widget.php.

3看看你的newsletter.php 构造函数。您确实应该避免使用匿名函数(除非您绝对需要)。在这种情况下,完全没有必要使用匿名函数。

话虽如此,请参见下面我的调整和评论。祝你的创新插件想法好运。

请注意Zero_Plugin 类是这样的。它的职责是加载新闻稿文件(Newsletter.php),实例化它,并设置“Newsletter”属性。

Contents of ./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 Widget.php),实例化它并设置widget.

Contents of ./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将批准您的应用程序在其生态系统中注册插件的小部件。

Contents of ./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;

    }

}

?>

This is the produced structure of your 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是一个好主意,但只能在适当的地方使用。这样做最终会遇到矛盾和潜在的障碍。

您应该将过程代码与OOP混合使用。仅在必要时创建对象。一切都不需要是对象内部的对象内部的对象。

我测试了这段代码,它运行正常。希望您了解一些OOP和WordPress开发。

结束

相关推荐

PLUGINS_LOADED操作工作不正常

我试图在表单提交后向用户发送电子邮件,但出现错误Call to undefined function wp_mail() in C:\\xampp\\htdocs\\wordpress\\wp-content\\plugins\\contact form\\contact-form-plugin.php on line 46<我在谷歌上搜索了一下,发现它与add_action( \'plugins_loaded\', \'functionShowForm\' );.我在代码中添加了这一行,但它在主窗