function vew_get_total_earnings($vendor_id) {
global $wpdb;
$product_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->prefix}posts WHERE post_type = 'product' AND post_author = %d",
$vendor_id
));
if (empty($product_ids)) return 0;
$placeholders = implode(',', array_fill(0, count($product_ids), '%d'));
$sql = "
SELECT SUM(CAST(oim2.meta_value AS DECIMAL(10,2))) AS total_sales
FROM {$wpdb->prefix}woocommerce_order_items oi
JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim1 ON oi.order_item_id = oim1.order_item_id
JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim2 ON oi.order_item_id = oim2.order_item_id
JOIN {$wpdb->prefix}posts p ON oi.order_id = p.ID
WHERE oim1.meta_key = '_product_id'
AND oim1.meta_value IN ($placeholders)
AND oim2.meta_key = '_line_total'
AND CAST(oim2.meta_value AS DECIMAL(10,2)) > 0
AND p.post_status IN ('wc-completed', 'wc-processing')
";
$query = $wpdb->prepare($sql, ...$product_ids);
$total = floatval($wpdb->get_var($query));
$fee_rate = floatval(get_user_meta($vendor_id, 'vendor_fee_rate', true));
return $total - round($total * ($fee_rate / 100), 2);
}
function vew_get_vendor_orders($vendor_id) {
global $wpdb;
$product_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->prefix}posts WHERE post_type = 'product' AND post_author = %d",
$vendor_id
));
if (empty($product_ids)) return [];
$placeholders = implode(',', array_fill(0, count($product_ids), '%d'));
$sql = "
SELECT oi.order_id, oim2.meta_value as line_total,
p.post_date as order_date,
MAX(CASE WHEN oim.meta_key = 'Admin Fee' THEN oim.meta_value END) AS admin_fee,
MAX(CASE WHEN oim.meta_key = 'name' THEN oim.meta_value END) AS product_name
FROM {$wpdb->prefix}woocommerce_order_items oi
JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim1 ON oi.order_item_id = oim1.order_item_id
JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim2 ON oi.order_item_id = oim2.order_item_id AND oim2.meta_key = '_line_total'
JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
JOIN {$wpdb->prefix}posts p ON oi.order_id = p.ID
WHERE oim1.meta_key = '_product_id'
AND oim1.meta_value IN ($placeholders)
AND CAST(oim2.meta_value AS DECIMAL(10,2)) > 0
AND p.post_status IN ('wc-completed', 'wc-processing')
GROUP BY oi.order_item_id, oi.order_id, oim2.meta_value, p.post_date
ORDER BY p.ID DESC
LIMIT 50
";
return $wpdb->get_results($wpdb->prepare($sql, ...$product_ids));
}
function vew_get_vendor_withdrawals($vendor_id) {
global $wpdb;
$table = $wpdb->prefix . 'wcfm_marketplace_withdraw_request';
return $wpdb->get_results($wpdb->prepare(
"SELECT * FROM $table WHERE vendor_id = %d ORDER BY created DESC",
$vendor_id
));
}
function vew_create_withdraw_request($vendor_id, $amount) {
global $wpdb;
$table = $wpdb->prefix . 'wcfm_marketplace_withdraw_request';
$wpdb->insert($table, [
'vendor_id' => $vendor_id,
'order_ids' => '',
'commission_ids' => '',
'payment_method' => 'manual',
'withdraw_amount' => $amount,
'withdraw_charges' => 0,
'withdraw_status' => 'pending',
'withdraw_mode' => 'by_request',
'withdraw_note' => '',
'is_auto_withdrawal'=> 0,
'withdraw_paid_date'=> null,
'created' => current_time('mysql')
]);
}
function vew_get_point_withdrawals($user_id) {
global $wpdb;
$table = $wpdb->prefix . 'withdrawal_requests';
return $wpdb->get_results($wpdb->prepare(
"SELECT * FROM $table WHERE user_id = %d ORDER BY created_at DESC",
$user_id
));
}
// 管理画面メニューに「ベンダー手数料管理」を追加
add_action('admin_menu', 'vew_add_vendor_fee_settings_menu');
function vew_add_vendor_fee_settings_menu() {
add_menu_page(
'ベンダー手数料設定',
'ベンダー手数料',
'manage_options',
'vendor-fee-settings',
'vew_render_vendor_fee_settings',
'dashicons-admin-users',
56
);
}
// 手数料設定ページの描画(出金可能額 + ポイント + アフィ報酬)
function vew_render_vendor_fee_settings() {
if (!current_user_can('manage_options')) return;
global $wpdb;
$user_table = $wpdb->prefix . 'users';
if (isset($_POST['save_fees'])) {
foreach ($_POST['vendor_fees'] as $user_id => $fee) {
update_user_meta($user_id, 'vendor_fee_rate', floatval($fee));
}
echo '
';
}
$vendors_raw = $wpdb->get_results("SELECT ID, user_email FROM $user_table WHERE ID IN (SELECT DISTINCT post_author FROM {$wpdb->prefix}posts WHERE post_type = 'product') ORDER BY ID ASC");
$vendors = [];
foreach ($vendors_raw as $vendor) {
if (strpos($vendor->user_email, '@cosmos-ea.com') !== false) continue;
$affiliate_id = $wpdb->get_var($wpdb->prepare(
"SELECT affiliateId FROM {$wpdb->prefix}wpam_affiliates WHERE userId = %d",
$vendor->ID
));
$store_name = get_user_meta($vendor->ID, 'store_name', true) ?: '(未設定)';
$product_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->prefix}posts WHERE post_type = 'product' AND post_author = %d",
$vendor->ID
));
$product_count = count($product_ids);
$total_sales = 0;
if (!empty($product_ids)) {
$placeholders = implode(',', array_fill(0, count($product_ids), '%d'));
$sql = "SELECT SUM(CAST(oim2.meta_value AS DECIMAL(10,2))) AS total FROM {$wpdb->prefix}woocommerce_order_items oi JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim1 ON oi.order_item_id = oim1.order_item_id JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim2 ON oi.order_item_id = oim2.order_item_id JOIN {$wpdb->prefix}posts p ON oi.order_id = p.ID WHERE oim1.meta_key = '_product_id' AND oim1.meta_value IN ($placeholders) AND oim2.meta_key = '_line_total' AND CAST(oim2.meta_value AS DECIMAL(10,2)) > 0 AND p.post_status IN ('wc-completed', 'wc-processing')";
$query = $wpdb->prepare($sql, ...$product_ids);
$total_sales = floatval($wpdb->get_var($query));
}
$fee_rate = floatval(get_user_meta($vendor->ID, 'vendor_fee_rate', true));
if ($fee_rate <= 0 || $fee_rate > 100) $fee_rate = 0;
$net_sales = $total_sales * ((100 - $fee_rate) / 100);
$withdraw_total = floatval($wpdb->get_var($wpdb->prepare(
"SELECT SUM(withdraw_amount) FROM {$wpdb->prefix}wcfm_marketplace_withdraw_request WHERE vendor_id = %d AND withdraw_status != 'rejected'",
$vendor->ID
)));
$sales_available = max(0, $net_sales - $withdraw_total);
$points = (int) get_user_meta($vendor->ID, 'user_points', true);
$points_withdrawn = (int) $wpdb->get_var(
$wpdb->prepare(
"SELECT SUM(amount) FROM {$wpdb->prefix}withdrawal_requests WHERE user_id = %d AND status = 'approved'",
$user_id
)
);
$points_available = max(0, $points - $points_withdrawn);
$affiliate_reward_total = 0;
$affiliate_payout_total = 0;
$affiliate_net = 0;
if ($affiliate_id) {
$affiliate_reward_total = floatval($wpdb->get_var($wpdb->prepare(
"SELECT SUM(amount) FROM {$wpdb->prefix}wpam_transactions WHERE affiliateId = %d AND type IN ('credit', 'adjustment') AND status = 'confirmed'",
$affiliate_id
)));
$affiliate_payout_total = floatval($wpdb->get_var($wpdb->prepare(
"SELECT SUM(amount) FROM {$wpdb->prefix}wpam_transactions WHERE affiliateId = %d AND type = 'payout' AND status = 'confirmed'",
$affiliate_id
)));
$affiliate_net = $affiliate_reward_total + $affiliate_payout_total;
}
$withdrawable_total = $sales_available + $points_available + $affiliate_net;
$vendors[] = [
'id' => $vendor->ID,
'email' => $vendor->user_email,
'store_name' => $store_name,
'product_count' => $product_count,
'total_sales' => $total_sales,
'net_sales' => $net_sales,
'sales_available' => $sales_available,
'withdraw_total' => $withdraw_total,
'points' => $points,
'points_available' => $points_available,
'points_withdrawn' => $points_withdrawn,
'withdrawable_total' => $withdrawable_total,
'affiliate_id' => $affiliate_id,
'affiliate_reward' => $affiliate_reward_total,
'affiliate_payout' => abs($affiliate_payout_total),
'affiliate_net' => $affiliate_net,
'fee_rate' => $fee_rate
];
}
usort($vendors, function($a, $b) {
return $b['withdrawable_total'] <=> $a['withdrawable_total'];
});
echo 'ベンダー収益と出金状況 ';
echo '
ストア名
メール
出金可能額
詳細
';
foreach ($vendors as $v) {
echo '';
echo '' . esc_html($v['store_name']) . ' (#' . $v['id'] . ')';
if (!empty($v['affiliate_id'])) {
echo ' [affID: ' . esc_html($v['affiliate_id']) . ']';
} else {
echo ' (アフィ未登録) ';
}
echo ' ';
echo '' . esc_html($v['email']) . ' ';
echo '' . wc_price($v['withdrawable_total']) . ' ';
echo '';
echo '有料売上: ' . wc_price($v['sales_available']) . ' ';
echo 'IB報酬: ' . esc_html($v['points_available']) . ' pt ';
echo 'アフィリエイト報酬: ' . wc_price($v['affiliate_net']) . ' ';
echo ' ';
echo '▼ 詳細 ';
echo '商品数: ' . esc_html($v['product_count']) . ' ';
echo '手数料率: ' . esc_html($v['fee_rate']) . '% ';
echo '売り上げ(累計): ' . wc_price($v['total_sales']) . ' ';
echo '売り上げ(純利益): ' . wc_price($v['net_sales']) . ' ';
echo '売り上げ(出金可能): ' . wc_price($v['sales_available']) . ' ';
echo '売り上げ(出金済み): ' . wc_price($v['withdraw_total']) . ' ';
echo 'シストレPT(累計): ' . esc_html($v['points']) . ' pt ';
echo 'シストレPT(出金可能): ' . esc_html($v['points_available']) . ' pt ';
echo 'シストレPT(出金済み): ' . esc_html($v['points_withdrawn']) . ' pt ';
echo 'アフィリエイト(累計): ' . wc_price($v['affiliate_reward']) . ' ';
echo 'アフィリエイト(出金可能): ' . wc_price($v['affiliate_net']) . ' ';
echo 'アフィリエイト(出金済み): ' . wc_price($v['affiliate_payout']) . ' ';
echo '出金可能総額: ' . wc_price($v['withdrawable_total']) . ' ';
echo ' ';
echo ' ';
}
echo '
';
echo '
';
}
function vew_get_affiliate_rewards($user_id) {
global $wpdb;
$affiliate_id = $wpdb->get_var($wpdb->prepare(
"SELECT affiliateId FROM {$wpdb->prefix}wpam_affiliates WHERE userId = %d",
$user_id
));
if (!$affiliate_id) return 0;
$total = $wpdb->get_var($wpdb->prepare(
"SELECT SUM(amount) FROM {$wpdb->prefix}wpam_transactions
WHERE affiliateId = %d
AND type IN ('credit', 'adjustment')
AND status = 'confirmed'",
$affiliate_id
));
return floatval($total);
}
ページが見つかりませんでした | シストレ.COM
内容をスキップ
ここを指しているリンクに誤りがあったようです。検索してみるのはいかがですか ?
上部へスクロール
リンク