Вопрос или проблема
У меня есть класс, который я хочу использовать в functions.php, но я не уверен, как лучше его настроить.
Я также хочу получить массив корзины WooCommerce. В данный момент у меня еще нет доступа к WC() в моем классе.
Какой лучший способ достичь ООП в functions.php и как лучше всего передать класс WooCommerce WC() в мой класс, чтобы я мог использовать его для других функций.
мой код в functions.php
class MyCart {
public $cart_contents;
public function __construct(){
add_action( 'get_header', [ $this, 'set_users_cart_contents' ] );
//$this->set_users_cart_contents();
}
public function set_users_cart_contents() {
$this->cart_contents = WC()->cart->get_cart_contents(); // то, что я хочу использовать
//$this->cart_contents = ['test' => '123']; // тестовый массив для проверки
}
public function get_users_cart_contents() {
return $this->cart_contents;
}
} // класс
$cartClass = new MyCart();
// добавление действия
function emdr_add_to_cart(){
// Я хочу использовать мой класс здесь
// $items = $cartClass->get_users_cart_contents();
}
add_action( 'woocommerce_add_to_cart', 'emdr_add_to_cart');
// добавление действия
function cart_page_logic(){
if(is_cart()){
// Я хочу использовать мой класс здесь
// $items = $cartClass->get_users_cart_contents();
}
}
add_action( 'get_header', 'cart_page_logic' );
Если вы определили класс MyCart
непосредственно в functions.php
вместе с вашими хуками, я ожидаю, что следующее будет работать:
// добавление действия
$cart = new MyCart();
function emdr_add_to_cart(){
$items = $cartClass->get_users_cart_contents();
// обработка элементов
}
add_action( 'woocommerce_add_to_cart', 'emdr_add_to_cart');
Я также могу добавить, что дублирование “состояния” корзины пользователя в двух местах, вероятно, является плохой практикой. Я бы предложил использовать значения напрямую из корзины WooCommerce.
Ответ или решение
Для использования классов в файле functions.php
вашего проекта WordPress, подход, который вы выбрали, в целом правильный. Однако давайте немного улучшить вашу реализацию. Также я дам совет о получении массива корзины WooCommerce без необходимости его дублирования.
Вот поправленный код и рекомендации по его использованию:
// Определяем класс MyCart
class MyCart {
public $cart_contents;
public function __construct() {
add_action('get_header', [$this, 'set_user_cart_contents']);
}
public function set_user_cart_contents() {
// Получаем содержимое корзины WooCommerce
$this->cart_contents = WC()->cart->get_cart(); // Используйте get_cart() для получения массива товаров
}
public function get_user_cart_contents() {
return $this->cart_contents;
}
}
// Создаем экземпляр класса MyCart
$cart_class_instance = new MyCart();
// Функция для добавления в корзину
function emdr_add_to_cart() {
global $cart_class_instance; // Для доступа к экземпляру класса в этой функции
$items = $cart_class_instance->get_user_cart_contents();
// Здесь можно обработать $items
}
add_action('woocommerce_add_to_cart', 'emdr_add_to_cart');
// Логика для страницы корзины
function cart_page_logic() {
global $cart_class_instance; // Используем глобальную переменную
if (is_cart()) {
$items = $cart_class_instance->get_user_cart_contents();
// Здесь можно выполнить дополнительные действия с $items
}
}
add_action('get_header', 'cart_page_logic');
Пояснения и рекомендации:
-
Глобальная переменная: Использование глобальной переменной
$cart_class_instance
позволяет вам получить доступ к методам и свойствам класса внутри функций, таких какemdr_add_to_cart
иcart_page_logic
. Это устраняет необходимость повторного создания экземпляра класса в каждой функции. -
Получение содержимого корзины: Вместо дублирования состояния корзины, вы получаете содержимое корзины непосредственно из класса WooCommerce с помощью метода
WC()->cart->get_cart()
. Это поможет избежать проблем со синхронизацией данных. -
Структурирование кода: Подумайте о создании отдельного файла класса и использовании автозагрузки (например, через
require_once
) для улучшения структуры кода и удобства его поддержки. Это особенно полезно, если ваш класс станет более сложным и будет содержать множество методов. -
Управление зависимостями: Убедитесь, что WooCommerce активирован и загружен перед выполнением операций с его классами. Вы можете использовать хуки
woocommerce_init
для вызова методов, связанных с WooCommerce.
Эти лучшие практики помогут вам создавать более чистый и поддерживаемый код с использованием объектно-ориентированного программирования в WordPress.