~/icsd.ir — bash
SYSTEM_ONLINE

📦 فصل ۱: مقدمه و نصب پیشرفته ووکامرس

ووکامرس (WooCommerce) یک افزونه متن‌باز و رایگان برای وردپرس است که آن را به یک پلتفرم فروشگاه‌سازی قدرتمند تبدیل می‌کند. در این فصل نه فقط نصب ساده، بلکه معماری داخلی، نصب با WP-CLI، پیکربندی محیط توسعه و آماده‌سازی محیط حرفه‌ای را می‌آموزیم.

ووکامرس (WooCommerce) یک افزونه متن‌باز و رایگان برای وردپرس است که آن را به یک پلتفرم فروشگاه‌سازی قدرتمند تبدیل می‌کند. در این فصل نه فقط نصب ساده، بلکه معماری داخلی، نصب با WP-CLI، پیکربندی محیط توسعه و آماده‌سازی محیط حرفه‌ای را می‌آموزیم.

۱. ووکامرس چیست و چرا انتخاب اول ایران است؟

ووکامرس در سال ۲۰۱۱ توسط WooThemes توسعه یافت و در ۲۰۱۵ توسط Automattic (شرکت سازنده وردپرس) خریداری شد. امروز بیش از ۸ میلیون فروشگاه در سراسر دنیا و اکثر فروشگاه‌های متوسط ایرانی از آن استفاده می‌کنند.

💡 آمار جالب: طبق آمار W3Techs، ووکامرس بیش از ۲۸٪ از کل فروشگاه‌های اینترنتی دنیا را تأمین می‌کند – بیش از Shopify, Magento و BigCommerce روی هم!

چرا ووکامرس برای بازار ایران مناسب است؟

ویژگی ووکامرس Shopify Magento
هزینه پایه رایگان ✓ ماهانه $39+ رایگان (Open Source)
درگاه پرداخت ایرانی کامل ✓ ندارد ✗ محدود
پشتیبانی فارسی RTL کامل ✓ ضعیف متوسط
منابع آموزشی فارسی فراوان ✓ محدود کم
قابلیت سفارشی‌سازی نامحدود ✓ محدود به App پیچیده
هاستینگ ایرانی سازگار ✓ غیرممکن سنگین

۲. معماری داخلی WooCommerce

درک معماری ووکامرس برای توسعه‌دهنده حیاتی است. ووکامرس بر پایه چند مفهوم کلیدی ساخته شده:

🏗️ ساختار CRUD

از نسخه ۳.۰ به بعد، ووکامرس از الگوی CRUD (Create, Read, Update, Delete) استفاده می‌کند که داده‌ها را از کلاس‌های Object جدا می‌کند:

معماری CRUD ووکامرس
// ❌ روش قدیمی (deprecated)
$product = new WC_Product( $product_id );
$price = get_post_meta( $product_id, '_price', true );

// ✅ روش جدید (CRUD)
$product = wc_get_product( $product_id );
$price = $product->get_price();
$product->set_price( 150000 );
$product->save();

🗂️ کلاس‌های اصلی WooCommerce

کلاس کاربرد مثال
WC_Product محصول ساده wc_get_product($id)
WC_Product_Variable محصول متغیر محصول با اندازه/رنگ
WC_Order سفارش wc_get_order($id)
WC_Cart سبد خرید WC()->cart
WC_Customer مشتری new WC_Customer($id)
WC_Payment_Gateway درگاه پرداخت کلاس پایه برای زرین‌پال
WC_Shipping_Method روش ارسال کلاس پایه برای پست پیشتاز
WC_Tax مالیات محاسبه مالیات بر ارزش افزوده

📊 جداول دیتابیس ووکامرس

جداول کلیدی
-- جداول قدیمی (تا قبل از HPOS)
wp_posts                  -- محصولات و سفارش‌ها (post_type)
wp_postmeta               -- متادیتای محصول و سفارش
wp_terms                  -- دسته‌بندی محصولات
wp_term_relationships     -- ارتباط محصول با دسته

-- جداول اختصاصی WooCommerce
wp_woocommerce_sessions          -- نشست کاربران مهمان
wp_woocommerce_order_items       -- آیتم‌های سفارش
wp_woocommerce_order_itemmeta    -- متادیتای آیتم سفارش
wp_woocommerce_tax_rates         -- نرخ‌های مالیات
wp_woocommerce_shipping_zones    -- مناطق ارسال
wp_wc_product_meta_lookup        -- جستجوی سریع محصول (WC 3.6+)
wp_wc_order_stats                -- آمار سفارش‌ها (WC 4.0+)

