Adding custom "Token" in emails template

Hello there,

I am using hivepress-request and hivepress-marketplace and i dont understand how to add custom tokens.

In my case i need to find the “vendor” username/displayname… that posted an offer.

As i’d like the user who created the request to receive the vendor name (person who applied to request) in the email.

I eventually tried that code to have even debug token but nothing is working :slight_smile:

/**
 * Add custom tokens to HivePress email templates
 * With error logging for debugging
 */
add_filter('hivepress/v1/emails/tokens', function($tokens, $email) {
    // Log all tokens and context for debugging
    error_log('========================= HIVEPRESS EMAIL DEBUG =========================');
    error_log('Email Class: ' . get_class($email));
    error_log('Available Tokens: ' . print_r(array_keys($tokens), true));
    
    // Log the email context
    if (isset($email->context) && is_array($email->context)) {
        error_log('Email Context Keys: ' . print_r(array_keys($email->context), true));
        
        foreach ($email->context as $key => $value) {
            if (is_object($value)) {
                error_log('Context Object [' . $key . ']: ' . get_class($value));
                
                // Try to extract more information if it has common methods
                if (method_exists($value, 'get_id')) {
                    error_log('  - ID: ' . $value->get_id());
                }
                
                if (method_exists($value, 'get_user__id')) {
                    error_log('  - User ID: ' . $value->get_user__id());
                }
                
                if (method_exists($value, 'get_vendor__id')) {
                    error_log('  - Vendor ID: ' . $value->get_vendor__id());
                }
            } else {
                $val_str = is_array($value) ? json_encode($value) : (string)$value;
                error_log('Context Value [' . $key . ']: ' . substr($val_str, 0, 100));
            }
        }
    }
    
    // Get the vendor object if available in email context
    $vendor = null;
    
    // 1. Direct vendor context
    if (isset($email->context['vendor'])) {
        $vendor = $email->context['vendor'];
        error_log('Vendor found directly in context');
    }
    // 2. Check vendor_id in context
    elseif (isset($email->context['vendor_id'])) {
        $vendor_id = $email->context['vendor_id'];
        // Get vendor by ID
        $vendor = \HivePress\Models\Vendor::query()->get_by_id($vendor_id);
        error_log('Vendor found from vendor_id: ' . $vendor_id);
    }
    // 3. Try to get from offer if it exists
    elseif (isset($email->context['offer']) && method_exists($email->context['offer'], 'get_user__id')) {
        $user_id = $email->context['offer']->get_user__id();
        error_log('Trying to get vendor from offer user ID: ' . $user_id);
        
        // Try to get vendor by user ID
        $vendor = \HivePress\Models\Vendor::query()->filter(['user' => $user_id])->get_first();
        
        if ($vendor) {
            error_log('Vendor found from offer');
        }
    }
    // 4. Try to get from request if it exists
    elseif (isset($email->context['request'])) {
        $request = $email->context['request'];
        error_log('Request found in context - trying to extract vendor');
        
        // Try different approaches to get vendor info from request
        if (method_exists($request, 'get_user__id')) {
            $user_id = $request->get_user__id();
            error_log('Request User ID: ' . $user_id);
            
            // Check if this user is a vendor
            $vendor = \HivePress\Models\Vendor::query()->filter(['user' => $user_id])->get_first();
            
            if ($vendor) {
                error_log('Vendor found from request user');
            }
        }
    }
    
    // If we have a vendor object, add custom tokens
    if ($vendor) {
        // Get user ID associated with vendor
        $user_id = $vendor->get_user__id();
        error_log('Processing vendor with user ID: ' . $user_id);
        
        if ($user_id) {
            // Get user object
            $user = get_user_by('ID', $user_id);
            
            if ($user) {
                // Add custom tokens
                $tokens['vendor_username'] = $user->user_login;
                $tokens['vendor_display_name'] = $user->display_name;
                $tokens['vendor_first_name'] = $user->first_name;
                $tokens['vendor_last_name'] = $user->last_name;
                $tokens['vendor_email'] = $user->user_email;
                
                error_log('Added vendor tokens: ' . print_r([
                    'vendor_username' => $user->user_login,
                    'vendor_display_name' => $user->display_name,
                    'vendor_first_name' => $user->first_name,
                    'vendor_last_name' => $user->last_name,
                    'vendor_email' => $user->user_email,
                ], true));
            }
        }
    } else {
        error_log('No vendor found in email context');
    }
    
    error_log('=======================================================================');
    
    return $tokens;
}, 10, 2);

