在本系列中,我們了解如何實作一個系統,該系統允許我們以程式設計方式定義顯示在 WordPress 後端的給定管理頁面上的自訂訊息。
如果您到目前為止一直在關注該系列,那麼您就會知道:
- 我們已經為本系列中使用的插件奠定了基礎,甚至進一步開發了它。
- 我們定義並使用了一個自訂掛鉤,可用來呈現設定訊息。
- 我們添加了對成功、警告和錯誤訊息的支持,這些訊息可以在給定設定頁面的頂部呈現。
如上一篇教學所提到的:
但是如果您讀過我之前的任何教程,您就會知道我不喜歡重複的程式碼。我也不喜歡讓一個班級做很多事。不幸的是,這正是我們正在做的事情。
我們將在最後的教程中解決這個問題。最後,我們將擁有一個完整的重構解決方案,該解決方案使用一些中間的物件導向原則(例如繼承)。我們還將提供一些可以以程式設計方式使用或可以在 WordPress 掛鉤系統中註冊的方法。
最後開始
此時您應該確切地知道本機開發環境中需要什麼。具體來說,您應該具備以下條件:
- PHP 5.6.25 和 MySQL 5.6.28
- Apache 或 Nginx
- WordPress 4.6.1
- 您首選的 IDE 或編輯器
我還推薦最新版本的源代碼,因為它允許您逐步完成我們將要進行的所有更改。如果您沒有,也沒關係,但我建議您在繼續之前先閱讀之前的教學。
在上一個教學
您可能還記得(或從上面的評論中確定),上一個教程給我們留下了一個做了太多工作的類別。
了解這一點的一種方法是,如果您要描述班級正在做什麼,您將無法給出單一答案。相反,您必須說它負責處理成功訊息、警告訊息、錯誤訊息,並相互獨立地呈現所有訊息。
雖然您可能會說它是“管理自訂訊息”,但您不一定會描述該類別有多冗長。這就是我們希望在本教程中解決的問題。
在最終教程中
具體來說,我們將考慮執行以下操作:
- 刪除舊的設定信差類別
- 新增新的、更通用的設定訊息類別
- 新增用於通訊的設定信差類別
- 介紹我們可以獨立於 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
。这个类负责允许我们读取和写入设置消息。我认为您可以根据其职责将其分为两个类,因为它既可以读取也可以写入,但是就像发送和接收的信使一样,这就是此类的目的。
该类的初始设置很简单。
- 构造函数创建
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 建立自訂管理頁面
- WordPress 設定 API
- 如何開始使用 WordPress
- 新增操作
- 執行操作
- wp_kses
- 清理文字欄位
以上是設計個人化 WordPress 通訊平台,第 4 部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器