-- جداول HPOS (WC 8.2+)
wp_wc_orders                     -- سفارش‌ها (به جای wp_posts)
wp_wc_order_addresses            -- آدرس‌های سفارش
wp_wc_order_operational_data     -- داده‌های عملیاتی سفارش
wp_wc_orders_meta                -- متادیتای سفارش

۳. روش‌های نصب پیشرفته

روش ۱: نصب از پیشخوان وردپرس (مبتدی)

  1. افزونه‌هاافزودن جدید
  2. جستجو: WooCommerce
  3. کلیک روی Install Now سپس Activate
  4. اجرای Setup Wizard

روش ۲: نصب با WP-CLI (حرفه‌ای) ⭐

WP-CLI ابزار خط فرمان وردپرس است که برای توسعه‌دهنده‌های جدی ضروری است:

terminal / cmd
# نصب WP-CLI روی Windows (داخل XAMPP)
# دانلود فایل phar:
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

# تست
php wp-cli.phar --info

# روی Linux/Mac:
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp

# نصب ووکامرس
cd /path/to/wordpress
wp plugin install woocommerce --activate

# نصب همزمان وردپرس + ووکامرس
wp core download --locale=fa_IR
wp config create --dbname=mystore --dbuser=root --dbpass=
wp core install --url=mystore.local --title="فروشگاه من" 
    --admin_user=admin --admin_password=secret --admin_email=me@example.com
wp plugin install woocommerce --activate
wp wc tool run install_pages --user=admin
wp wc payment_gateway list --user=admin
💡 نکته حرفه‌ای: با WP-CLI می‌توانید کل فروشگاه را در ۳۰ ثانیه از صفر راه‌اندازی کنید. این برای CI/CD و تست‌های خودکار طلاست.

روش ۳: نصب با Composer (پیشرفته‌ترین)

composer.json
{
    "name": "icsd/woocommerce-store",
    "type": "project",
    "repositories": [
        {
            "type": "composer",
            "url": "https://wpackagist.org",
            "only": ["wpackagist-plugin/*", "wpackagist-theme/*"]
        }
    ],
    "require": {
        "php": ">=8.1",
        "johnpbloch/wordpress": "^6.4",
        "wpackagist-plugin/woocommerce": "^9.0",
        "wpackagist-plugin/woocommerce-zarinpal-gateway": "*"
    },
    "extra": {
        "wordpress-install-dir": "wp"
    }
}

۴. HPOS – High Performance Order Storage

یکی از مهم‌ترین تغییرات WooCommerce در سال‌های اخیر، HPOS است. به جای ذخیره سفارش‌ها در جدول wp_posts (که برای پست بلاگ طراحی شده)، حالا جداول اختصاصی برای سفارش داریم.

چرا HPOS؟

معیار روش قدیمی (CPT) HPOS
سرعت کوئری سفارش کند (JOIN چندگانه) ۳-۵ برابر سریع‌تر ⚡
اسکیمای دیتابیس postmeta (key-value) ستون‌های مشخص
Index کارآمد محدود کامل
قابلیت مقیاس تا ۵۰هزار سفارش میلیون‌ها سفارش

فعال‌سازی HPOS

  1. به WooCommerce → Settings → Advanced → Features بروید
  2. در بخش Order data storage، گزینه High-performance order storage را انتخاب کنید
  3. کلیک روی Save changes
⚠️ هشدار مهم: اگر افزونه‌های قدیمی استفاده می‌کنید، ممکن است با HPOS سازگار نباشند. ابتدا روی محیط Staging تست کنید.

تشخیص سازگاری افزونه با HPOS در کد

my-plugin.php
use AutomatticWooCommerceUtilitiesOrderUtil;

// تشخیص اینکه HPOS فعال است یا نه
if ( OrderUtil::custom_orders_table_usage_is_enabled() ) {
    // HPOS فعال است - از API جدید استفاده کن
    $order = wc_get_order( $order_id );
    $order->update_meta_data( '_my_field', 'value' );
    $order->save();
} else {
    // روش قدیمی
    update_post_meta( $order_id, '_my_field', 'value' );
}

// ✅ روش بهتر: همیشه از CRUD استفاده کن (در هر دو حالت کار می‌کند)
$order = wc_get_order( $order_id );
$order->update_meta_data( '_my_field', 'value' );
$order->save();

