Dalam siri ini, kami mempelajari cara melaksanakan sistem yang membolehkan kami mentakrifkan penyesuaian secara pemrograman yang muncul pada halaman pentadbir tertentu pada maklumat hujung belakang WordPress.
Jika anda telah mengikuti siri ini setakat ini, anda tahu:
Seperti yang dinyatakan dalam tutorial sebelumnya:
Tetapi jika anda telah membaca mana-mana tutorial saya sebelum ini, anda akan tahu bahawa saya tidak suka kod pendua. Saya juga tidak suka satu kelas melakukan banyak perkara. Malangnya, itulah yang kami lakukan.
Kami akan menyelesaikan masalah ini dalam tutorial akhir. Pada akhirnya, kami akan mempunyai penyelesaian pemfaktoran semula lengkap yang menggunakan beberapa prinsip berorientasikan objek perantaraan (seperti warisan). Kami juga akan menyediakan beberapa kaedah yang boleh digunakan secara pemrograman atau boleh didaftarkan dalam sistem hooking WordPress.
Pada ketika ini anda harus tahu dengan tepat apa yang anda perlukan dalam persekitaran pembangunan tempatan anda. Secara khusus, anda sepatutnya mempunyai kelayakan berikut:
Saya juga mengesyorkan versi terbaharu kod sumber kerana ia membolehkan anda melalui semua perubahan yang akan kami lakukan. Jika anda tidak mempunyai satu, tidak mengapa, tetapi saya mengesyorkan membaca tutorial sebelum ini sebelum meneruskan.
Seperti yang anda ingat (atau pastikan daripada komen di atas), tutorial sebelumnya meninggalkan kami dengan kelas yang melakukan terlalu banyak kerja.
Satu cara untuk memahami perkara ini ialah jika anda menerangkan perkara yang dilakukan oleh kelas, anda tidak akan dapat memberikan satu jawapan. Sebaliknya, anda perlu mengatakan bahawa ia bertanggungjawab untuk mengendalikan mesej kejayaan, mesej amaran, mesej ralat dan menyampaikan semua mesej secara berasingan antara satu sama lain.
Walaupun anda mungkin mengatakan ia "uruskan mesej tersuai", anda tidak semestinya menggambarkan betapa kasarnya kelas itu. Inilah yang kami harap dapat diselesaikan dalam tutorial ini.
Secara khusus, kami akan mempertimbangkan untuk melakukan perkara berikut:
Kami telah melaksanakan tugas kami, jadi mari kita teruskan dan mula melaksanakan semua perkara di atas.
Apabila memfaktorkan semula kerja kita, ia membantu untuk mengetahui dengan tepat apa yang ingin kita lakukan. Dalam kes kami, kami menyedari bahawa kami mempunyai banyak kod pendua yang boleh dimampatkan.
Selain itu, kami mengurus tiga jenis mesej yang berbeza dengan cara yang sama, kecuali cara ia disampaikan. Dalam kes ini, ia adalah masalah dengan atribut kelas HTML.
Jadi kita boleh generalisasi kod ini untuk menumpukan pada tertentu jenis dan kita boleh menyatukan banyak menambah mesej kejayaan dengan menggeneralisasikan cara untuk mengenal pasti atau Kaedah untuk mendapatkan semula mesej ralat > Taip .
Akhirnya, kami akan lakukan ini. Tetapi pertama, beberapa pengemasan perlu dilakukan.
Dalam tutorial sebelumnya, kami telah menggunakan kelas yang dipanggil Settings_Messenger
. Setakat ini ia telah memenuhi tujuannya, tetapi kami akan memfaktorkan semula kelas ini dalam tutorial yang lain. 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
Settings_Message
. Ini mewakili sebarang jenis mesej persediaan yang ingin kami tulis. Iaitu, ia akan mengurus kejayaan, ralat, dan mesej amaran. #🎜🎜#
#🎜🎜#Untuk melakukan ini, kami akan mentakrifkan kelas, memperkenalkan sifat dan membuat instantiat dalam pembina. Lihat kod ini, saya akan terangkan lebih lanjut di bawah: #🎜🎜#
<?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 ); }
$messages
. Apabila membuat instance kelas ini, kami mencipta tatasusunan berbilang dimensi. Setiap indeks dikenal pasti melalui kejayaan
, ralat
atau amaran
, merujuk sendiri tatasusunan di mana kami akan menyimpan mesej yang sepadan. #🎜🎜#
接下来,我们需要能够添加消息、获取消息以及获取所有消息。我将立即更详细地讨论其中的每一个。
首先,让我们看看如何添加消息:
<?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
, maka anda tidak perlu risau tentang sebarang mesej yang dipaparkan pada halaman tetapan. Settings_Messenger
上调用 init,那么您不必担心在设置页面上显示任何消息。Settings_Messenger
Kod ini menambahkan mesej pada Settings_Messenger
tetapi sebenarnya tidak mengambil sebarang mesej kerana saya menggunakan kaedah init. Inilah maksud pemfaktoran semula. Ini tidak berfungsi sepenuhnya di luar kotak, kerana beberapa kod masih diperlukan untuk memuatkan semua fail PHP yang diperlukan untuk pemalam itu berfungsi, namun, kod di atas memfokuskan pada pemfaktoran semula, yang merupakan tumpuan keseluruhan tutorial.
Untuk mendapatkan versi tutorial yang berfungsi sepenuhnya dengan kod sumber lengkap di luar kotak, muat turun kod sumber yang dilampirkan pada artikel ini di bar sisi kanan.
Saya berharap dengan mempelajari bahan ini, anda akan dapat menguasai beberapa kemahiran dan kaedah baharu untuk pembangunan WordPress. Banyak yang telah kami bincangkan semasa melalui siri ini:
Seperti biasa, saya juga berbesar hati untuk menjawab soalan melalui komen, dan anda juga boleh menyemak blog saya dan mengikuti saya di Twitter . Saya biasanya bercakap tentang pembangunan perisian dalam WordPress dan beberapa topik yang tidak berkaitan. Jika anda berminat dengan lebih banyak pembangunan WordPress, jangan lupa untuk melihat siri dan tutorial saya sebelum ini, serta bahan WordPress lain yang kami tawarkan di sini di Envato Tuts+.
Atas ialah kandungan terperinci Merekabentuk Platform Komunikasi WordPress Diperibadikan, Bahagian 4. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!