Использование класса PHP в функциях WordPress

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

У меня есть класс, который я хочу использовать в 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');

Пояснения и рекомендации:

  1. Глобальная переменная: Использование глобальной переменной $cart_class_instance позволяет вам получить доступ к методам и свойствам класса внутри функций, таких как emdr_add_to_cart и cart_page_logic. Это устраняет необходимость повторного создания экземпляра класса в каждой функции.

  2. Получение содержимого корзины: Вместо дублирования состояния корзины, вы получаете содержимое корзины непосредственно из класса WooCommerce с помощью метода WC()->cart->get_cart(). Это поможет избежать проблем со синхронизацией данных.

  3. Структурирование кода: Подумайте о создании отдельного файла класса и использовании автозагрузки (например, через require_once) для улучшения структуры кода и удобства его поддержки. Это особенно полезно, если ваш класс станет более сложным и будет содержать множество методов.

  4. Управление зависимостями: Убедитесь, что WooCommerce активирован и загружен перед выполнением операций с его классами. Вы можете использовать хуки woocommerce_init для вызова методов, связанных с WooCommerce.

Эти лучшие практики помогут вам создавать более чистый и поддерживаемый код с использованием объектно-ориентированного программирования в WordPress.

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

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