// اعلام سازگاری افزونه با HPOS
add_action( 'before_woocommerce_init', function() {
    if ( class_exists( 'AutomatticWooCommerceUtilitiesFeaturesUtil' ) ) {
        AutomatticWooCommerceUtilitiesFeaturesUtil::declare_compatibility(
            'custom_order_tables',
            __FILE__,
            true
        );
    }
} );

۵. آماده‌سازی محیط توسعه حرفه‌ای

ابزارهای ضروری

  • Local by Flywheel یا XAMPP یا Laragon – محیط محلی
  • VS Code + PHP Intelephense + WordPress Hooks IntelliSense – ادیتور
  • WP-CLI – خط فرمان
  • Query Monitor – دیباگ کوئری و عملکرد
  • WooCommerce Admin Test Helper – تست
  • Postman / Insomnia – تست REST API
  • Git + GitHub/GitLab – مدیریت کد

پیکربندی wp-config.php برای توسعه

wp-config.php
// فعال‌سازی debug
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );        // لاگ به wp-content/debug.log
define( 'WP_DEBUG_DISPLAY', false );    // عدم نمایش خطا روی صفحه
define( 'SCRIPT_DEBUG', true );         // CSS/JS غیر minified
define( 'SAVEQUERIES', true );          // ثبت کوئری‌های SQL

// مخصوص WooCommerce
define( 'WC_LOG_THRESHOLD', 'debug' );

// افزایش حافظه برای فروشگاه‌های بزرگ
define( 'WP_MEMORY_LIMIT', '512M' );
define( 'WP_MAX_MEMORY_LIMIT', '1024M' );

// غیرفعال‌سازی ویرایش فایل از پیشخوان (امنیت)
define( 'DISALLOW_FILE_EDIT', true );

// محدودیت ورژن‌ها (کاهش حجم دیتابیس)
define( 'WP_POST_REVISIONS', 5 );
define( 'AUTOSAVE_INTERVAL', 300 );

۶. پیکربندی اولیه فروشگاه ایرانی

پس از نصب، ووکامرس از شما چند سؤال می‌پرسد. تنظیمات بهینه برای فروشگاه ایرانی:

اطلاعات فروشگاه

WooCommerce → Settings → General
آدرس فروشگاه: ایران، تهران، ...
کشور/منطقه فروش: فقط ایران
کشورهای ارسال: فقط ایران (یا بازارهای هدف)
محل پیش‌فرض مشتری: مکان جغرافیایی - با fallback تهران
فعال‌سازی نرخ مالیات: ✓
فعال‌سازی کوپن: ✓

ارز: تومان ایران یا ریال ایران
موقعیت نماد ارز: راست با فاصله
جداکننده هزارگان: ٫ (یا ,)
جداکننده اعشار: . (معمولاً نیاز نیست)
تعداد اعشار: 0 (تومان معمولاً اعشار نمی‌خورد)

افزونه ضروری: WooCommerce Persian

یکی از اولین کارها نصب افزونه WooCommerce Persian از مخزن وردپرس است که موارد زیر را اضافه می‌کند:

  • ارز تومان (به طور پیش‌فرض WC فقط Iranian Rial دارد)
  • تاریخ شمسی
  • اعداد فارسی در فاکتور و رسید
  • استان‌های ایران در فرم آدرس
  • کد پستی ۱۰ رقمی فارسی
  • کد ملی به جای SSN
نصب با WP-CLI
wp plugin install woocommerce-persian --activate

📝 مثال‌های عملی

🟢 آسان: گرفتن قیمت یک محصول با کد

functions.php
function icsd_get_product_price( $product_id ) {
    $product = wc_get_product( $product_id );
    
    if ( ! $product ) {
        return 'محصول پیدا نشد';
    }
    
    return wc_price( $product->get_price() );
}

// استفاده در قالب
echo icsd_get_product_price( 123 );
// خروجی: ۲۵۰,۰۰۰ تومان

🟡 متوسط: لیست ۵ محصول پرفروش

