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.
