PHP / Magento Dev Blog

  • Publikacje
  • O autorze
  • Kontakt

WooCommerce vs Magento 2 – architektura, hooks vs DI, kiedy który

by Henryk Tews / wtorek, 10 października 2023 / Opublikowano w PHP

Pytanie „WooCommerce czy Magento 2” wraca regularnie przy każdym nowym projekcie e-commerce. Zwykle odpowiedź jest prosta gdy znasz skalę i budżet. Ale jako developer Magento warto rozumieć WooCommerce od środka – bo klienci pytają, bo czasem projekt tego wymaga, i bo porównanie architektur uczy więcej niż tysiąc tutoriali o jednym frameworku.

Fundamentalna różnica architektoniczna

WooCommerce to wtyczka do WordPressa – dziedziczy jego architekturę: hooks (actions i filters), szablony PHP, global functions i WordPress database API. Magento 2 to autonomiczny framework e-commerce z DI, service contracts, EAV i własnym ORM.

To nie jest kwestia „lepszy/gorszy” – to różne narzędzia do różnych zastosowań i różnej skali:

Aspekt WooCommerce Magento 2
Próg wejścia Niski (WordPress developer) Wysoki (dedykowana specjalizacja)
Typowy sklep do ~50k produktów, do ~1000 zamówień/dzień od 10k produktów, powyżej 1000 zamówień/dzień
Customizacja Hooks i filtry, proste i szybkie DI, pluginy, preference – potężne, ale złożone
Wielomagazynowość Przez wtyczki (WPML + WooCommerce Multilingual) Natywna (MSI, Store Views)
B2B funkcje Ograniczone (wtyczki) Natywne (katalogi cen, quotes, requisition lists)
Hosting Typowy hosting PHP/MySQL Elasticsearch, Redis, opcjonalnie Varnish
Koszt wdrożenia Niski do średniego Wysoki

WooCommerce od środka – dla Magento developera

WooCommerce rozszerza WordPress hooks – zamiast eventów z di.xml, masz add_action() i add_filter():

<?php

// WooCommerce hooks - odpowiednik Magento Observer
// Dodaj produkt do zamówienia po złożeniu
add_action('woocommerce_checkout_order_processed', function(int $orderId, array $postedData, \WC_Order $order) {
    // $order to obiekt zamówienia - jak \Magento\Sales\Model\Order
    $items = $order->get_items();

    foreach ($items as $item) {
        $product = $item->get_product();
        error_log("Zamówiono: " . $product->get_sku() . " x" . $item->get_quantity());
    }
}, 10, 3); // 10 = priorytet, 3 = liczba argumentów

// Filter - jak plugin "after" w Magento
// Modyfikuj cenę produktu
add_filter('woocommerce_product_get_price', function(string $price, \WC_Product $product): string {
    // Odpowiednik afterGetPrice plugin w Magento
    if ($product->get_sku() === 'SPECIAL-SKU') {
        return (string)(floatval($price) * 0.9); // 10% rabatu
    }
    return $price;
}, 10, 2);
<?php

// WooCommerce produkt - odpowiednik Magento Product Model
$product = wc_get_product(42); // jak $productRepository->getById(42)

echo $product->get_id();
echo $product->get_sku();
echo $product->get_name();
echo $product->get_price();
echo $product->get_stock_quantity();
echo $product->is_in_stock() ? 'dostępny' : 'niedostępny';

// Meta dane - jak custom attributes w Magento
$customValue = $product->get_meta('custom_field_key');
$product->update_meta_data('custom_field_key', 'nowa wartość');
$product->save();

// Zamówienie
$order = wc_get_order(1042);
echo $order->get_status();      // jak $order->getStatus()
echo $order->get_total();       // jak $order->getGrandTotal()
echo $order->get_billing_email();

// Aktualizacja statusu - jak $order->setState() + save
$order->update_status('processing', 'Zamówienie przyjęte do realizacji');

Własna wtyczka WooCommerce – struktura

<?php

/**
 * Plugin Name: My WooCommerce Extension
 * Description: Przykładowa wtyczka WooCommerce
 * Version: 1.0.0
 * Requires Plugins: woocommerce
 */

declare(strict_types=1);

// Sprawdź czy WooCommerce jest aktywny
if (!class_exists('WooCommerce')) {
    return;
}

// Klasa główna wtyczki
class My_WooCommerce_Extension
{
    private static ?self $instance = null;

    public static function getInstance(): static
    {
        if (self::$instance === null) {
            self::$instance = new static();
        }
        return self::$instance;
    }

    private function __construct()
    {
        add_action('plugins_loaded', [$this, 'init']);
    }

    public function init(): void
    {
        // Rejestracja hooków
        add_action('woocommerce_product_options_general_product_data', [$this, 'addCustomField']);
        add_action('woocommerce_process_product_meta', [$this, 'saveCustomField']);
        add_filter('woocommerce_available_payment_gateways', [$this, 'filterPaymentGateways']);
    }

    // Dodaj własne pole w edytorze produktu
    public function addCustomField(): void
    {
        woocommerce_wp_text_input([
            'id'          => '_supplier_code',
            'label'       => 'Kod dostawcy',
            'placeholder' => 'np. SUPP-001',
            'desc_tip'    => true,
            'description' => 'Wewnętrzny kod produktu u dostawcy',
        ]);
    }

    // Zapisz własne pole
    public function saveCustomField(int $postId): void
    {
        $supplierCode = sanitize_text_field($_POST['_supplier_code'] ?? '');
        update_post_meta($postId, '_supplier_code', $supplierCode);
    }

