Работа с классами, шаблонами и партиалами в WordPress
Когда я сел, чтобы начать этот пост, я планировал написать что-то гораздо более сложное, чем то, чем я собираюсь поделиться. Изначально я хотел пройти через одну из двух вещей:
- Полное руководство по настройке среды разработки,
- Интеграция инструментов качества кода в PhpStorm
Первый — сосредоточиться на множестве других вещей, о которых я говорил, связать их все вместе и получить окончательную ссылку. Но это то, что я хочу собрать воедино, чтобы убедиться, что все сделано правильно.
Второй — тот, который я считаю важным, но я нахожусь в переходной фазе с некоторыми из моих собственных инструментов. Пока это не будет сделано, я бы не хотел писать об этом.
Тем не менее, всегда есть что покрыть, верно? Поэтому сегодня я выбрал что-то более простое: разобрать использование классов, шаблонов и партиалов в плагинах WordPress на простом примере.
Классы, шаблоны и партиалы в WordPress
В связи с этой конкретной темой сразу же может возникнуть простой вопрос: зачем говорить об этом?
Потому что на дворе 2018 год, а мы все еще видим грубую смесь PHP, CSS, разметки и JavaScript в одном файле. Это не удар по другим технологиям, которые делают это по умолчанию (например, React). Я говорю конкретно о плагинах WordPress и написании поддерживаемого кода таким образом, чтобы его [очевидно] было легко поддерживать, писать и читать.
Практический пример
Допустим, вы работаете над страницей подменю для чего-то, что будет отображаться в пользовательском меню. Вы регистрируете свою страницу с помощью WordPress API:
<?php
public function addMenuPage()
{
add_menu_page(
'Acme Menu',
'Acme Menu',
'manage_options',
'acme-custom-menu',
array($this, 'display'),
'dashicons-dashboard',
30
);
add_submenu_page(
'acme-custom-menu',
'Acme Menu',
'Acme Menu',
'Acme Menu',
'acme-custom-menu',
array($this, 'display')
);
}
Но когда вы настраиваете функцию обратного вызова для отображения страницы, вы не используете эту функцию для смешивания всех различных языков вместе. Вместо этого вы используете его для включения файла.
<?php
public function display()
{
include_once $this->pluginPath. 'views/acme-settings.php';
}
Обратите внимание, что в приведенном выше файле я ссылаюсь на свойство $this->pluginPath. Это устанавливается в конструкторе класса, чтобы я мог легко получить доступ к корню плагина.
В любом случае, как может выглядеть этот файл?
Шаблон и партиал
В этом случае я предполагаю, что ваш шаблон — это то, что будет предоставлять информацию пользователю и запрашивать его ввод. Партиал будет отвечать за отображение сообщения об успехе, ошибке или предупреждении для пользователя.
Шаблон
Чтобы не усложнять задачу, я буду делать как шаблон, так и партиал настолько компактными, насколько это возможно. В этом случае предположим, что мы собираемся отобразить страницу, попросим пользователя сохранить значение, и если значение будет успешно сохранено (и, следовательно, существует в таблице wp_options ), мы отобразим сообщение об успешном завершении.
Это означает:
- шаблон будет отображать заголовок страницы, информацию, ввод и кнопку сохранения,
- частичное будет отображать сообщение об успехе, когда это необходимо.
Взгляните на код шаблона ниже:
<?php
/**
* Renders the settings page for the plugin.
*/
?>
<div class="wrap">
<h1 class="wp-heading-inline"><?php echo get_admin_page_title(); ?></h1>
<?php if ($this->showSuccessMessage()) { ?>
<?php include_once 'partials/settings-saved.php'; ?>
?>
<div id="acme-settings-schedule">
<form id="acme-form" method="post" action="<?php echo esc_html(admin_url('admin-post.php')); ?>"">
<!-- This is where your settings go. -->
<p>
<?php
submit_button(
'Save',
'primary',
'acme-save-settings',
false
);
wp_nonce_field(
'acme-save',
'acme-save-nonce'
);
?>
</p>
</form>
</div>
</div>
Обратите внимание, что да, у него есть вход, кнопка сохранения и одноразовый номер, которые важны (но выходят за рамки этого поста) для сохранения информации.
Но также обратите внимание, что у него есть вспомогательная функция, которую я использую для проверки наличия успешно сохраненной информации. Эта функция находится в том же классе, который отвечает за рендеринг шаблона.
Частичный
Это выглядит примерно так:
<?php
public function showSuccessMessage()
{
return (false !== get_option('acme_custom_setting'));
}
И результирующий партиал очень прост:
<?php
/**
* Renders the success message if the option has been properly saved.
*/
?>
<div class="notice-success notice is-dismissible">
<p>Your settings have been successfully saved.</p>
<button type="button" class="notice-dismiss">
<span class="screen-reader-text">Dismiss this notice.</span>
</button>
</div>
Конечно, ваша реализация функции может отличаться. Цель состоит не столько в том, чтобы показать, как реализовать функцию, сколько в том, как использовать функцию для проверки информации для отображения партиала.
Есть еще (но не здесь)
Может быть, это то, что следует разместить в начале статьи.
Честно говоря, я думаю, что это одна из тех вещей, когда некоторым может быть полезнее увидеть это с самого начала (но тогда не будет контекста кода), а другим будет полезнее в конце, потому что они могут увидеть, как все это подходит. вместе.
Несмотря на это, я надеюсь, что в конечном итоге это прояснит, как все это сочетается друг с другом.
Кроме того, есть много места для вещей, которые можно настроить, например:
- проверка, чтобы убедиться, что у пользователя есть разрешение на сохранение,
- проверка значения nonce,
- очистка и проверка данных,
- определить, что представляет собой успех, предупреждения и ошибки.
Но если я хочу рассказать обо всем вышеперечисленном, мы имеем дело с необычайно длинным постом или длинной серией постов. Я не против этого, но это также то, что сейчас не стоит затраченных усилий.
Никогда не стесняйтесь предлагать обратную связь. Но в то же время я надеюсь, что все это поможет вам заложить основу для работы над вашим следующим проектом.