✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Шаблоны WordPress для начинающих: HTML вызывает PHP

21

Вчера я набросал, как понять, как многие из нас, вероятно, привыкли работать с шаблонами WordPress.

Хотя разделение проблем с CSS и JavaScript четкое, с шаблонами возникают проблемы, когда в нашу разметку смешивается много PHP.

Чтобы было ясно, мы не можем не включать теги шаблонов, потому что это природа того, как работают WordPress и общие системы управления контентом на основе PHP.

Проблема возникает всякий раз, когда мы работаем с шаблонами, содержащими код, выполняющий более сложные вызовы различных API. Хотя я продемонстрировал это с помощью WP_Query (и буду продолжать это делать), дело не только в этом запросе.

Впрочем, что нам с этим делать?

Шаблоны WordPress: когда HTML вызывает PHP

Во-первых, важно подумать о том, почему смешивание такого количества PHP и разметки — плохая идея.

Легко сказать, что это усложняет сохранение кода в СУХОМ виде (и это правда), но что, если мы собираемся использовать один запрос или один блок кода один раз? Так ли уж важно быть СУХИМ?

Чтобы быть ясным, да, я думаю, что это важно для того, чтобы сохранить код СУХИМ, но если мы собираемся использовать вызов только один раз, я все еще думаю, что это имеет значение, хотя бы по той причине, что код шаблона остается таким же чистым, как возможный.

Подумайте об этом так: всякий раз, когда мы хотим отобразить заголовок, содержание и автора сообщения, все, что нам нужно, это вызвать три функции:

Итак, представьте себе адаптацию следующего кода (это то, что мы рассмотрели в предыдущем посте):

<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 -->

Чтобы выглядеть примерно так:

<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 -->

Гораздо чище, правда? Но есть нечто большее, что вы видите, чем это. В частности, если мы собираемся работать с HTML за кулисами, нам нужно убедиться, что мы правильно очищаем его, используя что-то вроде 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(),
    );
  );
}

Теперь идея дублирования HTML из PHP в шаблон WordPress рассматривается некоторыми разработчиками как антишаблон. И это не без заслуг.

Тем не менее, в ходе этой серии необходимо найти баланс: нужно представить, как люди часто представляют информацию, а затем немного ее очистить.

Чтобы пойти дальше, можно — и в целом это неплохая идея — еще больше отделить функцию WP_Query для использования get_template_part. Это приносит с собой немного более чистого кода, но также требует, чтобы мы подробно рассмотрели эту функцию.

И это то, что мне не интересно делать в этой конкретной серии.

Как мы должны визуализировать это?

Когда дело доходит до шаблонов, мы можем концептуализировать это несколькими разными способами.

  1. В некоторых языках шаблонов полезно думать о том, что PHP вводит информацию в шаблон,
  2. В приведенном выше примере полезно подумать о файле шаблона, запрашивающем информацию из скрипта PHP.

Итак, в приведенном выше примере у нас есть функция, расположенная, скажем, в functions.php, и вызывающий ее файл шаблона:

Есть смысл? Но то, как это достигается — с точки зрения кода, стоящего за этим единственным вызовом функции, — является содержанием отдельного поста.

И это то, что я буду смотреть в следующем посте.

Источник записи: tommcfarlin.com

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее