قلابهای درخواستی کاربران
تعریف کد تخفیف اختصاصی بازاریاب و ثبت پورسانت
میتوانید برای بازاریاب دلخواه، کدتخفیف اختصاصی ایجاد کنید؛ هرگاه مشتری از این کد تخفیف در هنگام خرید استفاده کند، پس از تکمیل موفق سفارش، پورسانت به صورت خودکار برای بازاریابی که به آن کد تخفیف متصل است، محاسبه و واریز خواهد شد. این سیستم به صورت هوشمند طراحی شده و اگر مشتری هم از لینک همکاری وارد شده باشد و هم از کد تخفیف استفاده کند، اولویت با کد تخفیف خواهد بود و پورسانت دو بار محاسبه نخواهد شد.
[php]
/**
* =================================================================
* قلاب سیستم کد تخفیف اختصاصی برای بازاریابان
* =================================================================
*/
add_action('woocommerce_coupon_options', 'hmyt_affiliate_add_coupon_user_field', 10, 2);
function hmyt_affiliate_add_coupon_user_field($coupon_id, $coupon) {
$user_id = get_post_meta($coupon_id, '_hmyt_affiliate_user_id', true);
$user_display = 'یک بازاریاب را جستجو و انتخاب کنید…';
$options = [];
if ($user_id) {
$user = get_userdata($user_id);
if ($user) {
$options[$user_id] = esc_html($user->display_name . ' (' . $user->user_login . ')');
}
}
echo '<div class="options_group">';
echo '<p class="form-field">';
echo '<label for="hmyt_affiliate_user_id">بازاریاب اختصاصی</label>';
echo '<select id="hmyt_affiliate_user_id" name="hmyt_affiliate_user_id" class="hmyt-user-select-coupon" style="width: 100%;">';
if ($user_id) {
echo '<option value="' . esc_attr($user_id) . '" selected="selected">' . $options[$user_id] . '</option>';
}
echo '</select>';
echo '<span class="description">' . esc_html('این کد تخفیف را به یک بازاریاب خاص اختصاص دهید. در صورت استفاده از این کد، پورسانت برای این بازاریاب ثبت خواهد شد.') . '</span>';
echo '</p>';
echo '</div>';
}
add_action('woocommerce_coupon_options_save', 'hmyt_affiliate_save_coupon_user_field', 10, 2);
function hmyt_affiliate_save_coupon_user_field($post_id, $coupon) {
if (isset($_POST['hmyt_affiliate_user_id'])) {
$user_id = intval($_POST['hmyt_affiliate_user_id']);
if ($user_id > 0) {
update_post_meta($post_id, '_hmyt_affiliate_user_id', $user_id);
} else {
delete_post_meta($post_id, '_hmyt_affiliate_user_id');
}
} else {
delete_post_meta($post_id, '_hmyt_affiliate_user_id');
}
}
add_action('admin_enqueue_scripts', function($hook) {
if ($hook === 'post.php' && isset($_GET['post']) && get_post_type($_GET['post']) === 'shop_coupon' || $hook === 'post-new.php' && isset($_GET['post_type']) && $_GET['post_type'] === 'shop_coupon') {
wp_enqueue_style('select2', HMYT_TOOLS_URL . 'assets/css/select2.min.css', [], '4.1.0');
wp_enqueue_script('select2', HMYT_TOOLS_URL . 'assets/js/select2.min.js', ['jquery'], '4.1.0', true);
wp_add_inline_script('select2', "
jQuery(document).ready(function($) {
$('.hmyt-user-select-coupon').select2({
placeholder: 'یک بازاریاب را جستجو کنید…',
allowClear: true,
width: '100%',
ajax: {
url: ajaxurl, // ajaxurl
dataType: 'json',
delay: 250,
data: function(params) {
return {
action: 'hmyt_search_users',
search: params.term
};
},
processResults: function(data) {
return {
results: data
};
},
cache: true
},
minimumInputLength: 2,
templateResult: function(user) {
if (user.loading) return user.text;
return $('<div class=\"select2-user-result\" style=\"font-family: \'Estedad-FD\', sans-serif;\"><span class=\"user-name\">' + user.display_name + '</span><span class=\"user-login\"> (' + user.user_login + ')</span></div>');
},
templateSelection: function(user) {
return user.display_name || user.text;
}
});
});
");
}
});
add_action('woocommerce_order_status_completed', 'hmyt_track_affiliate_sale_via_coupon', 5, 1);
function hmyt_track_affiliate_sale_via_coupon($order_id) {
$order = wc_get_order($order_id);
if (!$order) {
return;
}
if (get_post_meta($order_id, '_hmyt_affiliate_commission_processed', true)) {
return;
}
$coupons_used = $order->get_coupon_codes();
if (empty($coupons_used)) {
return;
}
foreach ($coupons_used as $coupon_code) {
$coupon_post = get_page_by_title($coupon_code, OBJECT, 'shop_coupon');
if (!$coupon_post) continue;
$coupon_id = $coupon_post->ID;
$affiliate_id = get_post_meta($coupon_id, '_hmyt_affiliate_user_id', true);
if (!empty($affiliate_id)) {
$affid = get_user_meta($affiliate_id, 'hmyt_affiliate_affid', true);
if ($affid) {
$_COOKIE['hmyt_affiliate_affid'] = $affid;
}
if (function_exists('hmyt_track_affiliate_sale')) {
hmyt_track_affiliate_sale($order_id);
}
update_post_meta($order_id, '_hmyt_affiliate_commission_processed', true);
break;
}
}
}
add_action('woocommerce_order_status_completed', 'hmyt_flag_processed_affiliate_order', 20, 1);
function hmyt_flag_processed_affiliate_order($order_id) {
if (isset($_COOKIE['hmyt_affiliate_affid'])) {
$affid = sanitize_text_field($_COOKIE['hmyt_affiliate_affid']);
if (!empty($affid)) {
update_post_meta($order_id, '_hmyt_affiliate_commission_processed', true);
}
}
}
[/php]
نحوه استفاده
کد بالا را در ویرایشگر قلابها ذخیره کنید.
به بخش بازاریابی> کدهای تخفیف بروید و یک کد تخفیف جدید بسازید یا یکی از کدهای موجود را ویرایش کنید.
در تب “عمومی”، یک فیلد جدید به نام “بازاریاب اختصاصی” خواهید دید.
در این فیلد، نام یا نام کاربری بازاریاب مورد نظر خود را جستجو و انتخاب کنید و کد تخفیف را ذخیره نمایید.
داینامیکسازی پورسانت بر اساس ویژگی محصول
میتوانید با استفاده از قلاب فیلتر hmyt_affiliate_commission_rate، برای هر محصول در لحظه محاسبه پورسانت، ویژگیهای آن را بررسی کرده و بر اساس آن، درصد پورسانت را به صورت داینامیک تغییر دهید.
برای مثال، اگر بخواهید برای تمام محصولات با ویژگی رنگ آبی پورسانت را ۲۵ درصد تعیین کنید، از کد زیر استفاده کنید:
[php]
add_filter('hmyt_affiliate_commission_rate', function($commission_rate, $ref_id, $item, $order) {
$product = $item->get_product();
if ( ! $product ) {
return $commission_rate;
}
// نامک ویژگی (slug) را اینجا وارد کنید
// مثلا color
$attribute_slug = 'color';
$attribute_value = $product->get_attribute($attribute_slug);
// مقدار ویژگی را وارد کنید مثلا آبی
if ( $attribute_value === 'آبی' ) {
return 25; // تنظیم درصد پورسانت
}
return $commission_rate;
}, 10, 4);
[/php]
نمایش رتبهبندی بازاریابان به ترتیب درآمد
میتوانید با استفاده از قلاب زیر سیستم آمار ساده و رتبه بندی بازاریابان به همیار تولز اضافه میشود؛
خروجی محتوا رو میتونید با شورتکد [hamyar_tools_affiliate_leaderboard] در هرصفحه ای (مثلا یک برگه خصوصی) نمایش دهید.
[php]
/**
* =================================================================
* قلاب و شورتکد برای نمایش صفحه رتبهبندی بازاریابان
* =================================================================
*/
// ۱. ثبت شورتکد [hamyar_tools_affiliate_leaderboard]
add_shortcode('hamyar_tools_affiliate_leaderboard', 'hmyt_affiliate_render_leaderboard_page');
/**
* تابع اصلی برای رندر محتوای صفحه رتبهبندی بازاریابان.
* این تابع تمام محاسبات را انجام داده و لیست HTML را برمیگرداند.
*/
function hmyt_affiliate_render_leaderboard_page() {
// دریافت تمام کاربرانی که حداقل یک تراکنش دارند
$all_users = get_users([
'meta_key' => 'hmyt_affiliate_transactions',
'fields' => 'ID',
]);
if (empty($all_users)) {
return '<div class="hmyt-alert">هنوز هیچ بازاریابی فعالیتی ثبت نکرده است.</div>';
}
$marketers_data = [];
$current_month_start_ts = strtotime(jhmyt('Y-m-01', '', '', 'Asia/Tehran', 'en'));
foreach ($all_users as $user_id) {
$user_data = get_userdata($user_id);
$transactions = get_user_meta($user_id, 'hmyt_affiliate_transactions', true);
$transactions = is_array($transactions) ? $transactions : [];
$monthly_income = 0;
foreach ($transactions as $txn) {
if (isset($txn['date']) && strtotime($txn['date']) >= $current_month_start_ts) {
$monthly_income += (float) ($txn['amount'] ?? 0);
}
}
$marketers_data[] = [
'name' => $user_data->display_name,
'username' => $user_data->user_login,
'email' => $user_data->user_email,
'total_income' => (float) get_user_meta($user_id, 'hmyt_affiliate_total_income', true),
'current_balance' => (float) get_user_meta($user_id, 'hmyt_affiliate_balance', true),
'monthly_income' => $monthly_income,
'transaction_count' => count($transactions),
];
}
// مرتبسازی بازاریابان بر اساس درآمد کل (نزولی)
usort($marketers_data, function($a, $b) {
return $b['total_income'] <=> $a['total_income'];
});
// شروع بافر خروجی برای ساخت HTML
ob_start();
?>
<style>
.hmyt-affiliate-leaderboard {
max-width: 900px;
margin: 20px auto;
direction: rtl;
color: #e0e0e0;
}
.hmyt-leaderboard-title {
text-align: center;
font-size: 28px;
margin-bottom: 30px;
color: #ffffff;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
.hmyt-leaderboard-container {
display: flex;
flex-direction: column;
gap: 15px;
}
.hmyt-leaderboard-item {
background: linear-gradient(135deg, #2a2a2a 0%, #1f1f1f 100%);
border-radius: 15px;
padding: 20px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.5);
transition: transform 0.3s ease, box-shadow 0.3s ease;
display: flex;
align-items: center;
gap: 20px;
}
.hmyt-leaderboard-item:hover {
transform: translateY(-5px);
box-shadow: 0 6px 15px rgba(0, 0, 0, 0.7);
}
.rank-badge {
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
border-radius: 50%;
color: #fff;
font-size: 18px;
flex-shrink: 0;
}
.rank-1 { background-color: #ffd700; color: #333; } /* Gold */
.rank-2 { background-color: #c0c0c0; color: #333; } /* Silver */
.rank-3 { background-color: #cd7f32; } /* Bronze */
.rank-other { background-color: #444444; }
.hmyt-leaderboard-content {
flex-grow: 1;
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
font-size: 14px;
}
.hmyt-leaderboard-content div {
display: flex;
flex-direction: column;
}
.hmyt-leaderboard-content span:first-child {
color: #a0a0a0;
font-size: 12px;
margin-bottom: 5px;
}
.hmyt-leaderboard-content span:last-child {
color: #ffffff;
font-weight: 500;
}
.hmyt-leaderboard-content .total-income span:last-child {
color: #ffd700;
font-weight: bold;
}
@media (max-width: 768px) {
.hmyt-leaderboard-content {
grid-template-columns: 1fr 1fr;
}
}
@media (max-width: 480px) {
.hmyt-leaderboard-content {
grid-template-columns: 1fr;
}
.hmyt-leaderboard-item {
flex-direction: column;
align-items: flex-start;
}
.rank-badge {
margin-bottom: 10px;
}
}
</style>
<div class="hmyt-affiliate-leaderboard">
<h2 class="hmyt-leaderboard-title">🏆 رتبهبندی بازاریابان</h2>
<div class="hmyt-leaderboard-container">
<?php foreach ($marketers_data as $index => $marketer): ?>
<div class="hmyt-leaderboard-item">
<span class="rank-badge rank-<?php echo ($index < 3) ? ($index + 1) : 'other'; ?>">
<?php echo $index + 1; ?>
</span>
<div class="hmyt-leaderboard-content">
<div>
<span>نام بازاریاب</span>
<span><?php echo esc_html($marketer['name']); ?></span>
</div>
<div>
<span>نام کاربری</span>
<span><?php echo esc_html($marketer['username']); ?></span>
</div>
<div>
<span>ایمیل</span>
<span><?php echo esc_html($marketer['email']); ?></span>
</div>
<div>
<span>تعداد تراکنش</span>
<span><?php echo number_format_i18n($marketer['transaction_count']); ?></span>
</div>
<div>
<span>درآمد ماه جاری</span>
<span><?php echo wc_price($marketer['monthly_income']); ?></span>
</div>
<div>
<span>موجودی فعلی</span>
<span><?php echo wc_price($marketer['current_balance']); ?></span>
</div>
<div class="total-income">
<span>درآمد کل</span>
<span><?php echo wc_price($marketer['total_income']); ?></span>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<?php
return ob_get_clean();
}
[/php]