WordPress-mallar för nybörjare: HTML Calling PHP
Igår skissade jag på hur man kan föreställa sig hur många av oss som sannolikt är vana vid att arbeta med WordPress-mallar.
Även om separeringen av problem med CSS och JavaScript är solid, är mallar problematiska när det finns mycket PHP blandat med vår uppmärkning.
För att vara tydlig kan vi inte låta bli att inkludera malltaggar eftersom det är den typ av hur WordPress och allmänna PHP-baserade innehållshanteringssystem fungerar.
Problemet kommer när vi arbetar med mallar som innehåller kod som gör mer komplexa anrop till olika API:er. Även om jag visade detta med WP_Query (och kommer att fortsätta att göra det), är det inte bara den frågan.
Hur som helst, vad ska vi göra med det här?
WordPress-mallar: När HTML anropar PHP
Först är det viktigt att tänka på varför det är en dålig idé att blanda så mycket PHP och markeringar.
Det är lätt att säga att det gör det svårare att hålla koden DRY (och det är sanning i det), men vad händer om vi bara kommer att använda en enda fråga eller ett enda kodblock en gång? Är det verkligen så viktigt att vara TORR?
För att vara tydlig, ja, jag tror att det är viktigt för att hålla koden DRY, men om vi bara ska använda ett samtal en gång tror jag fortfarande att det spelar roll om det inte är av någon annan anledning än att hålla mallkoden så ren som möjlig.
Tänk på det så här: När vi vill visa titeln, innehållet och inläggets författare behöver vi bara anropa tre funktioner:
Så tänk dig att anpassa följande kod (vilket är vad vi tittade på i förra inlägget):
<div id="content-container">
<p>
Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here!
Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that
thing away! You're going to get us all killed.
</p>
<h2>List of Post Titles For Acme Post Type</h2>
<?php
$args = array(
'post_status' => 'publish',
'post_type' => 'acme',
'posts_per_page' => '10'
);
$custom_query = new WP_Query( $args );
if ($custom_query->have_posts()) {
echo '<ul>';
while ($custom_query->have_posts()) {
$custom_query->the_post();
echo '<li>'. get_the_title(). '</li>';
}
echo '</ul>';
wp_reset_postdata();
}
?>
<p>
Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not
going to take them long to figure out what happened to us. It could be worst... It's worst.
There's something alive in here! That's your imagination. Something just moves past my leg!
Look! Did you see that? What? Help!
</p>
</div><!-- #content-container -->
För att se ut så här:
<div id="content-container">
<p>
Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here!
Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that
thing away! You're going to get us all killed.
</p>
<h2>List of Post Titles For Acme Post Type</h2>
<?php acme_get_titles(); ?>
<p>
Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not
going to take them long to figure out what happened to us. It could be worst... It's worst.
There's something alive in here! That's your imagination. Something just moves past my leg!
Look! Did you see that? What? Help!
</p>
</div><!-- #content-container -->
Mycket renare, eller hur? Men det finns mer i det du ser än det här. Specifikt, om vi ska arbeta med HTML bakom kulisserna, måste vi se till att vi sanerar det korrekt med något som wp_kses :
<?php
/**
* Runs a custom query to get the most recent ten published articles of the
* acme post type and then prints a sanitized list of the the titles.
*/
function acme_get_titles()
{
$args = array(
'post_status' => 'publish',
'post_type' => 'acme',
'posts_per_page' => '10'
);
$custom_query = new WP_Query( $args );
if ($custom_query->have_posts()) {
$html = '<ul>';
while ($custom_query->have_posts()) {
$custom_query->the_post();
$html .= '<li>'. get_the_title(). '</li>';
}
$html .= '</ul>';
wp_reset_postdata();
}
echo _acme_sanitize_titles($html);
}
/**
* Uses the WordPress wp_kses() API to sanitize and echo the incoming markup.
*
* @param string $html The HTML to sanitize.
*/
function _acme_sanitize_titles($html) {
if(empty($html)) {
echo $html;
}
echo wp_kses(
$html,
array(
'ul' => array(),
'li' => array(),
);
);
}
Nu anses idén att eko HTML från PHP till en WordPress-mall vara ett antimönster av vissa utvecklare. Och detta är inte utan förtjänst.
Det finns dock en balansgång att spela under den här seriens gång: Det handlar om att introducera hur människor ofta presenterar information och sedan rensa upp den lite.
För att ta det här lite längre är det möjligt – och inte alls en dålig idé – att separera WP_Query-funktionen ännu mer för att använda get_template_part. Detta för med sig lite renare kod men kräver också att vi tittar på den funktionen på djupet.
Och det är något som jag inte är intresserad av att göra i just den här serien.
Hur ska vi visualisera detta?
När det gäller mall kan vi begreppsbilda detta på ett par olika sätt.
- I vissa mallspråk är det bra att tänka på PHP som injicerar informationen i mallen,
- I exemplet ovan är det bra att tänka på mallfilen som begär informationen från PHP-skriptet.
Så i exemplet ovan har vi en funktion som finns i till exempel functions.php och mallfilen som anropar den:
Vettigt? Men hur detta åstadkoms – i termer av koden bakom det enda funktionsanropet – är innehållet för ett inlägg helt och hållet.
Och det är vad jag kommer att titta på i följande inlägg.