Правильно ли я использую этот класс в теме WordPress?
Я использую класс для получения значений из пользовательских таблиц, которые мне нужно использовать в разных файлах моей темы WordPress, и не уверен, какой подход будет лучшим для этого.
Вот класс, который у меня есть сейчас (не ругайте, я немного новичок :D)
class Plans {
public $free_plans;
public $purchased_plans;
private $free_count;
private $purchased_count;
public function __construct(){
global $current_user;
$this->user_id= $current_user->ID;
$this->free_plans();
$this->purchased_plans();
}
public function free_plans($debug=false){
global $wpdb;
$free_plans = запрос к базе данных здесь;
$this->free_count= count($free_plans);
if($debug) $this->debug_wpdb();
$this->free_plans= $free_plans;
}
public function purchased_plans($debug=false){
global $wpdb;
$plans_purchased= запрос к базе данных здесь;
$this->purchased_count=count($plans_purchased);
if($debug) $this->debug_wpdb();
$this->purchased_plans= $plans_purchased;
}
private function debug_wpdb(){
global $wpdb;
$wpdb->show_errors();
$wpdb->print_error();
}
public function get_pplans_count(){
return $this->purchased_count;
}
public function get_fplans_count(){
return $this->free_count;
}
public function get_purchased_plans(){
return $this->purchased_plans;
}
public function get_free_plans(){
return $this->free_plans;
}
}
Мне нужно использовать эти функции по всей моей теме (header.php, page-custom.php и т.д.), и я хочу использовать только один экземпляр класса, так как не хочу делать запросы к базе данных каждый раз, когда мне нужно получить значение - достаточно двух запросов, которые выполняются при создании класса.
Где мне следует вызывать этот класс? Я думал, что если создать класс в functions.php...
$p= new Plans();
...то я смогу обращаться к $p отовсюду, но, похоже, я ошибаюсь. Какой подход будет лучшим?
В моем случае, например, мне нужно в header.php:
$p->get_fplans_count();
В page-plans.php:
$p->get_purchased_plans();
И так далее...
РЕДАКТИРОВАТЬ: Мне не нужна помощь по PHP, я просто хочу знать, как правильно использовать PHP класс в WordPress. Похоже, мне немного сложно объяснить это (английский - не мой родной язык). Огромное спасибо за всю вашу помощь.

Самый простой способ получить доступ к вашей переменной в других файлах — это сделать именно то, что предложил Chip, сделать переменную глобальной.
То же самое делает WordPress, чтобы сделать глобальные переменные, такие как $wpdb
, доступными в других файлах. Я уже вижу, что вы делаете вызовы к глобальной переменной $wpdb
в своем классе. Вам нужно сделать то же самое.
При создании экземпляра в functions.php
:
global $p;
$p = new Plans();
При обращении к глобальному экземпляру в header.php
, footer.php
и т. д.:
global $p;
$p->get_purchased_plans();
Имея это в виду, я хочу прояснить два момента:
Это не вопрос о WordPress
Да, вы используете WordPress. И да, вы пытаетесь разобраться, как использовать класс в WordPress. Но этот вопрос никак не специфичен для WordPress. Если бы вы создавали сайт только на PHP (т. е. один файл index.php
, который включает header.php
и footer.php
и делает динамические ссылки), вы бы столкнулись с той же проблемой.
Ваш вопрос касается области видимости переменных, а не WordPress. Chip был на 100% прав, указывая на это ранее. Я объясняю это здесь, а не в вопросе, чтобы вы поняли, почему.
Когда вы вызываете $p = new Plans()
в вашем файле functions.php
, вы создаете экземпляр объекта Plans
и сохраняете его в локальной переменной с именем $p
. Если эта переменная определена внутри функции (как и должно быть), то она локальна для этой функции. Если она определена внутри класса, она локальна для этого класса.
Иногда можно случайно определить переменную в глобальной области видимости... Это ошибка, которую часто допускают разработчики, новые в PHP или только начинающие объектно-ориентированное программирование. Это не плохо само по себе, но плохая привычка.
Если вам нужен доступ к вашей переменной за пределами локальной области видимости, всегда всегда всегда используйте ключевое слово global
, чтобы сделать её доступной. Однако убедитесь, что вы также называете свою глобальную переменную так, чтобы минимизировать вероятность конфликта имен.
$p
не очень уникально. Вполне возможно, что плагин (или сам WordPress) может переопределить $p
как что-то другое, кроме экземпляра Plans()
, в дальнейшем. Это сломает вашу тему... Этого следует избегать любой ценой!
Что-то вроде $chifiliii_plans_p
было бы лучшим выбором, потому что маловероятно, что какая-либо другая система выберет такое же имя.
Вы делаете это неправильно
1 - Пользовательские таблицы — это ПЛОХО
Использовать пользовательские таблицы в WordPress — плохая практика. Очень мало случаев, когда пользовательские таблицы оправданы в системе, и за 6 лет работы с платформой я встречал всего 1 или 2 причины для их использования.
Если ваша тема предназначена для распространения, помните, что некоторые люди не смогут её использовать. Несколько консультантов по безопасности рекомендуют ограничивать функциональность пользователя, через которого WordPress получает доступ к базе данных — во многих общих системах он вообще не может создавать таблицы.
В мультисайтовых системах вы добавляете новые таблицы не для одного сайта, а для каждого сайта, который активирует вашу тему. Это резко увеличивает размер базы данных, что может быть проблемой для некоторых пользователей (хотя и не для всех).
Если вы выполняете пользовательские запросы напрямую к базе данных, вы берете на себя множество проблем безопасности. Сам WordPress довольно безопасен... если только вы не делаете что-то неправильно, очень сложно открыть себя для злоумышленников, пытающихся выполнить SQL-инъекции и другие атаки на вашу систему. Если вы выполняете запросы самостоятельно (вне API WP_Query
), вам нужно самостоятельно санировать эти запросы, чтобы предотвратить вредоносные команды.
В WordPress уже есть отличный API Options.
WordPress также поддерживает Пользовательские типы записей для хранения пользовательских данных.
Не изобретайте велосипед... используйте инструменты, которые уже есть в вашем распоряжении.
2 - Не включайте функциональность в темы
Если у вас так много продвинутой функциональности встроено в тему, вы готовите себя к провалу. Что произойдет, если пользователь деактивирует вашу тему? Просто... внезапно все их пользовательские данные исчезнут.
На этом сайте много раз говорилось: темы предназначены для предоставления стилей для WordPress. Плагины предназначены для предоставления функциональности. Если вы собираетесь хранить пользовательские данные, делайте это через плагин. Используйте тему для стилизации представления этих пользовательских данных.

Спасибо за объяснение. Проблема была в конфликте имен, как я указал в своем вопросе. Я обычно не использую пользовательские таблицы, но для этого проекта не смог найти лучшего решения. Тема используется только для одного сайта, построенного на WordPress + BuddyPress. Вы правы насчет плагина, думаю, в следующий раз изменю подход. Спасибо, что нашли время ответить.
