Почему используют add_action для шорткодов?
Я хочу создать шорткоды
, но в некоторых руководствах предлагают использовать add_action
:
add_action( 'init', 'register_shortcodes');
Но я читал другой туториал, где автор не использовал это, а просто добавлял код в functions.php
:
add_shortcode( 'recent-posts', 'recent_posts_function' );
Какой метод лучше и зачем использовать add_action
?
Если вы посмотрите на страницу Кодекса о функции add_shortcode()
, вы не увидите ничего о необходимости использования add_action()
перед тем, как можно будет использовать add_shortcode()
.
Таким образом, вы можете просто поместить ваш add_shortcode()
прямо в файл functions.php
. Я тоже так делаю.
Ознакомьтесь со статьёй — Шорткоды WordPress: Полное руководство об использовании шорткодов и лучших практиках.

Иногда необходимо использовать действие 'init'. Например, прямо сейчас я редактирую тему, которая сильно зависит от виджетов и панели настройки. Я попытался добавить пользовательский шорткод без действий и получал ошибки при сохранении контента в панели Customize. Действие гарантирует правильный порядок выполнения функций. Оно как бы говорит: "Эй, шорткоды! Сначала я загружу самые важные функции, а потом уже вы!"

Не повторяя того, что уже было рассмотрено в ответах выше; это просто подход, основанный на лучших практиках. Я часто использую это в разработке плагинов, где мне нужно использовать отдельные классы, как в wppb.me стартовом шаблоне плагина.
Логично регистрировать все хуки админки в загрузчике. В случае с шорткодом, вы можете добавить хук add_action для шорткода в метод загрузки хуков:
/**
* Регистрация всех хуков, связанных с функциональностью админки плагина
*/
private function define_admin_hooks() {
$plugin_admin = new instance( $this->get_plugin_name(), $this->get_version() );
$this->loader->add_action( 'init', $plugin_admin, 'register_shortcodes');
}
Основное преимущество этого подхода - простота поддержки кода благодаря его модульности. Вы можете добавить несколько других хуков в тот же метод, что упрощает отслеживание и внесение изменений, особенно для крупного плагина.
Это означает, что в классе, где вы хотите использовать add_shortcode
, вам не нужно запускать хук действия в конструкторе, теперь вы можете использовать его в пользовательском методе:
public function register_shortcodes(){
add_shortcode('recent-posts', array($this, 'recent_posts_function'));
}