    // Filtruj metody płatności
    public function filterPaymentGateways(array $gateways): array
    {
        if (WC()->cart->get_cart_contents_total() > 1000) {
            // Dla zamówień > 1000 PLN usuń płatność przy odbiorze
            unset($gateways['cod']);
        }
        return $gateways;
    }
}

// Bootstrap
My_WooCommerce_Extension::getInstance();

Własna metoda wysyłki w WooCommerce

<?php

// Rejestracja metody wysyłki - jak MethodInterface w Magento
add_filter('woocommerce_shipping_methods', function(array $methods): array {
    $methods['my_flat_rate'] = My_Flat_Rate_Shipping::class;
    return $methods;
});

class My_Flat_Rate_Shipping extends \WC_Shipping_Method
{
    public function __construct(int $instance_id = 0)
    {
        $this->id                 = 'my_flat_rate';
        $this->instance_id        = absint($instance_id);
        $this->method_title       = 'Moja metoda wysyłki';
        $this->method_description = 'Stała stawka z konfiguracją';
        $this->supports           = ['shipping-zones', 'instance-settings'];

        $this->init();
    }

    public function init(): void
    {
        $this->init_form_fields();
        $this->init_settings();

        $this->title = $this->get_option('title', 'Dostawa standardowa');
        $this->cost  = $this->get_option('cost', '9.99');

        add_action('woocommerce_update_options_shipping_' . $this->id, [$this, 'process_admin_options']);
    }

    public function init_form_fields(): void
    {
        $this->instance_form_fields = [
            'title' => [
                'title'   => 'Tytuł',
                'type'    => 'text',
                'default' => 'Dostawa standardowa',
            ],
            'cost'  => [
                'title'       => 'Koszt (PLN)',
                'type'        => 'price',
                'default'     => '9.99',
                'description' => 'Cena wysyłki bez VAT',
            ],
        ];
    }

    public function calculate_shipping(array $package = []): void
    {
        $this->add_rate([
            'id'      => $this->get_rate_id(),
            'label'   => $this->title,
            'cost'    => $this->cost,
            'taxes'   => '',
            'package' => $package,
        ]);
    }
}

Kiedy wybrać WooCommerce?

  • Klient ma już stronę WordPress i chce dodać sklep
  • Mały katalog produktów (do kilku tysięcy) i umiarkowany ruch
  • Budżet nie pozwala na wdrożenie Magento (niższy próg wejścia = tańszy developer)
  • Treści marketingowe (blog, landing pages) są równie ważne co sklep
  • Szybkie MVP z możliwością późniejszej migracji

Kiedy wybrać Magento 2?

  • Duży katalog produktów z wieloma wariantami i atrybutami
  • Wiele sklepów, języków, walut w jednej instancji
  • B2B z cenami indywidualnymi, ofertami i zarządzaniem kontem firmowym
  • Złożona logistyka (MSI, wiele magazynów, click-and-collect)
  • Integracje z ERP, PIM, WMS które wymagają solidnego API

Podsumowanie

WooCommerce to doskonałe narzędzie w swojej niszy – prosty sklep na platformie którą klient już zna i której treści aktywnie zarządza. Magento 2 to inwestycja uzasadniona przy skali i złożoności której WooCommerce nie udźwignie bez piętra wtyczek i obejść. Jako developer Magento warto znać WooCommerce na tyle żeby móc ocenić czy projekt nie jest po prostu przekombinowany dla platformy którą proponujesz.

About Henryk Tews

Co możesz przeczytać następne

PimCore – CMS + PIM + DAM, klasy obiektów, Data Hub GraphQL, integracja z Magento
PHP 8.1 preview – enumy, readonly properties, intersection types, fibers
Podsumowanie 2025 – pipe operator, Hyvä mainstream, AI tooling obowiązkowy, 120 wpisów
  • Publikacje
  • O autorze
  • Kontakt

© 2026 Created by

GÓRA
Zarządzaj zgodą
Aby zapewnić jak najlepsze wrażenia, korzystamy z technologii, takich jak pliki cookie, do przechowywania i/lub uzyskiwania dostępu do informacji o urządzeniu. Zgoda na te technologie pozwoli nam przetwarzać dane, takie jak zachowanie podczas przeglądania lub unikalne identyfikatory na tej stronie. Brak wyrażenia zgody lub wycofanie zgody może niekorzystnie wpłynąć na niektóre cechy i funkcje.
Funkcjonalne Zawsze aktywne
Przechowywanie lub dostęp do danych technicznych jest ściśle konieczny do uzasadnionego celu umożliwienia korzystania z konkretnej usługi wyraźnie żądanej przez subskrybenta lub użytkownika, lub wyłącznie w celu przeprowadzenia transmisji komunikatu przez sieć łączności elektronicznej.
Preferencje
Przechowywanie lub dostęp techniczny jest niezbędny do uzasadnionego celu przechowywania preferencji, o które nie prosi subskrybent lub użytkownik.
Statystyka
Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do celów statystycznych. Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do anonimowych celów statystycznych. Bez wezwania do sądu, dobrowolnego podporządkowania się dostawcy usług internetowych lub dodatkowych zapisów od strony trzeciej, informacje przechowywane lub pobierane wyłącznie w tym celu zwykle nie mogą być wykorzystywane do identyfikacji użytkownika.
Marketing
Przechowywanie lub dostęp techniczny jest wymagany do tworzenia profili użytkowników w celu wysyłania reklam lub śledzenia użytkownika na stronie internetowej lub na kilku stronach internetowych w podobnych celach marketingowych.
  • Zarządzaj opcjami
  • Zarządzaj serwisami
  • Zarządzaj {vendor_count} dostawcami
  • Przeczytaj więcej o tych celach
Zobacz preferencje
  • {title}
  • {title}
  • {title}