📦 فصل ۱: مقدمه و نصب پیشرفته ووکامرس
ووکامرس (WooCommerce) یک افزونه متنباز و رایگان برای وردپرس است که آن را به یک پلتفرم فروشگاهسازی قدرتمند تبدیل میکند. در این فصل نه فقط نصب ساده، بلکه معماری داخلی، نصب با WP-CLI، پیکربندی محیط توسعه و آمادهسازی محیط حرفهای را میآموزیم.
ووکامرس (WooCommerce) یک افزونه متنباز و رایگان برای وردپرس است که آن را به یک پلتفرم فروشگاهسازی قدرتمند تبدیل میکند. در این فصل نه فقط نصب ساده، بلکه معماری داخلی، نصب با WP-CLI، پیکربندی محیط توسعه و آمادهسازی محیط حرفهای را میآموزیم.
📑 سرفصلهای این فصل
۱. ووکامرس چیست و چرا انتخاب اول ایران است؟
ووکامرس در سال ۲۰۱۱ توسط WooThemes توسعه یافت و در ۲۰۱۵ توسط Automattic (شرکت سازنده وردپرس) خریداری شد. امروز بیش از ۸ میلیون فروشگاه در سراسر دنیا و اکثر فروشگاههای متوسط ایرانی از آن استفاده میکنند.
چرا ووکامرس برای بازار ایران مناسب است؟
| ویژگی | ووکامرس | Shopify | Magento |
|---|---|---|---|
| هزینه پایه | رایگان ✓ | ماهانه $39+ | رایگان (Open Source) |
| درگاه پرداخت ایرانی | کامل ✓ | ندارد ✗ | محدود |
| پشتیبانی فارسی RTL | کامل ✓ | ضعیف | متوسط |
| منابع آموزشی فارسی | فراوان ✓ | محدود | کم |
| قابلیت سفارشیسازی | نامحدود ✓ | محدود به App | پیچیده |
| هاستینگ ایرانی | سازگار ✓ | غیرممکن | سنگین |
۲. معماری داخلی WooCommerce
درک معماری ووکامرس برای توسعهدهنده حیاتی است. ووکامرس بر پایه چند مفهوم کلیدی ساخته شده:
🏗️ ساختار CRUD
از نسخه ۳.۰ به بعد، ووکامرس از الگوی CRUD (Create, Read, Update, Delete) استفاده میکند که دادهها را از کلاسهای Object جدا میکند:
// ❌ روش قدیمی (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 -- متادیتای سفارش
۳. روشهای نصب پیشرفته
روش ۱: نصب از پیشخوان وردپرس (مبتدی)
- افزونهها ← افزودن جدید
- جستجو:
WooCommerce - کلیک روی Install Now سپس Activate
- اجرای Setup Wizard
روش ۲: نصب با WP-CLI (حرفهای) ⭐
WP-CLI ابزار خط فرمان وردپرس است که برای توسعهدهندههای جدی ضروری است:
# نصب 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
روش ۳: نصب با Composer (پیشرفتهترین)
{
"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
- به WooCommerce → Settings → Advanced → Features بروید
- در بخش Order data storage، گزینه High-performance order storage را انتخاب کنید
- کلیک روی Save changes
تشخیص سازگاری افزونه با HPOS در کد
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 برای توسعه
// فعالسازی 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 );
۶. پیکربندی اولیه فروشگاه ایرانی
پس از نصب، ووکامرس از شما چند سؤال میپرسد. تنظیمات بهینه برای فروشگاه ایرانی:
اطلاعات فروشگاه
آدرس فروشگاه: ایران، تهران، ...
کشور/منطقه فروش: فقط ایران
کشورهای ارسال: فقط ایران (یا بازارهای هدف)
محل پیشفرض مشتری: مکان جغرافیایی - با fallback تهران
فعالسازی نرخ مالیات: ✓
فعالسازی کوپن: ✓
ارز: تومان ایران یا ریال ایران
موقعیت نماد ارز: راست با فاصله
جداکننده هزارگان: ٫ (یا ,)
جداکننده اعشار: . (معمولاً نیاز نیست)
تعداد اعشار: 0 (تومان معمولاً اعشار نمیخورد)
افزونه ضروری: WooCommerce Persian
یکی از اولین کارها نصب افزونه WooCommerce Persian از مخزن وردپرس است که موارد زیر را اضافه میکند:
- ارز تومان (به طور پیشفرض WC فقط Iranian Rial دارد)
- تاریخ شمسی
- اعداد فارسی در فاکتور و رسید
- استانهای ایران در فرم آدرس
- کد پستی ۱۰ رقمی فارسی
- کد ملی به جای SSN
wp plugin install woocommerce-persian --activate
📝 مثالهای عملی
🟢 آسان: گرفتن قیمت یک محصول با کد
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 );
// خروجی: ۲۵۰,۰۰۰ تومان
🟡 متوسط: لیست ۵ محصول پرفروش
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 برای کار با ووکامرس
<?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 برای مدیریت وابستگیها در پروژههای جدی استفاده کنید