Mis puudutab kiirprototüüpe ja WordPressi, siis oleme siiani teinud kahte asja:
Praegusel hetkel oleme teinud piisavalt tööd, et õigustada koodi ümberkujundamise alustamist. See tähendab, et hakkame prototüüpi koodiks teisendama. Kuid see on midagi, mida tuleb teha kahes etapis.
Esiteks tutvustame lihtsalt klasse, mis esindavad eelmise postituse diagramme ja mis hõlmavad iga projekti vastutust.
Pärast seda vaatame koodi korraldamist nimeruumidesse ja pakettidesse. Enne kui saame seda teha, peame siiski veenduma, et kood on objektorienteeritud ja töötab. Nii et see selles postituses juhtub.
Prototüüp koodiks
Kui olete varasemaid postitusi lugenud, siis pange tähele, et kavatsen järgida eelmises postituses visandatud korraldust. Loomulikult ei pea te seda konkreetset disaini järgima.
Mõni sõna allika juhtimise kohta
Kui kasutate allika juhtimist, soovitan siin luua põhiharu haru (kui kasutate Giti), et saaksite oma tööd teha ilma koodi stabiilset versiooni karmistamata.
See jääb seeriast veidi kaugemale, nii et kui te ei kasuta allika juhtimist, ärge muretsege. Kui olete, valin selle filiaali nimeks arendada . Kui olen kindel, et see toimib, ühendan selle tagasi masteriks .
Koodi kirjutamine
Eile visandatud töö kohaselt loon kaks klassi:
- metaboksi klass,
- metakasti kuvamise klass.
Koodi taaskasutatakse osaliselt sellest, mida oleme juba näinud, nagu näete järgmises koodis.
Kood
Esiteks meie metakast :
<?php
/**
* Registers the Meta Box with WordPress.
*
* @author Tom McFarlin
* @since 0.2.0
*/
/**
* Registers the Meta Box with WordPress. Defines the ID, title, display function,
* and the post type on which it will live.
*
* @author Tom McFarlin
* @since 0.2.0
*/
class Meta_Box {
/**
* A reference to the class that will display the contents in the meta box.
*
* @access private
* @var Meta_Box_Display
*/
private $meta_box_display;
/**
* Instantiates the class by setting its property equal to a reference to its display.
*/
public function __construct() {
$this->meta_box_display = new Meta_Box_Display();
}
/**
* The function responsible for hooking into the WordPress API.
*/
public function init() {
add_meta_box(
'three-recent-posts',
'Three Recent Posts',
array( $this->meta_box_display, 'display' ),
'post',
'side'
);
}
}
Ja järgmiseks meie ekraan :
<?php
/**
* Defines the display for the meta box.
*
* @author Tom McFarlin
* @since 0.2.0
*/
/**
* Defines the display for the meta box that will render the content in the
* context of its meta box.
*
* @author Tom McFarlin
* @since 0.2.0
*/
class Meta_Box_Display {
/**
* A reference to the class that will display the contents in the meta box.
*
* @access private
* @var Post_Messenger
*/
private $messenger;
/**
* Instantiates the object by setting a property equal to that of the class
* responsible for rendering the messages from the post query.
*/
public function __construct() {
$this->messenger = new Post_Messenger( $this );
}
/**
* If there are posts to display, renders them in the metabox. Otherwise, displays
* a note that there are no posts to display.
*/
public function display( $message) {
$this->messenger->get_message();
}
}
Et metaboksi koodis metaboksi koodis me eksplitsiitselt instantseerime kuva, et saaksime vajadusel kutsuda seda kuvamismeetodiks.
Teine võimalus oleks instantseerida kaks objekti eraldi ja seejärel sisestada ekraan konstruktorisüsti või muu sarnase kaudu metakasti. Seda tuleks teha kolmanda osapoole klassis.
Selle eelised tulenevad kahe klassi lahtiühendamisest. Võib-olla vaatame järgmises postituses üle, kuidas seda teha.
Pärast seda peame edasi minema ja määratlema klassi, mis vastutab sõnumite kuvamise eest metaboksi kuva kontekstis. Seda me nimetame Post Messengeriks :
<?php
/**
* Display content for the meta box when requested.
*
* @author Tom McFarlin
* @since 0.2.0
*/
/**
* Retrieves information from the class responsible for querying the database and
* renders it in the context of our meta box when called via the Meta Box Display.
*
* @author Tom McFarlin
* @since 0.2.0
*/
class Post_Messenger {
/**
* A reference to the query resonsible for retrieving post information from
* the database.
*
* @access private
* @var WP_Query
*/
private $query;
/**
* A reference to the message that's displayed in the view of the
* meta box.
*
* @access private
*/
private $message;
/**
* Instantiates the class by setting a reference to the query.
*/
public function __construct() {
$this->query = new Post_Query();
}
/**
* Retrieves the content to be displayed in the meta box.
*/
public function get_message() {
$this->get_description();
if ($this->query->has_posts()) {
$this->get_post_message();
} else {
$this->get_no_posts_message();
}
}
/**
* Displays the description of the content of the meta box.
*
* @access private
*/
private function get_post_message() {
include_once 'post-list.php';
}
/**
* Displays the description of the content of the meta box.
*
* @access private
*/
private function get_description() {
include_once 'message-description.php';
}
/**
* Displays a message of there are no recent posts.
*
* @access private
*/
private function get_no_posts_message() {
include_once 'no-post-list.php';
}
}
Pange tähele, et Post Messenger viitab ka postituspäringule. See on klass, kus toimub side andmebaasiga. Lisasin ka mõned abifunktsioonid, et muuta vaatamiskood veidi lihtsamaks, nagu me kohe näeme.
<?php
/**
* Queries the database for three most recent posts.
*
* @author Tom McFarlin
* @since 0.2.0
*/
/**
* Queries the database for three most recent posts. Returns the query to the
* caller so that it can be interrogates for posts or not.
*
* @author Tom McFarlin
* @since 0.2.0
*/
class Post_Query {
/**
* A reference to the WP_Query this class wraps.
*
* @access private
* @var WP_Query
*/
private $query;
/**
* Instantiates the class by preparing instance data and executing the
* query so the display can render the contents.
*/
public function __construct() {
$this->query = null;
$this->get_posts();
}
/**
* Executes the query for returning the post recent posts ordered by date.
*
* @access private
*/
private function get_posts() {
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'desc',
);
$this->query = new WP_Query( $args );
return $this->query;
}
/**
* A helper function to determine if the query has any posts.
*/
public function has_posts() {
return! $this->query->have_posts();
}
/**
* A helper function for retrieving the next post in the list of
* posts
*/
public function the_post() {
return $this->query->the_post();
}
}
Ja see ongi põhiklasside jaoks. Muidugi tuleb veel vaadetest rääkida.
Vaated
Vaated vastutavad HTML-i renderdamise eest metakasti kontekstis. Mulle ei meeldi PHP kontekstis HTML-i kirjutamine (ega ka PHP segamine HTML-i kontekstis, kuid see on selle projekti puhul paratamatu).
Selle lihtsamaks muutmiseks on mõned suurepärased malliprojektid, kuid ma kaldun kõrvale. Igatahes märkad, et post-list.php failis on viited abifunktsioonidele klassis Post Query. Selle eesmärk on olla kindel, et ma ei paljasta liiga palju omadusi ega riku Demeteri seadust.
Vaatame kõigepealt seda faili, kuna see on kõige keerulisem :
<ol>
<?php while ($this->query->has_posts()) { ?>
<?php $this->query->the_post(); ?>
<li>
<a href="<?php get_the_permalink(); ?>" target="_blank">
<?php echo get_the_title(); ?>
</a>
</li>
<?php } ?>
</ol>
See näeb välja nagu standardne WordPressi kood, kuid pidage meeles, et kuna seda faili kutsutakse välja Post Messengeris, viitab see päringule kui päringule, mille see klass ümbritseb.
Kaks viimast faili on üsna sirgjoonelised. Üks neist annab kirjelduse :
<p>
<span class="description">
Displays up to the three most recent posts.
</span><!-- .description -->
</p>
Teine annab sõnumi, kui postitusi pole :
<p>There are no recent posts.</p>
Peale selle on põhifunktsioonid tehtud.
Plugina alglaadimine
Viimane asi, mida peame tegema, on pistikprogrammi käivitamine. Selleks muudame peamise pistikprogrammi faili koodi nii, et see näeks välja järgmine :
<?php
/**
* Three Recent Posts
*
* @package TRP
* @author Tom McFarlin
* @copyright 2017 Tom McFarlin
* @license MIT
*
* @wordpress-plugin
* Plugin Name: Three Recent Posts
* Plugin URI: https://tommcfarlin.com/three-recent-posts/
* Description: Displays the three mot recent posts in your post editor screen.
* Version: 0.2.0
* Author: Tom McFarlin
* Author URI: https://tommcfarlin.com
* Text Domain: three-recent-posts
* License: GPL
* License URI: http://www.gnu.org/licenses/gpl-3.0.txt
*/
include 'class-meta-box.php';
include 'class-meta-box-display.php';
include 'class-post-messenger.php';
include 'class-post-query.php';
add_action( 'add_meta_boxes', 'trp_start' );
/**
* Starts the plugin.
*/
function trp_start() {
$meta_box = new Meta_Box();
$meta_box->init();
}
See haakub WordPressiga, loob meie pistikprogrammi ja paneb selle siis liikuma. Kui käivitate selle WordPressi installimise ajal, peaks see välja nägema täpselt nii, nagu see oli esimese versiooni ajal.
Ainus erinevus on see, et meil on nüüd asjad korraldatud klasside kaupa, mitte üksikute funktsioonide kaupa.
Märkmed
Esiteks on siin võimalusi ümberkujundamiseks, mis vähendaks lahtisidumist veelgi (nt erinevat tüüpi sõltuvuse süstimine jne), kuid selle seeria eesmärk ei ole seda hõlmata.
Selle asemel on mõte näha paljude protseduuriliste funktsioonide poolt kirjutatud pistikprogramme ja seejärel jagada need kontseptuaalsemateks klassideks, mis hõlmavad nende kohustusi.
Teiseks, kui vaatate projekti selle versiooni hoidlas oleva lähtekoodi üle, näete, et tutvustasin ka faili composer.json. Seda selleks, et saaksin koodi kirjutamisel ära kasutada PHP CodeSnifferi ja WordPressi kodeerimisstandardeid.
Sarja viimases osas vaatame läbi nimevahed ja korraldame failid ümber. Kui aega lubab, lisame automaatlaaduri, et me ei peaks oma pistikprogrammi faili ülaossa faile käsitsi lisama.
Lõpuks ühendasin selle koodi põhikoodiga ja märgistasin selle kui 0.2.1 (kuna pidin tegema väikese kiirparanduse), kuna see on veel pooleli.