У WordPress за замовчуванням є вбудований віджет з назвою «Мета». Функціонал цього віджета нескладний. Він відображає набір посилань, які динамічно змінюються залежно від статусу користувача в системі. Тобто, авторизований користувач чи ні. Цей віджет відображає такі посилання — керування сайтом (або реєстрація), увійти (або вийти), RSS записів, RSS коментарів, .
В одному зі своїх проєктів мені потрібно було обмежити кількість посилань у меню. При цьому залишити лише перші два — реєстрація та вхід. А решту три — RSS + WP — прибрати як зайві.
Подумав я, що ця задача — на п’ять хвилин. Помилився, вклалось у 15)… Добре. Для вирішення цієї задачі я сподівався, що WordPress надає готовий фільтр, за допомогою якого можна буде відфільтрувати або навіть додати потрібні посилання в цей Meta-віджет. Але виявилося, що ні.
Щоб вирішити це завдання, довелося знайти вихідний код цього віджета у самому WordPress, скопіювати його та перейменувати назви класу і ID віджета.
PHP-код рідного мета-віджета можна знайти за наступним шляхом — wp-includes/widgets/class-wp-widget-meta.php. Далі, ми можемо або скопіювати код віджета до файлу functions.php вашої теми, або скопіювати сам файл до вашої теми та підключити його через PHP-функцію include_once.
За замовчуванням, віджет має назву WP_Widget_Meta. Щоб уникнути конфліктів імен класів, давайте перейменуємо його на, наприклад, My_Widget_Meta.
if з перевіркою існування класу через class_exists, а функції — через function_exists.Далі, у конструкторі замінюємо:
parent::__construct( 'meta', __( 'Meta' ), $widget_ops );
На:
parent::__construct( 'my_meta', 'My Meta', $widget_ops );
Першим параметром конструктора є ID віджета — він повинен бути унікальним для кожного віджета. Інакше ви не зможете знайти ваш віджет у відповідному розділі сайту.
А увесь код методу widget() замінюємо на наступний, виключивши з нього HTML-розмітку RSS-посилань і копірайт на WordPress:
public function widget( $args, $instance ) {
$title = ! empty( $instance['title'] ) ? $instance['title'] : __( 'Meta' );
/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );
echo $args['before_widget'];
if ( $title ) {
echo $args['before_title'] . $title . $args['after_title'];
}
?>
<ul>
<?php wp_register(); ?>
<li><?php wp_loginout(); ?></li>
</ul>
<?php
echo $args['after_widget'];
}Зберігаємо файл, переходимо до розділу «Зовнішній вигляд → Віджети». Бачимо — наш віджет з’явився. Тепер його можна розмістити в потрібному сайдбарі та переглянути результат на фронтенді.
Так… як кажуть — добра думка приходить опісля. Так і зараз: а чому я просто не успадкував свій віджет від WP_Widget_Meta і не перевизначив метод widget() разом із конструктором?