/**
 * Debug each email specifically by type for tracking
 */
add_filter('hivepress/v1/emails/order_received', function($args) {
    error_log('DEBUG - order_received email is being processed');
    error_log('Available tokens: ' . print_r(array_keys($args['tokens']), true));
    
    // Try to add vendor info if available
    if (isset($args['tokens']['vendor_id'])) {
        $vendor_id = $args['tokens']['vendor_id'];
        error_log('Vendor ID found in tokens: ' . $vendor_id);
        
        // Get vendor
        $vendor = \HivePress\Models\Vendor::query()->get_by_id($vendor_id);
        
        if ($vendor) {
            error_log('Vendor found from vendor_id token');
            
            // Get user ID
            $user_id = $vendor->get_user__id();
            
            if ($user_id) {
                $user = get_user_by('ID', $user_id);
                
                if ($user) {
                    // Add custom tokens
                    $args['tokens']['vendor_username'] = $user->user_login;
                    $args['tokens']['vendor_display_name'] = $user->display_name;
                    $args['tokens']['vendor_first_name'] = $user->first_name;
                    $args['tokens']['vendor_last_name'] = $user->last_name;
                    $args['tokens']['vendor_email'] = $user->user_email;
                    
                    error_log('Added vendor tokens to order_received email');
                }
            }
        }
    }
    
    return $args;
}, 1000);

add_filter('hivepress/v1/emails/order_completed', function($args) {
    error_log('DEBUG - order_completed email is being processed');
    error_log('Available tokens: ' . print_r(array_keys($args['tokens']), true));
    
    // Try to add vendor info if available (same logic as above)
    if (isset($args['tokens']['vendor_id'])) {
        $vendor_id = $args['tokens']['vendor_id'];
        error_log('Vendor ID found in tokens: ' . $vendor_id);
        
        // Get vendor
        $vendor = \HivePress\Models\Vendor::query()->get_by_id($vendor_id);
        
        if ($vendor) {
            error_log('Vendor found from vendor_id token');
            
            // Get user ID
            $user_id = $vendor->get_user__id();
            
            if ($user_id) {
                $user = get_user_by('ID', $user_id);
                
                if ($user) {
                    // Add custom tokens
                    $args['tokens']['vendor_username'] = $user->user_login;
                    $args['tokens']['vendor_display_name'] = $user->display_name;
                    $args['tokens']['vendor_first_name'] = $user->first_name;
                    $args['tokens']['vendor_last_name'] = $user->last_name;
                    $args['tokens']['vendor_email'] = $user->user_email;
                    
                    error_log('Added vendor tokens to order_completed email');
                }
            }
        }
    }
    
    return $args;
}, 1000);

/**
 * Debug offer-related emails
 */
add_filter('hivepress/v1/emails/offer_accepted', function($args) {
    error_log('DEBUG - offer_accepted email is being processed');
    error_log('Available tokens: ' . print_r(array_keys($args['tokens']), true));
    return $args;
}, 1000);

add_filter('hivepress/v1/emails/offer_rejected', function($args) {
    error_log('DEBUG - offer_rejected email is being processed');
    error_log('Available tokens: ' . print_r(array_keys($args['tokens']), true));
    return $args;
}, 1000);

add_filter('hivepress/v1/emails/offer_received', function($args) {
    error_log('DEBUG - offer_received email is being processed');
    error_log('Available tokens: ' . print_r(array_keys($args['tokens']), true));
    return $args;
}, 1000);

Thanks for your help :slight_smile:

lolo

I actually found a workaround building these two snippets :

/**
 * Add custom tokens to HivePress email templates for vendor information
 * This uses the same logic we've discovered works, but implemented as proper tokens
 */
