Вопрос или проблема
Включите файл виджета в functions.php дочерней темы
Я создал виджет для WP 5.9.3, основываясь на онлайн-уроке, который заработал достаточно хорошо, но он полагался на наличие всего кода в файле functions.php дочерней темы, что стало выглядеть немного неаккуратно.
Поэтому я поместил весь код в отдельный файл в базовой директории дочерней темы и попытался require
его из файла functions.php
дочерней темы.
Однако теперь, похоже, он совсем не работает и не регистрируется. После нескольких часов попыток, он по-прежнему не распознается. Я посмотрел множество других вопросов, но не могу найти ничего, что сработало бы. Сайт загружается, но виджет не виден ни на сайте, ни в административной панели.
Среди вещей, которые я пытался добавить в functions.php, кроме жесткой привязки (последний вариант) пути, есть следующие:
1) require_once('my_widget1.php');
2) define('MY_THEME_FOLDER_PATH', trailingslashit(get_template_directory(__FILE__)));
require_once (MY_THEME_FOLDER_PATH . 'my_widget1.php');
3) require_once( get_stylesheet_directory() . '/my_widget1.php');
Фактический путь к файлу виджета:
/var/www/sites/xyz/wp_main/wp-content/themes/mychildtheme/my_widget1.php
Я не очень много использовал WP, но я озадачен, почему это не работает. Думаю, я упускаю что-то очевидное, но не знаю, как продвинуться дальше. Буду признателен за любые предложения и помощь.
По просьбе в комментариях, вот код виджета (только без выходных данных). Это, по сути, пример от WPB, который я модифицировал, и, как уже упоминалось, он работает нормально, когда код действительно находится внутри functions.php. Права Linux 644.
<?php
// Создание виджета
class wpb_widget extends WP_Widget {
function __construct() {
parent::__construct(
// Основной ID вашего виджета
'wpb_widget',
// Имя виджета будет отображаться в интерфейсе
__('WPBeginner Widget', 'wpb_widget_domain'),
// Описание виджета
array( 'description' => __( 'Пример виджета', 'wpb_widget_domain' ), )
);
}
// Создание виджета на фронте
public function widget( $args, $instance ) {
$title = apply_filters( 'widget_title', $instance['title'] );
// перед и после виджета аргументы определены темами
echo $args['before_widget'];
if ( ! empty( $title ) )
echo $args['before_title'] . $title . $args['after_title'];
// Здесь вы запускаете код и отображаете выходные данные
$post_id = get_the_ID();
# ... а затем множество кода для вывода
echo $args['after_widget'];
}
// Админская часть виджета
public function form( $instance ) {
if ( isset( $instance[ 'title' ] ) ) {
$title = $instance[ 'title' ];
}
else {
$title = __( 'Новый заголовок', 'wpb_widget_domain' );
}
// Форма админки виджета
?>
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Заголовок:' ); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
</p>
<?php
}
// Обновление виджета, замена старых экземпляров новыми
public function update( $new_instance, $old_instance ) {
$instance = array();
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
return $instance;
}
// Класс wpb_widget заканчивается здесь
}
// Регистрация и загрузка виджета
function wpb_load_widget() {
register_widget( 'wpb_widget' );
}
?>
Если это имеет значение, дочерняя тема, которую я использую, основана на теме momentous-lite
.
Ладно, после нескольких дней, когда я рвал на себе волосы, я наконец понял, что мне нужно добавить следующую строку после строки require_once
в functions.php:
add_action('widgets_init', 'wpb_load_widget');
… и после этого всё заработало прекрасно. (где wpb_load_widget
— это имя моей функции регистрации виджета в самом файле виджета.)
Ответ или решение
Чтобы корректно подключить ваш виджет из отдельного файла в файле functions.php
дочерней темы, вам нужно следовать определенным шагам. Основная проблема, с которой вы столкнулись, заключалась в том, что после подключения файла виджета вы не регистрировали его должным образом с помощью соответствующего хука.
Вот пошаговое решение вашей проблемы:
1. Создание файла виджета
Убедитесь, что код вашего виджета, например, в файле my_widget1.php
, правильно оформлен. Если вы уже это сделали, перейдите к следующему шагу.
2. Подключение виджета в functions.php
Откройте файл functions.php
вашей дочерней темы и добавьте следующий код:
<?php
// Подключаем файл виджета
require_once( get_stylesheet_directory() . '/my_widget1.php' );
// Регистрируем виджет
add_action('widgets_init', 'wpb_load_widget');
function wpb_load_widget() {
register_widget('wpb_widget');
}
Что происходит в этом коде?
require_once
: Этот вызов включает файлmy_widget1.php
, который находится в корневом каталоге вашей дочерней темы. Убедитесь, что путь к файлу указан правильно.add_action('widgets_init', 'wpb_load_widget')
: Эта строка связывает вашу функциюwpb_load_widget
с хукомwidgets_init
. Это означает, что функция будет выполнена в нужный момент, когда виджеты будут инициализированы.register_widget('wpb_widget')
: Эта команда регистрирует ваш виджет, определенный в классеwpb_widget
, чтобы он стал доступен в админке и на сайте.
3. Проверка
После внесения изменений проверьте следующее:
- Убедитесь, что файл
my_widget1.php
содержит корректный код вашего виджета и не содержит синтаксических ошибок. - Зайдите в админку WordPress, перейдите в раздел "Виджеты" и посмотрите, появился ли ваш виджет в списке доступных.
- Проверьте, правильно ли отображается виджет на сайте, добавив его в одном из областей виджетов.
4. Разрешения файлов
Убедитесь также, что файл my_widget1.php
имеет корректные разрешения, что обычно будет 644 для PHP файлов на Linux-серверах.
Заключение
Помимо правильного подключения файла виджета, важно также инициировать его регистрацию через хук widgets_init
. Это даст возможность WordPress распознать и использовать ваш виджет. Если вы следовали всем шагам выше, ваш виджет должен работать без проблем.