Шаблоны и условная логика с ООП в WordPress
Шаблоны становятся все более распространенными в WordPress, и я считаю, что это хорошо.
Но это не означает, что мы не управляем проектами, в которых используется более традиционный подход к отображению шаблонов или партиалов. Кроме того, это также не означает, что мы освобождаемся от поддержки кодовых баз, в которых используется код, не использующий механизм шаблонов.
Хотя я думаю, что шаблоны — это хорошо, я не думаю, что это всегда необходимо. Однако это содержание для другого поста.
Вместо этого я хочу пройти через процесс использования условной логики того, следует ли отображать частичное в шаблоне, и сделать это с помощью объектно-ориентированного программирования.
Шаблоны и условная логика с ООП
Для этого предположим следующее:
- У нас есть один плагин, который зависит от другого плагина для функции.
- Второй плагин является необязательным.
- Если его нет, мы покажем уведомление. Если он присутствует, то мы будем отображать партиал.
Достаточно прямолинейно, верно?
Единственное, что следует отметить, это то, что вся эта логика будет храниться в основном плагине (то есть в том, который будет проверять наличие другого плагина).
1 Условная логика шаблона
Первое, что нужно сделать, это иметь функцию, которая будет проверять наличие вторичного плагина. Причина этого в том, что шаблон выглядит примерно так:
<div class="wrap">
<!-- Snipping out irrelevant code in this file -->
<form id="yhd-upload-new-item-settings">
<?php if (!$this->hasSecondaryPlugin()) { ?>
<?php include_once 'partials/error-inactive-plugin.php'; ?>
<?php } else { ?>
<h2>Secondary Plugin Settings</h2>
<p class="description">The Secondary Plugin is installed and active.</p>
<form method="post" action="<?php echo esc_html(admin_url('admin-post.php')); ?>">
<label for="acme-secondary-plugin">
<input type="checkbox" name="acme-secondary-plugin" value="true"/>
Would you like to automatically use the secondary plugin?
</label>
<!-- Snipping out irrelevant code in this file -->
</form>
<?php } ?>
</div>
</div>
И тогда партиал может выглядеть примерно так (это зависит от вашей реализации):
<?php
/**
* This is the partial displayed when the Secondary Plugin is not active.
*/
?>
<div id="inactive-importer-message" class="error notice is-dismissible">
<p>[The message you want to display here.]</p>
<button type="button" class="notice-dismiss">
<span class="screen-reader-text">Dismiss this notice.</span>
</button>
</div><!-- #inactive-importer-message -->
Из-за того, как шаблоны включены в WordPress, функция будет жить внутри класса, и класс будет проверять наличие плагина.
Если вы используете какой-либо сниффер кода, он, скорее всего, вызовет предупреждение о том, что метод не используется, но метод используется, он просто используется в файле шаблона. Примечание в классе. Все это говорит о том, что некоторые из наших снифферов не настолько умны. Пока что.
2 Серверный код плагина
Как только вы получите общее представление о том, как это будет работать, пришло время написать код в вашем классе.
Помните, это простая функция: ей просто нужно проверить наличие плагина. Вы можете сделать это несколькими способами, но наиболее распространенным может быть использование API-функции is_active_plugin .
Обратите внимание, что при использовании этой функции предполагается, что вы знаете имя используемого плагина. Если нет, есть и другие способы, но это выходит за рамки этого поста.
В любом случае, поскольку логика является условной, она должна возвращать логическое значение, и это именно то, что делает приведенная выше функция API. Таким образом, серверная функция может выглядеть примерно так:
<?php
/**
* Determines if the Secondary Importer is is activated.
*
* @return bool True if the the pklugin is active; false, otherwise.
*/
private function hasSecondaryPlugin()
{
return in_array(
'secondary-plugin/secondary-plugin.php',
get_option('active_plugins')
);
}
А так как код шаблона вызывает эту функцию (которую вы видите выше), он определит, нужно ли показывать партиал или нет.
Достаточно легко
Для некоторых это действительно простые вещи; для других это совершенно другой подход, поскольку он имеет дело с большим разделением интересов.
И поскольку я продолжаю работать над основами ООП с участниками сайта, я думаю, что важно также поделиться некоторыми лучшими практиками с теми, кто, возможно, не является участником, но хочет писать более организованный код.