add_filter('hivepress/v1/emails/tokens', function($tokens, $email) {
    // Store original tokens for reference
    $original_tokens = $tokens;
    
    // Check if the email content contains the URL pattern
    $email_content = '';
    if (isset($email->body)) {
        $email_content = $email->body;
    } elseif (isset($email->message)) {
        $email_content = $email->message;
    }
    
    // Try to get the request ID from the email content
    $request_id = 0;
    
    // Check if we have a request_id or listing in the context
    if (isset($email->context['request_id'])) {
        $request_id = $email->context['request_id'];
    } elseif (isset($email->context['request']) && method_exists($email->context['request'], 'get_id')) {
        $request_id = $email->context['request']->get_id();
    } elseif (isset($email->context['listing']) && method_exists($email->context['listing'], 'get_id')) {
        $request_id = $email->context['listing']->get_id();
    }
    
    // If we don't have a request ID, try to extract it from the content
    if (!$request_id && !empty($email_content)) {
        // Look for URLs with request slug
        if (preg_match('/\/request\/([^\/\#\?]+)/', $email_content, $slug_matches)) {
            $request_slug = $slug_matches[1];
            
            // Get request ID from slug
            global $wpdb;
            $request_id = $wpdb->get_var($wpdb->prepare(
                "SELECT ID FROM {$wpdb->posts} WHERE post_name = %s AND post_type = 'hp_request'",
                $request_slug
            ));
        }
    }
    
    // If we have a request ID, get the most recent offer
    if ($request_id) {
        // Get the most recent offer for this request
        global $wpdb;
        $offer_data = $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM {$wpdb->comments} 
            WHERE comment_post_ID = %d 
            AND comment_type = 'hp_offer'
            ORDER BY comment_date DESC
            LIMIT 1",
            $request_id
        ));
        
        if ($offer_data) {
            $offer_user_id = $offer_data->user_id;
            
            // Get user info
            $user = get_user_by('ID', $offer_user_id);
            if ($user) {
                // Add tokens for the vendor user
                $tokens['vendor_username'] = $user->user_login;
                $tokens['vendor_display_name'] = $user->display_name;
                $tokens['vendor_first_name'] = $user->first_name;
                $tokens['vendor_last_name'] = $user->last_name;
                $tokens['vendor_email'] = $user->user_email;
                
                // Also add token for the user ID
                $tokens['vendor_user_id'] = $offer_user_id;
                
                // Try to get the vendor entity if available
                $vendor = false;
                
                // Use direct database query for better performance
                $vendor_id = $wpdb->get_var($wpdb->prepare(
                    "SELECT ID FROM {$wpdb->posts} p
                    JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
                    WHERE p.post_type = 'hp_vendor'
                    AND pm.meta_key = 'hp_user'
                    AND pm.meta_value = %d
                    LIMIT 1",
                    $offer_user_id
                ));
                
                if ($vendor_id) {
                    $tokens['vendor_id'] = $vendor_id;
                    $tokens['vendor_url'] = get_permalink($vendor_id);
                }
            }
        }
    }
    
    return $tokens;
}, 10, 2);

/**
 * Fix the offer received email to include vendor tokens
 */
add_filter('hivepress/v1/emails/offer_received', function($args) {
    // Try to get the offer user ID and request ID
    if (isset($args['context']['offer'])) {
        $offer = $args['context']['offer'];
        
        if (method_exists($offer, 'get_user__id')) {
            $offer_user_id = $offer->get_user__id();
            
            // Get user info
            $user = get_user_by('ID', $offer_user_id);
            if ($user) {
                // Add tokens for the vendor user
                $args['tokens']['vendor_username'] = $user->user_login;
                $args['tokens']['vendor_display_name'] = $user->display_name;
                $args['tokens']['vendor_first_name'] = $user->first_name;
                $args['tokens']['vendor_last_name'] = $user->last_name;
                $args['tokens']['vendor_email'] = $user->user_email;
            }
        }
    }
    
    return $args;
}, 10, 1);

/**
 * Apply the same fix to offer emails
 */
add_filter('hivepress/v1/emails/offer_accepted', function($args) {
    return apply_filters('hivepress/v1/emails/offer_received', $args);
}, 10, 1);

add_filter('hivepress/v1/emails/offer_rejected', function($args) {
    return apply_filters('hivepress/v1/emails/offer_received', $args);
}, 10, 1);

You can setup these shortcodes :

