在本系列中,我們了解如何實作一個系統,該系統允許我們以程式設計方式定義顯示在 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中文網其他相關文章!