💰 فصل ۶: مالیات و ارز در ووکامرس
در این فصل با تنظیمات حرفهای مالیات بر ارزش افزوده، ارز تومان/ریال، نمایش قیمتها و چندارزی شدن فروشگاه آشنا میشوید.
📐 پایههای مالیات در ووکامرس
فعالسازی مالیات
از WooCommerce → Settings → General، تیک Enable taxes را بزنید.
مفاهیم کلیدی
| مفهوم | توضیح |
|---|---|
| Tax Class | کلاس مالیاتی – مثلاً Standard، Reduced، Zero |
| Tax Rate | نرخ مالیات برای هر کلاس + هر منطقه |
| Prices include tax | قیمتها شامل مالیات هستند یا خیر |
| Display prices | نمایش قیمت در سبد و سایت با/بدون مالیات |
🇮🇷 مالیات بر ارزش افزوده ایران
برای فروشگاه ایرانی با مالیات ۱۰٪ (مرسوم در سالهای اخیر):
تنظیم نرخ از پنل
WooCommerce → Settings → Tax- روی Standard rates کلیک کنید
- یک ردیف اضافه کنید با مقادیر:
| Country code | IR |
| State code | * (همه استانها) |
| Postcode/ZIP | * |
| City | * |
| Rate % | 10.0000 |
| Tax name | مالیات بر ارزش افزوده |
تنظیم برنامهنویسی نرخ مالیات
// در فعالسازی افزونه، نرخ مالیات ایران را خودکار اضافه کن
register_activation_hook(__FILE__, function() {
global $wpdb;
$exists = $wpdb->get_var(
"SELECT tax_rate_id FROM {$wpdb->prefix}woocommerce_tax_rates
WHERE tax_rate_country = 'IR' AND tax_rate_class = ''"
);
if (!$exists) {
$wpdb->insert($wpdb->prefix . 'woocommerce_tax_rates', [
'tax_rate_country' => 'IR',
'tax_rate_state' => '',
'tax_rate' => '10.0000',
'tax_rate_name' => 'مالیات بر ارزش افزوده',
'tax_rate_priority' => 1,
'tax_rate_compound' => 0,
'tax_rate_shipping' => 1,
'tax_rate_order' => 0,
'tax_rate_class' => '',
]);
}
});
معاف کردن محصولات خاص
// بعضی محصولات (مثل کالاهای اساسی) معاف از مالیات هستند
add_filter('woocommerce_product_get_tax_class', function($tax_class, $product) {
$exempt_categories = ['food-staples', 'medicine'];
$cats = wp_get_post_terms($product->get_id(), 'product_cat', ['fields' => 'slugs']);
if (array_intersect($cats, $exempt_categories)) {
return 'zero-rate';
}
return $tax_class;
}, 10, 2);
نمایش جداگانه مالیات در فاکتور
// نمایش مبلغ خالص + مالیات بهصورت جدا
add_filter('woocommerce_get_order_item_totals', function($totals, $order, $tax_display) {
if (isset($totals['cart_subtotal'])) {
$subtotal = $order->get_subtotal();
$tax = $order->get_total_tax();
$totals['cart_subtotal']['value'] = wc_price($subtotal) .
' (بدون مالیات)';
$totals['tax_breakdown'] = [
'label' => 'مالیات بر ارزش افزوده ۱۰٪:',
'value' => wc_price($tax),
];
}
return $totals;
}, 10, 3);
💵 واحد پول تومان (راهحل کامل)
ووکامرس بهصورت پیشفرض از تومان پشتیبانی میکند، اما برای پشتیبانی کامل (با درگاههایی که ریال میخواهند) باید کارهای زیر را انجام دهید:
افزودن تومان به لیست ارزها (در صورت نیاز)
// اضافه کردن تومان (اگر در نسخه شما نبود)
add_filter('woocommerce_currencies', function($currencies) {
$currencies['IRT'] = 'تومان ایران';
return $currencies;
});
add_filter('woocommerce_currency_symbol', function($symbol, $currency) {
if ($currency === 'IRT') return 'تومان';
return $symbol;
}, 10, 2);
فرمت اعداد فارسی
// تبدیل اعداد به فارسی در نمایش قیمت
add_filter('wc_price', function($return, $price, $args, $unformatted_price) {
return convert_to_persian_numbers($return);
}, 10, 4);
function convert_to_persian_numbers($string) {
$persian = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
$english = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
return str_replace($english, $persian, $string);
}
تبدیل تومان به ریال در پرداخت
// در درگاه پرداخت، اگر فروشگاه تومان است، × 10 کن
public function get_amount_for_gateway($order) {
$amount = (int) $order->get_total();
if (in_array($order->get_currency(), ['IRT', 'TOMAN', 'TMN'])) {
return $amount * 10; // تبدیل به ریال
}
return $amount;
}
🌐 چندارزی – تبدیل لحظهای
برای فروشگاههایی که محصول را به مشتریان خارجی هم میفروشند:
روش ۱: استفاده از افزونه
- WPML Currency Switcher – بهترین برای سایت چندزبانه
- CURCY – WooCommerce Multi Currency – رایگان
- Aelia Currency Switcher – حرفهای
روش ۲: پیادهسازی سفارشی
class Simple_Multi_Currency {
private $rates = [];
public function __construct() {
$this->rates = $this->get_rates();
add_filter('woocommerce_product_get_price', [$this, 'convert_price'], 10, 2);
add_filter('woocommerce_product_get_regular_price', [$this, 'convert_price'], 10, 2);
add_filter('woocommerce_currency_symbol', [$this, 'change_symbol'], 10, 2);
add_action('init', [$this, 'detect_currency']);
add_action('woocommerce_before_main_content', [$this, 'currency_switcher']);
}
private function get_rates() {
// کش روزانه برای جلوگیری از فراخوانی مکرر API
$rates = get_transient('icsd_currency_rates');
if ($rates !== false) return $rates;
// دریافت از Navasan API (رایگان برای ایران)
$response = wp_remote_get('http://api.navasan.tech/latest/?api_key=YOUR_KEY');
$data = json_decode(wp_remote_retrieve_body($response), true);
$rates = [
'IRT' => 1, // پایه
'USD' => 1 / floatval($data['usd_buy']['value'] ?? 60000),
'EUR' => 1 / floatval($data['eur']['value'] ?? 65000),
'AED' => 1 / floatval($data['aed']['value'] ?? 16000),
];
set_transient('icsd_currency_rates', $rates, DAY_IN_SECONDS);
return $rates;
}
public function detect_currency() {
if (isset($_GET['set_currency'])) {
$currency = sanitize_text_field($_GET['set_currency']);
if (isset($this->rates[$currency])) {
setcookie('user_currency', $currency, time() + YEAR_IN_SECONDS, '/');
$_COOKIE['user_currency'] = $currency;
}
}
}
public function get_user_currency() {
return $_COOKIE['user_currency'] ?? 'IRT';
}
public function convert_price($price, $product) {
if (empty($price)) return $price;
$user_currency = $this->get_user_currency();
if ($user_currency === 'IRT') return $price;
$rate = $this->rates[$user_currency] ?? 1;
return round(floatval($price) * $rate, 2);
}
public function change_symbol($symbol, $currency) {
$user_currency = $this->get_user_currency();
$symbols = [
'USD' => '$', 'EUR' => '€', 'AED' => 'د.إ',
];
return $symbols[$user_currency] ?? $symbol;
}
public function currency_switcher() {
$current = $this->get_user_currency();
echo '';
foreach (array_keys($this->rates) as $cur) {
$active = $cur === $current ? 'active' : '';
$url = add_query_arg('set_currency', $cur);
echo "{$cur}";
}
echo '';
}
}
new Simple_Multi_Currency();
🏷️ نمایش حرفهای قیمت
قیمت با تخفیف زیبا
// نمایش درصد تخفیف کنار قیمت
add_filter('woocommerce_sale_flash', function($html, $post, $product) {
if ($product->is_on_sale()) {
$regular = floatval($product->get_regular_price());
$sale = floatval($product->get_sale_price());
if ($regular > 0) {
$percent = round((($regular - $sale) / $regular) * 100);
return '' . $percent . '٪ تخفیف';
}
}
return $html;
}, 10, 3);
نمایش قیمت اقساطی
// زیر قیمت، نمایش پرداخت ۳ قسطی (مثل اسنپپی)
add_action('woocommerce_after_shop_loop_item_title', function() {
global $product;
$price = floatval($product->get_price());
if ($price >= 1_000_000) {
$monthly = round($price / 3);
echo '';
echo 'یا ۳ قسط ' . wc_price($monthly) . '';
echo '';
}
}, 15);
قیمت دلاری بهصورت ثانویه
add_filter('woocommerce_get_price_html', function($price_html, $product) {
$rate = get_option('icsd_usd_rate', 60000);
$usd = round(floatval($product->get_price()) / $rate, 2);
if ($usd > 0) {
$price_html .= ' (~$' . $usd . ')';
}
return $price_html;
}, 10, 2);
🧾 صدور فاکتور رسمی
اضافه کردن فیلدهای فاکتور رسمی
// فیلدهای حقوقی در checkout
add_filter('woocommerce_checkout_fields', function($fields) {
$fields['billing']['billing_company_type'] = [
'label' => 'نوع خریدار',
'type' => 'select',
'options' => [
'real' => 'حقیقی',
'legal' => 'حقوقی',
],
'class' => ['form-row-wide'],
'priority' => 25,
];
$fields['billing']['billing_economic_code'] = [
'label' => 'شناسه ملی / کد اقتصادی',
'type' => 'text',
'class' => ['form-row-wide'],
'priority' => 26,
'required' => false,
];
$fields['billing']['billing_national_id'] = [
'label' => 'کد ملی',
'type' => 'text',
'class' => ['form-row-wide'],
'priority' => 27,
'required' => true,
];
return $fields;
});
// نمایش در پنل سفارش
add_action('woocommerce_admin_order_data_after_billing_address', function($order) {
echo 'نوع خریدار: ' .
esc_html($order->get_meta('_billing_company_type') === 'legal' ? 'حقوقی' : 'حقیقی') .
'
';
echo 'کد ملی/اقتصادی: ' .
esc_html($order->get_meta('_billing_economic_code') ?: $order->get_meta('_billing_national_id')) .
'
';
});
تولید PDF فاکتور
برای ایجاد فاکتور PDF، میتوانید از کتابخانه TCPDF یا dompdf استفاده کنید:
// نیاز به: composer require dompdf/dompdf
use DompdfDompdf;
add_action('woocommerce_admin_order_actions_end', function($order) {
$url = admin_url('admin-post.php?action=download_invoice&order_id=' . $order->get_id());
echo '📄 PDF فاکتور';
});
add_action('admin_post_download_invoice', function() {
$order = wc_get_order(absint($_GET['order_id']));
if (!$order || !current_user_can('manage_woocommerce')) wp_die('دسترسی مجاز نیست');
ob_start();
include __DIR__ . '/templates/invoice-template.php'; // قالب HTML
$html = ob_get_clean();
$dompdf = new Dompdf(['enable_remote' => true, 'defaultFont' => 'Vazirmatn']);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream('invoice-' . $order->get_order_number() . '.pdf', ['Attachment' => true]);
exit;
});
📝 خلاصه فصل
- تنظیم مالیات بر ارزش افزوده ایران
- پشتیبانی کامل از تومان و تبدیل به ریال
- پیادهسازی چندارزی با کش
- نمایش حرفهای قیمت با تخفیف و اقساط
- اضافه کردن فیلدهای فاکتور رسمی
- تولید PDF فاکتور