/** * Display affiliate column content * * @param string $output Column output * @param string $column_name Column name * @param int $user_id User ID * @return string Modified output */ public function affiliate_user_column_content($output, $column_name, $user_id) { if ('simfly_affiliate' !== $column_name) { return $output; } if (simfly_aff_is_user_affiliate($user_id)) { $commission = SimFly_Aff_Commission::get_instance(); // Get tier $manual_tier = get_user_meta($user_id, 'simfly_aff_manual_tier', true); $tier = !empty($manual_tier) ? $manual_tier : $commission->get_affiliate_tier($user_id); // Get stats $stats = $this->get_affiliate_stats_summary($user_id); $output = '' . esc_html__('Yes', 'simfly-affiliates') . ''; $output .= '
'; $output .= '' . esc_html__('Tier:', 'simfly-affiliates') . ' ' . esc_html(simfly_aff_get_tier_label($tier)) . ''; if ($stats['total_commissions'] > 0) { $output .= '
'; $output .= '' . esc_html__('Commissions:', 'simfly-affiliates') . ' ' . wc_price($stats['total_commissions']) . ''; } } else { $output = '' . esc_html__('No', 'simfly-affiliates') . ''; // Add link to make user an affiliate $output .= '
'; $output .= '' . esc_html__('Make Affiliate', 'simfly-affiliates') . ''; } return $output; } /** * Get affiliate stats summary * * @param int $affiliate_id Affiliate ID * @return array Stats summary */ private function get_affiliate_stats_summary($affiliate_id) { global $wpdb; $stats = array( 'total_referrals' => 0, 'total_commissions' => 0, 'unpaid_commissions' => 0 ); // Get stats $result = $wpdb->get_row( $wpdb->prepare( "SELECT COUNT(DISTINCT post_id) AS total_referrals, SUM(amount) AS total_commissions, SUM(CASE WHEN status = 'unpaid' AND order_status = 'wc-completed' THEN amount ELSE 0 END) AS unpaid_commissions FROM {$wpdb->prefix}afwc_referrals WHERE affiliate_id = %d AND status != 'rejected'", $affiliate_id ), ARRAY_A ); if ($result) { $stats['total_referrals'] = (int) $result['total_referrals']; $stats['total_commissions'] = (float) $result['total_commissions']; $stats['unpaid_commissions'] = (float) $result['unpaid_commissions']; } return $stats; } /** * Add meta boxes to WooCommerce order edit page */ public function add_order_meta_boxes() { add_meta_box( 'simfly_aff_order_meta_box', __('Affiliate Information', 'simfly-affiliates'), array($this, 'render_order_meta_box'), 'shop_order', 'side', 'high' ); } /** * Render order meta box * * @param WP_Post $post Post object */ public function render_order_meta_box($post) { global $wpdb; // Get order referrals $referrals = $wpdb->get_results( $wpdb->prepare( "SELECT r.*, u.display_name FROM {$wpdb->prefix}afwc_referrals r LEFT JOIN {$wpdb->users} u ON r.affiliate_id = u.ID WHERE r.post_id = %d", $post->ID ), ARRAY_A ); if (empty($referrals)) { echo '

' . esc_html__('No affiliate referral for this order.', 'simfly-affiliates') . '

'; return; } foreach ($referrals as $referral) { $status_class = 'simfly-aff-status-' . $referral['status']; $affiliate_name = !empty($referral['display_name']) ? $referral['display_name'] : __('Affiliate #', 'simfly-affiliates') . $referral['affiliate_id']; echo '
'; echo '

' . esc_html__('Affiliate:', 'simfly-affiliates') . ' ' . esc_html($affiliate_name) . '

'; echo '

' . esc_html__('Commission:', 'simfly-affiliates') . ' ' . wc_price($referral['amount']) . '

'; echo '

' . esc_html__('Status:', 'simfly-affiliates') . ' ' . esc_html(ucfirst($referral['status'])) . '

'; echo '

' . esc_html__('Type:', 'simfly-affiliates') . ' ' . esc_html(ucfirst($referral['type'])) . '

'; echo '

' . esc_html__('Date:', 'simfly-affiliates') . ' ' . esc_html(date_i18n(get_option('date_format') . ' ' . get_option('time_format'), strtotime($referral['datetime']))) . '

'; // Add actions echo '
'; if ('unpaid' === $referral['status']) { echo '' . esc_html__('Process Payment', 'simfly-affiliates') . ''; } echo '
'; echo '
'; } } /** * Save order meta box data * * @param int $post_id Post ID * @param WP_Post $post Post object */ public function save_order_meta_box($post_id, $post) { // Skip autosave if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } // Check post type if ('shop_order' !== $post->post_type) { return; } // Check permissions if (!current_user_can('edit_post', $post_id)) { return; } // No data to save in the meta box currently } /** * Register settings */ public function register_settings() { // General settings register_setting('simfly_aff_settings', 'simfly_aff_referral_param'); register_setting('simfly_aff_settings', 'simfly_aff_cookie_duration'); register_setting('simfly_aff_settings', 'simfly_aff_default_commission_status'); register_setting('simfly_aff_settings', 'simfly_aff_manager_email'); // Link & coupon settings register_setting('simfly_aff_settings', 'simfly_aff_use_pretty_links'); register_setting('simfly_aff_settings', 'simfly_aff_allow_custom_identifiers'); register_setting('simfly_aff_settings', 'simfly_aff_use_referral_coupons'); register_setting('simfly_aff_settings', 'simfly_aff_allow_paypal_email'); // Commission tiers register_setting('simfly_aff_settings', 'simfly_aff_commission_tiers'); } /** * AJAX handler for saving settings */ public function ajax_save_settings() { // Check nonce check_ajax_referer('simfly_aff_save_settings', 'security'); // Check permissions if (!current_user_can('manage_options')) { wp_send_json_error(array('message' => __('You do not have permission to do this.', 'simfly-affiliates'))); return; } // Parse form data parse_str($_POST['formdata'], $form_data); // Update general settings update_option('simfly_aff_referral_param', sanitize_text_field($form_data['simfly_aff_referral_param'])); update_option('simfly_aff_cookie_duration', absint($form_data['simfly_aff_cookie_duration'])); update_option('simfly_aff_default_commission_status', sanitize_text_field($form_data['simfly_aff_default_commission_status'])); update_option('simfly_aff_manager_email', sanitize_email($form_data['simfly_aff_manager_email'])); // Update link & coupon settings update_option('simfly_aff_use_pretty_links', isset($form_data['simfly_aff_use_pretty_links']) ? 'yes' : 'no'); update_option('simfly_aff_allow_custom_identifiers', isset($form_data['simfly_aff_allow_custom_identifiers']) ? 'yes' : 'no'); update_option('simfly_aff_use_referral_coupons', isset($form_data['simfly_aff_use_referral_coupons']) ? 'yes' : 'no'); update_option('simfly_aff_allow_paypal_email', isset($form_data['simfly_aff_allow_paypal_email']) ? 'yes' : 'no'); // Update commission tiers if (isset($form_data['simfly_aff_tiers']) && is_array($form_data['simfly_aff_tiers'])) { $tiers = array(); foreach ($form_data['simfly_aff_tiers'] as $tier_key => $tier_data) { $tiers[$tier_key] = array( 'min_sales' => absint($tier_data['min_sales']), 'max_sales' => absint($tier_data['max_sales']), 'commission' => absint($tier_data['commission']), 'discount' => absint($tier_data['discount']) ); } update_option('simfly_aff_commission_tiers', $tiers); } // Flush rewrite rules if pretty links setting changed if (isset($form_data['simfly_aff_use_pretty_links']) !== (get_option('simfly_aff_use_pretty_links', 'yes') === 'yes')) { flush_rewrite_rules(); } wp_send_json_success(array('message' => __('Settings saved successfully!', 'simfly-affiliates'))); } /** * AJAX handler for creating an affiliate */ public function ajax_make_affiliate() { // Check nonce check_ajax_referer('simfly_aff_admin_nonce', 'security'); // Check permissions if (!current_user_can('manage_woocommerce')) { wp_send_json_error(array('message' => __('You do not have permission to do this.', 'simfly-affiliates'))); return; } // Get user ID $user_id = isset($_POST['user_id']) ? absint($_POST['user_id']) : 0; if (!$user_id) { wp_send_json_error(array('message' => __('Invalid user ID.', 'simfly-affiliates'))); return; } // Check if user already is an affiliate if (simfly_aff_is_user_affiliate($user_id)) { wp_send_json_error(array('message' => __('User is already an affiliate.', 'simfly-affiliates'))); return; } // Register user as affiliate $registered = simfly_aff_register_affiliate($user_id); if ($registered) { wp_send_json_success(array('message' => __('User successfully registered as an affiliate.', 'simfly-affiliates'))); } else { wp_send_json_error(array('message' => __('Failed to register user as an affiliate.', 'simfly-affiliates'))); } } }{"id":28705,"date":"2023-02-13T15:07:45","date_gmt":"2023-02-13T15:07:45","guid":{"rendered":"https:\/\/market.simfly.io\/product\/siglufjordur\/"},"modified":"2025-01-13T21:46:22","modified_gmt":"2025-01-13T21:46:22","slug":"siglufjordur","status":"publish","type":"product","link":"https:\/\/market.simfly.io\/product\/siglufjordur\/","title":{"rendered":"Siglufjordur"},"content":{"rendered":"","protected":false},"excerpt":{"rendered":"","protected":false},"featured_media":28704,"template":"","meta":[],"product_brand":[],"product_cat":[86,88],"product_tag":[64],"class_list":{"0":"post-28705","1":"product","2":"type-product","3":"status-publish","4":"has-post-thumbnail","6":"product_cat-airport","7":"product_cat-category-2","8":"product_tag-category-2","10":"first","11":"instock","12":"sale","13":"virtual","14":"sold-individually","15":"purchasable","16":"product-type-simple"},"_links":{"self":[{"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/product\/28705","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/product"}],"about":[{"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/types\/product"}],"version-history":[{"count":0,"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/product\/28705\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/media\/28704"}],"wp:attachment":[{"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/media?parent=28705"}],"wp:term":[{"taxonomy":"product_brand","embeddable":true,"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/product_brand?post=28705"},{"taxonomy":"product_cat","embeddable":true,"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/product_cat?post=28705"},{"taxonomy":"product_tag","embeddable":true,"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/product_tag?post=28705"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}