在本系列中,我们研究了如何实现一个系统,该系统允许我们以编程方式定义自定义消息,这些消息显示在WordPress后端的给定管理页面上。
如果您到目前为止已经跟随了该系列,那么您将知道:
- 我们为整个系列中使用的插件奠定了基础,甚至对其进行了进一步的开发。
- 我们已经定义并使用了一个自定义钩子,可用于呈现设置消息。
- 我们增加了对成功,警告和错误消息的支持,这些消息可以显示在给定设置页面的顶部。
如上一教程中所述 :
但是,如果您阅读过我以前的任何教程 ,您就会知道我不喜欢重复代码。 我也不喜欢一堂课做很多事情。 而且,不幸的是,这正是我们在这里所做的。
我们将在本最终教程中解决这个问题。 最后,我们将提供一个完整的重构解决方案,该解决方案将使用诸如继承之类的一些中间面向对象的原理。 我们还将提供一些可以通过编程方式使用或可以在WordPress挂钩系统中注册的方法。
从头开始
此时,您应该确切地知道本地开发环境中需要什么。 具体来说,您应该具有以下条件:
- PHP 5.6.25和MySQL 5.6.28
- Apache或Nginx
- WordPress 4.6.1
- 您首选的IDE或编辑器
我还建议您使用最新版本的源代码,因为它可以使您逐步了解我们将要进行的所有更改。 如果您没有它,那没关系,但是我建议您在继续之前先通读以前的教程 。
在上一教程中
您可能还记得(或从上面的评论中确定),上一教程为我们提供了一个单独的类,该类做了很多工作。
知道这一点的一种方法是,如果您要描述班级正在做什么,那么您将无法给出一个答案。 相反,您不得不说它负责处理成功消息,警告消息,错误消息,并相互独立地呈现所有消息。
尽管您可能会说它是“管理自定义消息”,但您不一定要描述该类的详细程度。 这就是我们希望在本教程中解决的问题。
在最终教程中
具体来说,我们将考虑执行以下操作:
- 删除旧的设置Messenger类
- 添加一个新的,更通用的设置消息类
- 添加用于与之通信的设置Messenger类别
- 介绍我们可以独立于WordPress使用的方法
- 简化WordPress如何呈现消息
我们已经为我们完成了工作,所以让我们继续进行以上所有工作。
重构我们的工作
当涉及重构我们的工作时,它有助于准确地知道我们想要做什么。 在我们的案例中,我们认识到我们有很多重复的代码可以压缩。
此外,除了呈现方式外,我们还以完全相同的方式管理三种不同类型的消息。 在这种情况下,这就是HTML类属性的问题。
因此,我们可以泛化该代码以专注于特定类型 ,并且可以通过泛化识别该类型的方法来合并很多添加成功消息或检索错误消息的方法。
最终,我们将做到这一点。 但首先,要进行一些家政服务。
1.删除旧设置Messenger
在以前的教程中,我们一直在使用名为Settings_Messenger
的类。 到目前为止,它已经达到了目的,但是在本教程的其余部分中,我们将重构该类。
当涉及到这种类型的重构时,很容易希望简单地删除该类并重新开始。 在某些情况下这是适当的,但这不是其中之一。 取而代之的是,我们将采用该类并重构已经存在的类。
所有这些,不要删除文件并开始使用新文件。 相反,请在整个教程中跟踪我们在做什么。
2.新的设置消息类
首先,让我们介绍一个Settings_Message
类。 这表示我们将要编写的任何类型的设置消息。 也就是说,它将管理成功消息,错误消息和警告消息。
为此,我们将定义类,引入单个属性,然后在构造函数中实例化它。 看看这段代码,下面我将进一步解释:
<?php
class Settings_Message {
private $messages;
public function __construct() {
$this->messages = array(
'success' => array(),
'error' => array(),
'warning' => array(),
);
}
}
注意,我们已经创建了一个私有属性$messages
。 当实例化该类时,我们创建一个多维数组。 每个索引(由success
, error
或warning
标识)均指向其自己的数组,我们将在其中存储相应的消息。
接下来,我们需要能够添加一条消息,一条消息并获得所有消息。 我将在稍后详细讨论每一个。
添加信息
首先,让我们看一下如何添加消息:
<?php
public function add_message( $type, $message ) {
$message = sanitize_text_field( $message );
if ( in_array( $message, $this->messages[ $type ] ) ) {
return;
}
array_push( $this->messages[ $type ], $message );
}
该消息首先获取传入的字符串并清理数据。 然后,它检查成功消息中是否已经存在。 如果是这样,它只是返回。 毕竟,我们不要重复的消息。
否则,它将消息添加到集合中。
取得讯息
检索消息有两种形式:
- 按类型呈现单个消息
- 在管理页面的显示中呈现消息(完成HTML清理等)
请记住,有时候我们可能只想显示警告消息。 其他时间,我们可能要显示所有消息。 由于执行此操作的方法有两种,因此我们可以利用一种方法,然后在其他函数中利用它。
听起来令人困惑? 和我在一起,我将解释所有这些。 我们将重点关注的第一部分是如何按类型呈现消息(认为成功,错误或警告)。 这是执行此操作的代码(看起来应该很熟悉):
<?php
public function get_messages( $type ) {
if ( empty( $this->messages[ $type ] ) ) {
return;
}
$html = "<div class='notice notice-$type is-dismissible'>";
$html .= '<ul>';
foreach ( $this->messages[ $type ] as $message ) {
$html .= "<li>$message</li>";
}
$html .= '</ul>';
$html .= '</div><!-- .notice-$type -->';
$allowed_html = array(
'div' => array(
'class' => array(),
),
'ul' => array(),
'li' => array(),
);
echo wp_kses( $html, $allowed_html );
}
注意这里我们使用的是与上一教程相同的代码。 但是,我们对其进行了概括,以便它查看传入的$type
并将其动态地应用于标记。
这使我们可以使用一个功能来呈现消息。 这还不是全部。 那我们想要获取所有消息的时间呢? 这可能是在页面上呈现或以编程方式获取它们以进行其他处理。
为此,我们可以引入另一个功能:
<?php
public function get_all_messages() {
foreach ( $this->messages as $type => $message ) {
$this->get_messages( $type );
}
}
此消息应该足够容易理解。 它只是遍历我们集合中的所有消息,并调用上面概述的get_messages
函数。
它仍然将它们全部渲染在一起(我们将在自定义钩子的实现中暂时看到它们的一种用法)。 如果您想将它们用于其他目的,则可以将结果附加到字符串中,然后将其返回给调用方,或者执行其他一些编程功能。
这只是一种实现。
3.设置信使
对实际的Settings_Message
类执行此操作。 但是我们如何与之沟通呢? 当然,我们可以直接与之交谈,但是如果有一个中间类,我们可以控制返回给我们的内容,而无需对Settings_Message
类增加更多责任,对吗?
输入Settings_Messenger
。 此类负责允许我们读取和写入设置消息。 我认为可以提出一个案例,您可以根据其职责将其分为两类,因为它既可以读写,也可以像发送和接收的Messenger一样,是该类的目的。
该类的初始设置很简单。
- 构造函数创建
Settings_Message
类的实例,我们可以使用该实例发送和接收消息。 - 它将方法与我们在上一教程中定义的自定义
tutsplus_settings_messages
挂钩相关联。
看一下前两种方法:
<?php
class Settings_Messenger {
private $message;
public function __construct() {
$this->message = new Settings_Message();
}
public function init() {
add_action( 'tutsplus_settings_messages', array( $this, 'get_all_messages' ) );
}
}
记住,在本教程的前面,我们已经在视图中定义了挂钩,可以在settings.php
找到它。 为了完整起见,此处列出:
<div class="wrap">
<h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
<?php do_action( 'tutsplus_settings_messages' ); ?>
<p class="description">
We aren't actually going to display options on this page. Instead, we're going
to use this page to demonstration how to hook into our custom messenger.
</p><!-- .description -->
</div><!-- .wrap -->
但是请注意,这个特定的钩子利用了我们稍后将回顾的get_all_messages
方法。 不必使用此方法。 相反,它可以用于简单地呈现成功消息或您要使用的任何其他方法。
添加信息
创建添加消息的功能很简单,因为这些功能需要类型和消息本身。 记住, Settings_Message
负责清理信息,因此我们只需传递传入的消息即可。
请参阅下文,我们在其中添加成功,警告和错误消息:
<?php
public function add_success_message( $message ) {
$this->add_message( 'success', $message );
}
public function add_warning_message( $message ) {
$this->add_message( 'warning', $message );
}
public function add_error_message( $message ) {
$this->add_message( 'error', $message );
}
很简单,不是吗?
取得讯息
检索消息没有太大区别,只是我们只需要提供我们要检索的消息类型:
<?php
public function get_success_messages() {
echo $this->get_messages( 'success' );
}
public function get_warning_messages() {
echo $this->get_messages( 'warning' );
}
public function get_error_messages() {
echo $this->get_messages( 'error' );
}
做完了对吧?
但是你抓住了吗?
请注意,以上所有消息均涉及我们尚未实际涵盖的另外两种方法。 这些是私人消息,可以帮助我们简化上面的通话。
请检查以下专用方法,这些方法直接负责从Messenger对象上维护的Settings_Message
实例添加和检索消息:
<?php
private function add_message( $type, $message ) {
$this->message->add_message( $type, $message );
}
private function get_messages( $type ) {
return $this->message->get_messages( $type );
}
这样就包装了新的Settings_Messenger
类。 所有这些都简单得多,不是吗?
启动插件
但是,这确实提出了一个问题:在完成所有这些更改之后,我们如何启动插件?
请参阅下面的整个功能:
<?php
add_action( 'plugins_loaded', 'tutsplus_custom_messaging_start' );
/**
* Starts the plugin.
*
* @since 1.0.0
*/
function tutsplus_custom_messaging_start() {
$plugin = new Submenu(
new Submenu_Page()
);
$plugin->init();
$messenger = new Settings_Messenger();
$messenger->init();
$messenger->add_success_message( 'Nice shot kid, that was one in a million!' );
$messenger->add_warning_message( 'Do not go gently into that good night.' );
$messenger->add_error_message( 'Danger Will Robinson.' );
}
就是这样。
需要注意的几点:
- 如果您没有在
Settings_Messenger
上调用init,那么您不必担心在设置页面上显示任何消息。 - 该代码将消息添加到
Settings_Messenger
,但是实际上并没有检索到任何消息,因为我正在使用init方法。 - 如果要检索消息,则可以使用上面概述的方法。
这就是重构的全部。 这不完全开箱作为仍有加载所有的PHP文件中需要一些代码需要让插件工作; 但是,上面的代码着重于重构,这是整个教程的重点。
结论
在本教程中,完整的源代码, 不工作的开箱的完整工作版本,请下载安装到这个职位上的右边栏的源代码。
我希望在学习本材料的过程中,您学到了许多新的技巧和方法来进行WordPress开发。 查看该系列时,我们涵盖了很多内容:
和往常一样,我也总是很乐意通过评论回答问题,您也可以查看我的博客并在Twitter上关注我 。 我通常都会谈论WordPress中的软件开发以及切线主题。 如果您对WordPress的更多开发感兴趣,请不要忘记查看我以前的系列和教程以及Envato Tuts +上的其他WordPress材料 。
翻译自: https://code.tutsplus.com/tutorials/creating-a-custom-wordpress-messaging-system-part-4--cms-27839