在本系列中,我们了解了如何实现一个系统,该系统允许我们以编程方式定义显示在 WordPress 后端的给定管理页面上的自定义消息。
如果您到目前为止一直在关注该系列,那么您就会知道:
正如上一篇教程中提到的:
但是如果您读过我之前的任何教程,您就会知道我不喜欢重复的代码。我也不喜欢让一个班级做很多事情。不幸的是,这正是我们正在做的事情。
我们将在最后的教程中解决这个问题。最后,我们将拥有一个完整的重构解决方案,该解决方案使用一些中间的面向对象原则(例如继承)。我们还将提供一些可以以编程方式使用或可以在 WordPress 挂钩系统中注册的方法。
此时您应该确切地知道本地开发环境中需要什么。具体来说,您应该具备以下条件:
我还推荐最新版本的源代码,因为它允许您逐步完成我们将要进行的所有更改。如果您没有,也没关系,但我建议您在继续之前先阅读之前的教程。
您可能还记得(或从上面的评论中确定),上一个教程给我们留下了一个做了太多工作的类。
了解这一点的一种方法是,如果您要描述班级正在做什么,您将无法给出单一答案。相反,您必须说它负责处理成功消息、警告消息、错误消息,并相互独立地呈现所有消息。
虽然您可能会说它是“管理自定义消息”,但您不一定会描述该类有多么冗长。这就是我们希望在本教程中解决的问题。
具体来说,我们将考虑执行以下操作:
我们已经完成了我们的工作,所以让我们继续并开始执行上述所有内容。
在重构我们的工作时,准确地了解我们想要做什么是有帮助的。在我们的例子中,我们认识到我们有很多可以压缩的重复代码。
此外,我们以完全相同的方式管理三种不同类型的消息,除了它们的呈现方式之外。在这种情况下,这是 HTML 类属性的问题。
因此,我们可以将该代码概括为专注于特定的类型,并且我们可以通过概括一种识别所述的方法来整合许多添加成功消息或检索错误消息的方法>类型。
最终,我们会这么做。但首先,需要做一些内务处理。
在之前的教程中,我们一直在使用一个名为 Settings_Messenger
的类。到目前为止,它已经达到了它的目的,但我们将在本教程的其余部分中重构此类。
当涉及到这种类型的重构时,很容易想要简单地删除类并重新开始。有时这是合适的,但这不是其中之一。相反,我们将学习该课程并重构已有的内容。
所有这些都是为了说明,不要删除该文件并开始使用新文件。相反,请跟踪我们在本教程中所做的事情。
首先我们介绍一个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 ); }
该消息首先获取传入的字符串并清理数据。然后它检查它是否已存在于成功消息中。如果是这样,它就会返回。毕竟,我们不想要重复的消息。
否则,它会将消息添加到集合中。
检索消息有两种形式:
请记住,有时我们可能只想显示警告消息。其他时候,我们可能想要显示所有消息。由于有两种方法可以做到这一点,我们可以利用其中一种方法,然后在其他函数中利用它。
听起来很混乱?请耐心等待,我会解释这一切。我们要关注的第一部分是如何按类型呈现消息(例如成功、错误或警告)。这是执行此操作的代码(看起来应该很熟悉):
<?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
函数。
它仍然将它们全部渲染在一起(我们很快就会在自定义钩子的实现中看到它们的一种使用)。如果您想将它们用于其他目的,您可以将结果附加到字符串中并将其返回给调用者,或者执行一些其他编程功能。
这只是一个实现。
这适用于实际的 Settings_Message
类。但我们如何与它沟通呢?当然,我们可以直接与它对话,但是如果有一个中间类,我们可以对返回给我们的内容进行一些控制,而无需向 Settings_Message
类添加更多责任,对吗?
输入Settings_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' ); }
完成了,对吧?
请注意,上面的消息均引用了我们尚未实际介绍的另外两种方法。这些私人消息可以帮助我们简化上述通话。
查看以下私有方法,它们负责直接从信使对象上维护的 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 材料。
以上是设计个性化 WordPress 通信平台,第 4 部分的详细内容。更多信息请关注PHP中文网其他相关文章!