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 ''; echo ''; echo ''; echo ''; echo ''; } echo '
ストア名 メール 出金可能額 詳細
' . esc_html($v['store_name']) . ' (#' . $v['id'] . ')'; if (!empty($v['affiliate_id'])) { echo ' [affID: ' . esc_html($v['affiliate_id']) . ']'; } else { echo ' (アフィ未登録)'; } echo '' . esc_html($v['email']) . '' . 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 '
  • 商品数: ' . 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 '
'; } 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
ここを指しているリンクに誤りがあったようです。検索してみるのはいかがですか ?
お買い物カゴ
上部へスクロール
リンク