В WP есть по дефолту встроенный виджет, с названием «Мета». Функционал данного виджета не замысловат. Он отображает набор ссылок, динамически меняющихся в зависимости от статуса пользователя в системе. Т.е. авторизирован пользователь или нет. Данный виджет отображает следующие ссылки — управление сайтом (или регистрация), войти (или выйти), RSS записей, RSS комментариев,
В одной из своих работ, мне нужно было ограничить количество ссылок в меню. При этом, оставив лишь первые две — регистрация и вход. А остальные три — RSS + WP убрать за ненадобностью.
Подумал я, да тут работы минут на пять. Ошибся, на 15)… Ладно. Для решения данной задачи, я ожидал что в WordPress предоставляет готовый фильтр, используя который, можно будет фильтровать а возможно даже и добавлять нужные ссылки в данный Meta-виджет. А оказалось что нет.
Что бы решить данную задачу, в исходных кодах ВП пришлось отыскать код данного виджета, выполнить копи-паст переименовав названия класса и ID виджета.
PHP код родного мета-виджета можно найти по следующему пути — wp-includes/widgets/class-wp-widget-meta.php. Далее, мы можем или скопировать код виджета, вставив его в файл functions.php нашей темы. Или скопировать сам файл, сохранив его в нашей теме, и через PHP функцию «include_once» подключить его.
По дефолту, виджет имеет название «WP_Widget_Meta», и что бы не было конфликтов названий классов, давайте переименуем названия нашего виджета на другой. К примеру «My_Widget_Meta».
Далее, в конструкторе заменим:
parent::__construct( 'meta', __( 'Meta' ), $widget_ops );
На:
parent::__construct( 'my_meta', 'My Meta', $widget_ops );
Первым параметром в конструкторе идет ID виджета, он должен быть уникальным для каждого виджета. В противном случае, вы сможете не найти свой виджет в соответствующем разделе вашего сайта.
А весь код метода «widget()», заменим на следующий, исключив из него html разметку RSS ссылок и копирайт на движок WP:
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()» с конструктором?