Введение в передачу данных между виджетами WordPress
Часто при разработке на WordPress возникает задача, когда необходимо передавать данные между разными виджетами, чтобы обеспечить их взаимодействие. По умолчанию виджеты изолированы друг от друга, и данные между ними не передаются напрямую. Для решения этой задачи мы можем использовать систему хуков WordPress — actions и filters. В этой статье я покажу, как именно можно реализовать передачу данных между виджетами через хуки, на конкретных примерах.
Использование хуков дает гибкость и безопасность, позволяет избегать глобальных переменных и поддерживает стандарты WordPress.
Что такое хуки и как они помогают в взаимодействии виджетов
Хуки — это механизм, через который одна часть кода может «подписаться» на событие или фильтровать данные, которые генерирует другая часть. В WordPress есть два типа хуков: actions и filters.
- Actions — позволяют выполнить функцию в определённый момент времени, например, когда пользователь кликает на кнопку внутри виджета.
- Filters — позволяют модифицировать данные до того, как они будут выведены или использованы.
Для передачи данных между виджетами можно использовать оба типа, в зависимости от задачи.
Пример сценария: передача выбранного значения из одного виджета в другой
Допустим, у нас есть два виджета: один отображает список категорий, а второй — показывает последние записи, но только из выбранной категории. Чтобы второй виджет знал, какую категорию выбрал пользователь в первом, нужно передать эту информацию.
Создаем action-хук для передачи выбранной категории
Первый виджет должен «отправить» выбранную категорию через action. Вот пример кода первого виджета с кастомным action-хуком:
class WPtickets_Widget_CategorySelector extends WP_Widget {
public function widget($args, $instance) {
$selected_cat = isset($_POST['selected_cat']) ? sanitize_text_field($_POST['selected_cat']) : '';
echo '<form method="post">';
echo '<select name="selected_cat" onchange="this.form.submit()">';
$categories = get_categories();
foreach ($categories as $cat) {
$selected = ($cat->slug === $selected_cat) ? 'selected' : '';
echo "<option value='{$cat->slug}' {$selected}>{$cat->name}</option>";
}
echo '</select>';
echo '</form>';
// Генерируем action с выбранной категорией
do_action('wptickets_selected_category', $selected_cat);
}
}Здесь при выборе категории вызывается do_action('wptickets_selected_category', $selected_cat);, который передает значение выбранной категории другим частям кода.
Подписываем второй виджет на action и сохраняем значение
Второй виджет должен подписаться на этот action и сохранить полученную категорию для фильтрации постов:
class WPtickets_Widget_PostsByCategory extends WP_Widget {
private $selected_cat = '';
public function __construct() {
parent::__construct('wptickets_posts_by_cat', 'Посты по категории');
add_action('wptickets_selected_category', [$this, 'wptickets_save_selected_cat']);
}
public function wptickets_save_selected_cat($cat_slug) {
$this->selected_cat = $cat_slug;
}
public function widget($args, $instance) {
// Используем $this->selected_cat для вывода постов
$query_args = [
'category_name' => $this->selected_cat,
'posts_per_page' => 5,
];
$query = new WP_Query($query_args);
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
wp_reset_postdata();
}
}Таким образом, второй виджет реагирует на выбранную категорию и выводит соответствующие посты.
Использование фильтров для изменения вывода виджетов
Иногда нужно не просто передать данные, а изменить их перед выводом. Для этого используются фильтры. Например, если второй виджет позволяет модифицировать заголовок в зависимости от выбранной категории, можно сделать так:
add_filter('wptickets_posts_widget_title', function($title, $cat_slug) {
if ($cat_slug) {
return 'Посты в категории: ' . ucfirst($cat_slug);
}
return $title;
}, 10, 2);В самом виджете второй виджет применит фильтр:
$title = apply_filters('wptickets_posts_widget_title', 'Последние посты', $this->selected_cat);Советы и лучшие практики при работе с хуками в виджетах WordPress
1. Всегда фильтруйте и санитизируйте входящие данные, особенно если они приходят из формы или URL.
2. Используйте префиксы (например, wptickets_) для своих хуков, чтобы избежать конфликтов с другими плагинами.
3. Не храните состояния виджетов в глобальных переменных, лучше использовать классовые свойства или transient API, если нужно хранить данные между запросами.
4. Помните, что хуки работают во время загрузки страницы, поэтому передача данных через них осуществляется только в пределах одного запроса. Для передачи между запросами используйте сессии, cookies или AJAX.
Заключение: как хуки помогают создавать сложные взаимодействия между виджетами
Использование хуков — мощный способ сделать ваши виджеты на WordPress интерактивными и связанными между собой. В примере с выбором категории и выводом постов мы увидели, как action-хуки позволяют передавать события, а фильтры — модифицировать вывод. Такой подход гибок и соответствует стандартам WordPress, обеспечивая расширяемость и удобство поддержки.
Освоив хуки, вы сможете создавать сложные кастомные решения, не прибегая к хакам глобальных переменных или сложным JavaScript-решениям, что повысит качество и надежность вашего кода.