%vendor_username% - The vendor’s username
%vendor_display_name% - The vendor’s display name
%vendor_first_name% - The vendor’s first name
%vendor_last_name% - The vendor’s last name
%vendor_email% - The vendor’s email address
%vendor_id% - The vendor’s ID (if available)
%vendor_url% - The URL to the vendor’s profile (if available)

But you also need that snippet :

/**
 * Direct token replacement in HivePress email content
 * This bypasses the HivePress token system completely
 */
add_filter('wp_mail', function($args) {
    // Only process emails with specific subjects (HivePress marketplace emails)
    $subject_patterns = [
        'offre', 'offer', 'projet', 'request', 'proposition'
    ];
    
    $should_process = false;
    foreach ($subject_patterns as $pattern) {
        if (stripos($args['subject'], $pattern) !== false) {
            $should_process = true;
            break;
        }
    }
    
    if (!$should_process) {
        return $args;
    }
    
    // Get current email content
    $content = $args['message'];
    
    // Look for vendor tokens in the content
    $has_tokens = false;
    $token_patterns = [
        '%vendor_username%',
        '%vendor_display_name%',
        '%vendor_first_name%',
        '%vendor_last_name%',
        '%vendor_email%',
        '%vendor_id%',
        '%vendor_url%'
    ];
    
    foreach ($token_patterns as $token) {
        if (strpos($content, $token) !== false) {
            $has_tokens = true;
            break;
        }
    }
    
    // Only continue if we found tokens
    if (!$has_tokens) {
        return $args;
    }
    
    // Get request ID from the email content
    $request_id = 0;
    
    // Look for https://www.mysmartisan.com/request/something/#offers
    if (preg_match('/(https?:\/\/[^\s"\'<>]+\/request\/[^\s"\'<>]+\/?\#offers)/', $content, $matches)) {
        $offer_url = $matches[1];
        
        // Extract the request slug from the URL
        if (preg_match('/\/request\/([^\/\#\?]+)/', $offer_url, $slug_matches)) {
            $request_slug = $slug_matches[1];
            
            // Get request ID from slug
            global $wpdb;
            $request_id = $wpdb->get_var($wpdb->prepare(
                "SELECT ID FROM {$wpdb->posts} WHERE post_name = %s AND post_type = 'hp_request'",
                $request_slug
            ));
        }
    }
    
    // Get offer data for this request
    $vendor_data = [];
    if ($request_id) {
        global $wpdb;
        $offer_data = $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM {$wpdb->comments} 
            WHERE comment_post_ID = %d 
            AND comment_type = 'hp_offer'
            ORDER BY comment_date DESC
            LIMIT 1",
            $request_id
        ));
        
        if ($offer_data) {
            $offer_user_id = $offer_data->user_id;
            
            // Get user info
            $user = get_user_by('ID', $offer_user_id);
            if ($user) {
                $vendor_data = [
                    'vendor_username' => $user->user_login,
                    'vendor_display_name' => $user->display_name,
                    'vendor_first_name' => $user->first_name,
                    'vendor_last_name' => $user->last_name,
                    'vendor_email' => $user->user_email,
                    'vendor_id' => '',
                    'vendor_url' => ''
                ];
                
                // Try to get the vendor entity if available
                $vendor_id = $wpdb->get_var($wpdb->prepare(
                    "SELECT ID FROM {$wpdb->posts} p
                    JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
                    WHERE p.post_type = 'hp_vendor'
                    AND pm.meta_key = 'hp_user'
                    AND pm.meta_value = %d
                    LIMIT 1",
                    $offer_user_id
                ));
                
                if ($vendor_id) {
                    $vendor_data['vendor_id'] = $vendor_id;
                    $vendor_data['vendor_url'] = get_permalink($vendor_id);
                }
            }
        }
    }
    
    // Replace tokens in the content if we have vendor data
    if (!empty($vendor_data)) {
        foreach ($token_patterns as $token) {
            $token_name = str_replace(['%', '%'], '', $token);
            if (isset($vendor_data[$token_name])) {
                $content = str_replace($token, $vendor_data[$token_name], $content);
            }
        }
        
        $args['message'] = $content;
    }
    
    return $args;
}, 999);

That works for me

lolo

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.