/**
* 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 '
';
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":41693,"date":"2023-02-13T19:23:33","date_gmt":"2023-02-13T19:23:33","guid":{"rendered":"https:\/\/market.simfly.io\/product\/bagani-airport\/"},"modified":"2025-01-13T22:26:29","modified_gmt":"2025-01-13T22:26:29","slug":"bagani-airport","status":"publish","type":"product","link":"https:\/\/market.simfly.io\/product\/bagani-airport\/","title":{"rendered":"Bagani Airport"},"content":{"rendered":"","protected":false},"excerpt":{"rendered":"","protected":false},"featured_media":41692,"template":"","meta":[],"product_brand":[],"product_cat":[86,87],"product_tag":[62],"class_list":{"0":"post-41693","1":"product","2":"type-product","3":"status-publish","4":"has-post-thumbnail","6":"product_cat-airport","7":"product_cat-category-1","8":"product_tag-category-1","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\/41693","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\/41693\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/media\/41692"}],"wp:attachment":[{"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/media?parent=41693"}],"wp:term":[{"taxonomy":"product_brand","embeddable":true,"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/product_brand?post=41693"},{"taxonomy":"product_cat","embeddable":true,"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/product_cat?post=41693"},{"taxonomy":"product_tag","embeddable":true,"href":"https:\/\/market.simfly.io\/wp-json\/wp\/v2\/product_tag?post=41693"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}