Включите файл виджета в functions.php дочерней темы

Вопрос или проблема

Включите файл виджета в 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 распознать и использовать ваш виджет. Если вы следовали всем шагам выше, ваш виджет должен работать без проблем.

Оцените материал
Добавить комментарий

Капча загружается...