Intereting Posts
Добавить класс «has-children» в тег body? Как я могу получить первые 50% всех сообщений (в пользовательском типе сообщений)? Комментарии не отображаются в пользовательском типе сообщений – WordPress Сообщения с пользовательскими полями не отображаются Получить список сайтов, которые используют определенный плагин или тему В чем разница между term_id и term_taxonomy_id Получить список категорий и список таксономии из разных типов сообщений, используя идентификатор сообщения? Удалить комментарии Metabox, но все же разрешить комментарии Добавить код в <head> для каждой страницы / публикации Изменение макета содержимого на основе иерархии меню Почему сброс пароля пользователя WordPress не работает? Настройка шаблона основного текста WordPress Как использовать другой размер изображения для персонализированного типа сообщения? подсчет сообщения из wp-запроса с использованием sticky_post Как добавить фильтр в определенный почтовый формат?

Переменные класса не указаны на странице.

Я пытаюсь сделать некоторые из переменных из моего плагина доступными для экземпляра класса на моей странице. Но это не показывает правильные значения.

Вот соответствующая часть плагина:

class opi{ // version public $opi_version = "1.0"; public $mg = 0; //constructor public function opi(){ $this->__construct(); } public function __construct(){ add_action('init', array(&$this, 'o_check')); // ... } function o_check(){ if (is_user_logged_in()){ $this->mg = 4; } } } $opi = new opi; 

Если я поставлю echo $this->mg; как раз перед закрывающей скобкой в ​​функции o_check() , тогда она показывает 4 . Хорошо.

Теперь, если я поместил следующее в page.php, и я вошел в WordPress, я получаю результат 0 .

 <?php $pageopi = new opi; ?> <?php echo $pageopi->mg; ?> 

Любые идеи, в которых я ошибаюсь, пожалуйста?

Solutions Collecting From Web of "Переменные класса не указаны на странице."

Когда вы пишете этот код

 <?php $pageopi = new opi; ?> // 1. object created // 2. __construct is called // 3. init action hook is set but is never executed so is o_check method <?php echo $pageopi->mg; ?> 

На этом этапе init hook выполнялся долгое время до того, как $pageopi создается фактически, когда страница загружена. init action hook выполняется даже до page.php запуска page.php .

Решение:

  1. Вы должны использовать global $opi; object page.php вместо создания нового.

  2. Или создайте новый глобальный объект перед plugins_loaded action (в plugins_loaded hook) и используйте его на page.php

Ну, вы не выполняете o_check в своем page.php , поэтому значение переменной mg остается равным нулю.

Да, в вашем конструкторе вы добавляете крюк действия, но он будет только нажимать на обновление следующей страницы. Подумайте также об использовании do_action , хотя я не уверен, что если он будет выполняться, то сразу другой будет работать.

Если вы добавите эту часть:

 <?php $pageopi = new opi; ?> <?php echo $pageopi->mg; ?> 

в шаблоне темы он будет инициализировать объект после init крючка init и поэтому метод o_check никогда не будет запущен. Это проблема. Вот почему он работает, если вы инициализируетесь под объектом, но не при инициализации в шаблоне страницы. Вам нужно сменить крючки или инициализировать ранее, или явно вызвать o_check .

Инициализация вашего объекта как global будет работать.

 class opi{ // ... } global $opi; $opi = new opi; 

Затем в шаблоне вы можете использовать:

 global $opi; echo $opi->mg; 

Хотя способ использования этого статического класса может также или лучше. Сложно сказать. Я не могу сказать, какова конечная цель класса.