functions.php
function icsd_top_selling_products( $limit = 5 ) {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => $limit,
        'meta_key'       => 'total_sales',
        'orderby'        => 'meta_value_num',
        'order'          => 'DESC',
        'meta_query'     => array(
            array(
                'key'     => '_visibility',
                'value'   => array( 'catalog', 'visible' ),
                'compare' => 'IN'
            )
        )
    );
    
    $products = new WP_Query( $args );
    $output = '
    '; while ( $products->have_posts() ) { $products->the_post(); global $product; $output .= sprintf( '
  • %s - %s (%d فروش)
  • ', get_permalink(), get_the_title(), wc_price( $product->get_price() ), $product->get_total_sales() ); } wp_reset_postdata(); return $output . '
'; } // شورت‌کد add_shortcode( 'icsd_top_products', 'icsd_top_selling_products' ); // استفاده در صفحه: [icsd_top_products]

🔴 پیشرفته: کلاس Helper برای کار با ووکامرس

includes/class-icsd-woo-helper.php
<?php
namespace ICSDWoo;

defined( 'ABSPATH' ) || exit;

class WooHelper {
    
    /**
     * گرفتن مجموع فروش در بازه زمانی
     */
    public static function get_total_sales( $from_date, $to_date ) {
        global $wpdb;
        
        $query = $wpdb->prepare(
            "SELECT SUM(meta_value+0) as total 
             FROM {$wpdb->postmeta} pm
             INNER JOIN {$wpdb->posts} p ON pm.post_id = p.ID
             WHERE pm.meta_key = '_order_total'
             AND p.post_type = 'shop_order'
             AND p.post_status IN ('wc-completed', 'wc-processing')
             AND p.post_date BETWEEN %s AND %s",
            $from_date, $to_date
        );
        
        return (float) $wpdb->get_var( $query );
    }
    
    /**
     * تشخیص اینکه آیا HPOS فعال است
     */
    public static function is_hpos_enabled(): bool {
        if ( ! class_exists( 'AutomatticWooCommerceUtilitiesOrderUtil' ) ) {
            return false;
        }
        return AutomatticWooCommerceUtilitiesOrderUtil::custom_orders_table_usage_is_enabled();
    }
    
    /**
     * تبدیل ریال به تومان (تقسیم بر ۱۰)
     */
    public static function rial_to_toman( float $rial ): float {
        return $rial / 10;
    }
    
    /**
     * فرمت قیمت با اعداد فارسی
     */
    public static function format_price_persian( $price ): string {
        $persian = ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹'];
        $english = ['0','1','2','3','4','5','6','7','8','9'];
        
        $formatted = number_format( $price );
        $persian_price = str_replace( $english, $persian, $formatted );
        
        return $persian_price . ' تومان';
    }
    
    /**
     * گرفتن لیست استان‌های ایران
     */
    public static function get_iran_states(): array {
        return [
            'TEH' => 'تهران',
            'ESF' => 'اصفهان',
            'KSH' => 'کاشان',
            'FRS' => 'فارس',
            'KMN' => 'کرمان',
            'KHR' => 'خراسان رضوی',
            'AZS' => 'آذربایجان شرقی',
            // ...
        ];
    }
}

// استفاده:
$total = WooHelper::get_total_sales( '2024-01-01', '2024-12-31' );
echo WooHelper::format_price_persian( $total );
// خروجی: ۱۵٬۲۵۰٬۰۰۰ تومان

📌 خلاصه فصل

  • ✅ ووکامرس یک پلتفرم متن‌باز و قدرتمند است که برای بازار ایران بهترین گزینه است
  • ✅ معماری CRUD از نسخه ۳.۰ – همیشه از wc_get_product() و متدهای get_*/set_* استفاده کنید
  • ✅ نصب با WP-CLI سریع‌ترین و حرفه‌ای‌ترین روش است
  • ✅ HPOS را در پروژه‌های جدید فعال کنید – عملکرد ۳-۵ برابر بهتر
  • ✅ همیشه WooCommerce Persian را برای ارز تومان نصب کنید
  • ✅ wp-config.php را برای محیط توسعه با debug فعال پیکربندی کنید
  • ✅ از Composer برای مدیریت وابستگی‌ها در پروژه‌های جدی استفاده کنید
🎯 در فصل بعد: به سراغ مدیریت پیشرفته محصولات می‌رویم – محصول متغیر، گروهی، خارجی، دانلودی و ساخت ویژگی‌های سفارشی برای صنعت‌های خاص (مثل فرش با ابعاد و مواد).

نمایش سایت

رنگ سایت
حالت نمایش
اندازهٔ متن
خوانایی

این تنظیمات فقط روی مرورگر شما ذخیره می‌شود.