1在主插件文件中(zero.php
), 插件对象的实例化无效。你试图在一个还不存在的对象中创建一个对象。
Note: 可以在对象内创建对象,但是,您必须首先从“外部世界”(也就是说,或类外的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),实例化它,并设置“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开发。