File: /var/www/html/wp-content/themes/thegem-elementor/inc/ethnic-home-hero.php
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! function_exists( 'ethnic_home_hero_should_render' ) ) {
function ethnic_home_hero_should_render() {
return ! is_admin() && is_front_page();
}
}
if ( ! function_exists( 'ethnic_home_hero_target_page_id' ) ) {
function ethnic_home_hero_target_page_id() {
$page_id = (int) get_option( 'page_on_front' );
if ( ! $page_id ) {
$page_id = (int) get_queried_object_id();
}
return $page_id;
}
}
if ( ! function_exists( 'ethnic_home_hero_enqueue_assets' ) ) {
function ethnic_home_hero_enqueue_assets() {
if ( ! ethnic_home_hero_should_render() ) {
return;
}
$css_relative_path = '/css/ethnic-home-hero.css';
$js_relative_path = '/js/ethnic-home-hero.js';
$css_path = THEGEM_THEME_PATH . $css_relative_path;
$js_path = THEGEM_THEME_PATH . $js_relative_path;
wp_enqueue_style(
'ethnic-home-hero',
THEGEM_THEME_URI . $css_relative_path,
array(),
file_exists( $css_path ) ? filemtime( $css_path ) : THEGEM_THEME_VERSION
);
wp_enqueue_script(
'ethnic-home-hero',
THEGEM_THEME_URI . $js_relative_path,
array(),
file_exists( $js_path ) ? filemtime( $js_path ) : THEGEM_THEME_VERSION,
true
);
wp_enqueue_script(
'ethnic-homepage-review-widget',
'https://grwapi.net/widget.min.js',
array(),
null,
true
);
wp_script_add_data( 'ethnic-homepage-review-widget', 'async', true );
}
add_action( 'wp_enqueue_scripts', 'ethnic_home_hero_enqueue_assets', 30 );
}
if ( ! function_exists( 'ethnic_global_light_enqueue_assets' ) ) {
function ethnic_global_light_enqueue_assets() {
if ( is_admin() ) {
return;
}
$css_relative_path = '/css/ethnic-global-light.css';
$js_relative_path = '/js/ethnic-global-light.js';
$css_path = THEGEM_THEME_PATH . $css_relative_path;
$js_path = THEGEM_THEME_PATH . $js_relative_path;
wp_enqueue_style(
'ethnic-global-light',
THEGEM_THEME_URI . $css_relative_path,
array(),
file_exists( $css_path ) ? filemtime( $css_path ) : THEGEM_THEME_VERSION
);
wp_enqueue_script(
'ethnic-global-light',
THEGEM_THEME_URI . $js_relative_path,
array(),
file_exists( $js_path ) ? filemtime( $js_path ) : THEGEM_THEME_VERSION,
true
);
}
add_action( 'wp_enqueue_scripts', 'ethnic_global_light_enqueue_assets', 999 );
}
if ( ! function_exists( 'ethnic_homepage_meta_title' ) ) {
function ethnic_homepage_meta_title() {
return 'Ecommerce Development Company India - Ethnic Infotech';
}
}
if ( ! function_exists( 'ethnic_homepage_meta_description' ) ) {
function ethnic_homepage_meta_description() {
return 'Ethnic Infotech builds Shopify Plus, Adobe Commerce, and Headless Commerce stores for growing brands. India-based ecommerce specialist. International clients across Singapore, UK, and Australia.';
}
}
if ( ! function_exists( 'ethnic_homepage_og_description' ) ) {
function ethnic_homepage_og_description() {
return 'Shopify Plus, Adobe Commerce, and Headless Commerce specialists. Real international clients. Direct team, kickoff to launch.';
}
}
if ( ! function_exists( 'ethnic_homepage_canonical_url' ) ) {
function ethnic_homepage_canonical_url() {
return 'https://www.ethnicinfotech.com/';
}
}
if ( ! function_exists( 'ethnic_homepage_same_as_links' ) ) {
function ethnic_homepage_same_as_links() {
$links = apply_filters(
'ethnic_homepage_same_as_links',
array(
'https://www.linkedin.com/company/ethnic-infotech',
)
);
return array_values(
array_filter(
array_map(
static function ( $link ) {
$link = trim( (string) $link );
return '' !== $link ? esc_url_raw( $link ) : '';
},
is_array( $links ) ? $links : array()
)
)
);
}
}
if ( ! function_exists( 'ethnic_homepage_logo_alt_text' ) ) {
function ethnic_homepage_logo_alt_text() {
return 'Ethnic Infotech — Ecommerce Development Company India';
}
}
if ( ! function_exists( 'ethnic_homepage_filter_logo_html' ) ) {
function ethnic_homepage_filter_logo_html( $logo_html, $url = '', $width = 0, $class = '' ) {
if ( ! ethnic_home_hero_should_render() || '' === trim( (string) $logo_html ) ) {
return $logo_html;
}
$alt = esc_attr( ethnic_homepage_logo_alt_text() );
if ( preg_match( '/\salt="[^"]*"/', $logo_html ) ) {
return (string) preg_replace( '/\salt="[^"]*"/', ' alt="' . $alt . '"', $logo_html, 1 );
}
return (string) preg_replace( '/\/>$/', ' alt="' . $alt . '"/>', $logo_html, 1 );
}
add_filter( 'thegem_get_logo_img', 'ethnic_homepage_filter_logo_html', 10, 4 );
}
if ( ! function_exists( 'ethnic_homepage_cleanup_wp_head' ) ) {
function ethnic_homepage_cleanup_wp_head() {
if ( ! ethnic_home_hero_should_render() ) {
return;
}
remove_action( 'wp_head', 'rel_canonical' );
remove_action( 'wp_head', 'thegem_open_graph', 9999 );
}
add_action( 'wp', 'ethnic_homepage_cleanup_wp_head', 5 );
}
if ( ! function_exists( 'ethnic_homepage_document_title' ) ) {
function ethnic_homepage_document_title( $title ) {
if ( ! ethnic_home_hero_should_render() ) {
return $title;
}
return ethnic_homepage_meta_title();
}
add_filter( 'pre_get_document_title', 'ethnic_homepage_document_title', 50 );
}
if ( ! function_exists( 'ethnic_homepage_output_head_meta' ) ) {
function ethnic_homepage_output_head_meta() {
if ( ! ethnic_home_hero_should_render() ) {
return;
}
$organization_graph = array(
'@context' => 'https://schema.org',
'@type' => 'Organization',
'name' => 'Ethnic Infotech',
'url' => 'https://www.ethnicinfotech.com',
'logo' => 'https://www.ethnicinfotech.com/images/ethnic-infotech-logo.png',
'foundingDate' => '2021',
'description' => 'India-based ecommerce development company specialising in Shopify Plus, Adobe Commerce, and headless commerce builds for brands in India and internationally.',
'areaServed' => array( 'IN', 'US', 'GB', 'AU', 'SG' ),
'knowsAbout' => array(
'Headless Commerce',
'Shopify Plus Development',
'Adobe Commerce Development',
'GraphCommerce',
'Ecommerce Replatforming',
'Shopify Hydrogen',
),
'contactPoint' => array(
'@type' => 'ContactPoint',
'contactType' => 'sales',
'url' => 'https://www.ethnicinfotech.com/contact',
),
);
$same_as_links = ethnic_homepage_same_as_links();
if ( ! empty( $same_as_links ) ) {
$organization_graph['sameAs'] = $same_as_links;
}
$website_graph = array(
'@context' => 'https://schema.org',
'@type' => 'WebSite',
'name' => 'Ethnic Infotech',
'url' => 'https://www.ethnicinfotech.com',
);
?>
<meta name="description" content="<?php echo esc_attr( ethnic_homepage_meta_description() ); ?>" />
<meta property="og:title" content="<?php echo esc_attr( ethnic_homepage_meta_title() ); ?>" />
<meta property="og:description" content="<?php echo esc_attr( ethnic_homepage_og_description() ); ?>" />
<link rel="canonical" href="<?php echo esc_url( ethnic_homepage_canonical_url() ); ?>" />
<script type="application/ld+json"><?php echo wp_json_encode( $organization_graph, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); ?></script>
<script type="application/ld+json"><?php echo wp_json_encode( $website_graph, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); ?></script>
<?php
}
add_action( 'wp_head', 'ethnic_homepage_output_head_meta', 8 );
}
if ( ! function_exists( 'ethnic_homepage_contact_form_markup' ) ) {
function ethnic_homepage_contact_form_markup() {
if ( shortcode_exists( 'contact-form-7' ) ) {
return do_shortcode( '[contact-form-7 id="26259"]' );
}
return sprintf(
'<div class="ethnic-homepage__form-fallback"><p>Our contact form is temporarily unavailable. Please use the contact page while we reconnect it.</p><a class="ethnic-homepage__button ethnic-homepage__button--primary" href="%s">Start Your Build</a></div>',
esc_url( home_url( '/contact/' ) )
);
}
}
if ( ! function_exists( 'ethnic_homepage_review_widget_script_tag' ) ) {
function ethnic_homepage_review_widget_script_tag( $tag, $handle, $src ) {
if ( 'ethnic-homepage-review-widget' !== $handle ) {
return $tag;
}
return sprintf(
"<script type=\"text/javascript\" src=\"%s\" async id=\"%s-js\"></script>\n",
esc_url( $src ),
esc_attr( $handle )
);
}
add_filter( 'script_loader_tag', 'ethnic_homepage_review_widget_script_tag', 10, 3 );
}
if ( ! function_exists( 'ethnic_testimonial_review_source_logo_meta_key' ) ) {
function ethnic_testimonial_review_source_logo_meta_key() {
return '_ethnic_testimonial_review_source_logo_id';
}
}
if ( ! function_exists( 'ethnic_testimonial_get_review_source_logo_id' ) ) {
function ethnic_testimonial_get_review_source_logo_id( $testimonial_id ) {
return absint( get_post_meta( $testimonial_id, ethnic_testimonial_review_source_logo_meta_key(), true ) );
}
}
if ( ! function_exists( 'ethnic_testimonial_add_review_source_logo_meta_box' ) ) {
function ethnic_testimonial_add_review_source_logo_meta_box() {
add_meta_box(
'ethnic_testimonial_review_source_logo',
__( 'Review Source Logo', 'thegem' ),
'ethnic_testimonial_render_review_source_logo_meta_box',
'thegem_testimonial',
'side',
'default'
);
}
add_action( 'add_meta_boxes_thegem_testimonial', 'ethnic_testimonial_add_review_source_logo_meta_box' );
}
if ( ! function_exists( 'ethnic_testimonial_render_review_source_logo_meta_box' ) ) {
function ethnic_testimonial_render_review_source_logo_meta_box( $post ) {
$logo_id = ethnic_testimonial_get_review_source_logo_id( $post->ID );
$preview_image = $logo_id ? wp_get_attachment_image( $logo_id, 'medium', false, array( 'style' => 'display:block;max-width:100%;height:auto;' ) ) : '';
?>
<p><?php esc_html_e( 'Upload the platform logo shown with this testimonial on the homepage, such as Google, Clutch, or Upwork.', 'thegem' ); ?></p>
<?php wp_nonce_field( 'ethnic_testimonial_review_source_logo', 'ethnic_testimonial_review_source_logo_nonce' ); ?>
<input type="hidden" id="ethnic-testimonial-review-source-logo-id" name="ethnic_testimonial_review_source_logo_id" value="<?php echo esc_attr( $logo_id ); ?>" />
<div class="ethnic-testimonial-review-source-logo-preview" id="ethnic-testimonial-review-source-logo-preview">
<?php if ( $preview_image ) : ?>
<?php echo wp_kses_post( $preview_image ); ?>
<?php else : ?>
<span class="ethnic-testimonial-review-source-logo-placeholder"><?php esc_html_e( 'No logo selected yet.', 'thegem' ); ?></span>
<?php endif; ?>
</div>
<p class="howto"><?php esc_html_e( 'This replaces the homepage "Verified Review" badge for this testimonial.', 'thegem' ); ?></p>
<p>
<button type="button" class="button button-secondary" id="ethnic-testimonial-review-source-logo-upload">
<?php echo esc_html( $logo_id ? __( 'Replace logo', 'thegem' ) : __( 'Upload logo', 'thegem' ) ); ?>
</button>
<button type="button" class="button-link-delete" id="ethnic-testimonial-review-source-logo-remove" <?php echo $logo_id ? '' : 'hidden'; ?>>
<?php esc_html_e( 'Remove logo', 'thegem' ); ?>
</button>
</p>
<?php
}
}
if ( ! function_exists( 'ethnic_testimonial_save_review_source_logo_meta_box' ) ) {
function ethnic_testimonial_save_review_source_logo_meta_box( $post_id ) {
if ( wp_is_post_revision( $post_id ) || wp_is_post_autosave( $post_id ) ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
$nonce = isset( $_POST['ethnic_testimonial_review_source_logo_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['ethnic_testimonial_review_source_logo_nonce'] ) ) : '';
if ( ! wp_verify_nonce( $nonce, 'ethnic_testimonial_review_source_logo' ) ) {
return;
}
$logo_id = isset( $_POST['ethnic_testimonial_review_source_logo_id'] ) ? absint( wp_unslash( $_POST['ethnic_testimonial_review_source_logo_id'] ) ) : 0;
if ( $logo_id > 0 ) {
update_post_meta( $post_id, ethnic_testimonial_review_source_logo_meta_key(), $logo_id );
} else {
delete_post_meta( $post_id, ethnic_testimonial_review_source_logo_meta_key() );
}
}
add_action( 'save_post_thegem_testimonial', 'ethnic_testimonial_save_review_source_logo_meta_box' );
}
if ( ! function_exists( 'ethnic_testimonial_enqueue_review_source_logo_admin_assets' ) ) {
function ethnic_testimonial_enqueue_review_source_logo_admin_assets( $hook_suffix ) {
if ( ! in_array( $hook_suffix, array( 'post.php', 'post-new.php' ), true ) ) {
return;
}
$screen = get_current_screen();
if ( ! $screen || 'thegem_testimonial' !== $screen->post_type ) {
return;
}
wp_enqueue_media();
wp_enqueue_script( 'jquery' );
wp_register_style( 'ethnic-testimonial-review-source-logo-admin', false );
wp_enqueue_style( 'ethnic-testimonial-review-source-logo-admin' );
wp_add_inline_style(
'ethnic-testimonial-review-source-logo-admin',
'.ethnic-testimonial-review-source-logo-preview{display:flex;align-items:center;justify-content:center;min-height:88px;margin:12px 0;padding:12px;border:1px dashed #cbd5e1;border-radius:14px;background:#f8fafc}.ethnic-testimonial-review-source-logo-preview img{display:block;max-width:100%;max-height:54px;width:auto;height:auto;object-fit:contain}.ethnic-testimonial-review-source-logo-placeholder{color:#64748b;font-size:13px;text-align:center}#ethnic-testimonial-review-source-logo-remove[hidden]{display:none!important}#ethnic-testimonial-review-source-logo-remove{margin-left:12px}'
);
wp_add_inline_script(
'jquery',
'jQuery(function($){var $field=$("#ethnic-testimonial-review-source-logo-id");var $preview=$("#ethnic-testimonial-review-source-logo-preview");var $upload=$("#ethnic-testimonial-review-source-logo-upload");var $remove=$("#ethnic-testimonial-review-source-logo-remove");if(!$field.length||!$preview.length||!$upload.length||!$remove.length||typeof wp==="undefined"||!wp.media){return;}var labels=' . wp_json_encode(
array(
'frameTitle' => __( 'Select review source logo', 'thegem' ),
'frameButton' => __( 'Use this logo', 'thegem' ),
'noLogo' => __( 'No logo selected yet.', 'thegem' ),
'uploadLabel' => __( 'Upload logo', 'thegem' ),
'replaceLabel' => __( 'Replace logo', 'thegem' ),
)
) . ';var frame;function escapeHtml(value){return $("<div>").text(value||"").html();}function updateButtons(){var hasLogo=!!$field.val();$remove.prop("hidden",!hasLogo);$upload.text(hasLogo?labels.replaceLabel:labels.uploadLabel);}function showPlaceholder(){$preview.html("<span class=\"ethnic-testimonial-review-source-logo-placeholder\">"+escapeHtml(labels.noLogo)+"</span>");updateButtons();}function renderPreview(attachment){var previewUrl=attachment.url;if(attachment.sizes){if(attachment.sizes.medium){previewUrl=attachment.sizes.medium.url;}else if(attachment.sizes.thumbnail){previewUrl=attachment.sizes.thumbnail.url;}}$preview.html("<img src=\""+escapeHtml(previewUrl)+"\" alt=\""+escapeHtml(attachment.alt||"")+"\">");updateButtons();}$upload.on("click",function(event){event.preventDefault();if(frame){frame.open();return;}frame=wp.media({title:labels.frameTitle,button:{text:labels.frameButton},library:{type:"image"},multiple:false});frame.on("select",function(){var attachment=frame.state().get("selection").first().toJSON();$field.val(attachment.id||"");renderPreview(attachment);});frame.open();});$remove.on("click",function(event){event.preventDefault();$field.val("");showPlaceholder();});updateButtons();});',
'after'
);
}
add_action( 'admin_enqueue_scripts', 'ethnic_testimonial_enqueue_review_source_logo_admin_assets' );
}
if ( ! function_exists( 'ethnic_homepage_static_testimonials' ) ) {
function ethnic_homepage_static_testimonials() {
return array(
array(
'name' => 'Joseph',
'role' => 'CEO, Founder - Fusion5',
'quote' => 'Before working with us, their team faced challenges finding a high-quality software partner. After launch, customer churn reduced, support efficiency improved, and user engagement increased significantly.',
'company' => 'Fusion5',
'accent' => '#2563eb',
),
array(
'name' => 'Jameson Chow',
'role' => 'Manager - MicaLighting',
'quote' => 'Our team was able to streamline internal operations and complete the project efficiently. The final solution improved visibility, communication, and day-to-day coordination.',
'company' => 'MicaLighting',
'accent' => '#0ea5a4',
),
array(
'name' => 'Sarah Mitchell',
'role' => 'Product Head - BlueHira',
'quote' => 'The team delivered a well-structured product with strong technical understanding and clear communication. The outcome helped us move faster and serve customers better.',
'company' => 'BlueHira',
'accent' => '#7c3aed',
),
array(
'name' => 'Daniel Morris',
'role' => 'Operations Director - Blue lagoon',
'quote' => 'From planning to execution, the collaboration was smooth and transparent. The delivered platform improved workflow efficiency and gave our operations team better control.',
'company' => 'Blue lagoon',
'accent' => '#f59e0b',
),
array(
'name' => 'Emily Carter',
'role' => 'Founder - Goodbac',
'quote' => 'The solution was thoughtfully designed and aligned perfectly with our business goals. It improved user trust, performance, and our ability to scale confidently.',
'company' => 'Goodbac',
'accent' => '#ec4899',
),
);
}
}
if ( ! function_exists( 'ethnic_homepage_get_testimonials' ) ) {
function ethnic_homepage_get_testimonials() {
$fallback_testimonials = ethnic_homepage_static_testimonials();
if ( ! post_type_exists( 'thegem_testimonial' ) ) {
return $fallback_testimonials;
}
$accent_palette = array( '#2563eb', '#0ea5a4', '#7c3aed', '#f59e0b', '#ec4899', '#1d4ed8', '#0f766e' );
$testimonial_set_slugs = apply_filters( 'ethnic_home_testimonial_set_slugs', array() );
$query_args = array(
'post_type' => 'thegem_testimonial',
'post_status' => 'publish',
'posts_per_page' => (int) apply_filters( 'ethnic_home_testimonials_limit', 5 ),
'orderby' => array(
'menu_order' => 'ASC',
'date' => 'DESC',
),
'ignore_sticky_posts' => true,
'no_found_rows' => true,
);
if ( ! empty( $testimonial_set_slugs ) ) {
$query_args['tax_query'] = array(
array(
'taxonomy' => 'thegem_testimonials_sets',
'field' => 'slug',
'terms' => array_values( array_filter( array_map( 'sanitize_title', (array) $testimonial_set_slugs ) ) ),
),
);
}
$testimonial_query = new WP_Query( $query_args );
if ( ! $testimonial_query->have_posts() ) {
return $fallback_testimonials;
}
$testimonials = array();
while ( $testimonial_query->have_posts() ) {
$testimonial_query->the_post();
$testimonial_id = (int) get_the_ID();
$testimonial_meta = get_post_meta( $testimonial_id, 'thegem_testimonial_data', true );
$testimonial_meta = is_array( $testimonial_meta ) ? $testimonial_meta : array();
$name = trim( (string) ( $testimonial_meta['name'] ?? get_post_meta( $testimonial_id, 'thegem_testimonial_name', true ) ) );
$company = trim( (string) ( $testimonial_meta['company'] ?? get_post_meta( $testimonial_id, 'thegem_testimonial_company', true ) ) );
$position = trim( (string) ( $testimonial_meta['position'] ?? get_post_meta( $testimonial_id, 'thegem_testimonial_position', true ) ) );
$source_logo_id = ethnic_testimonial_get_review_source_logo_id( $testimonial_id );
$quote_source = (string) get_post_field( 'post_content', $testimonial_id );
$quote = trim( preg_replace( '/\s+/u', ' ', wp_strip_all_tags( strip_shortcodes( $quote_source ) ) ) );
if ( '' === $name ) {
$name = trim( (string) get_the_title( $testimonial_id ) );
}
if ( '' === $quote && has_excerpt( $testimonial_id ) ) {
$quote = trim( preg_replace( '/\s+/u', ' ', wp_strip_all_tags( get_the_excerpt( $testimonial_id ) ) ) );
}
if ( '' === $name || '' === $quote ) {
continue;
}
$role = implode(
' - ',
array_values(
array_filter(
array(
$position,
$company,
),
static function ( $value ) {
return '' !== trim( (string) $value );
}
)
)
);
$testimonials[] = array(
'name' => $name,
'position' => $position,
'role' => $role,
'quote' => $quote,
'company' => $company,
'source_logo_id' => $source_logo_id,
'accent' => $accent_palette[ count( $testimonials ) % count( $accent_palette ) ],
);
}
wp_reset_postdata();
return ! empty( $testimonials ) ? $testimonials : $fallback_testimonials;
}
}
if ( ! function_exists( 'ethnic_home_hero_markup' ) ) {
function ethnic_home_hero_markup() {
$works_url = function_exists( 'ethnic_case_studies_archive_url' ) ? ethnic_case_studies_archive_url() : home_url( '/case-studies/' );
$contact_url = home_url( '/contact/' );
$proposal_url = $works_url;
$consultation_url = $contact_url;
$services_url = home_url( '/services/' );
$industries_url = $works_url;
$about_url = home_url( '/about/' );
$hero_anchor = '#home-contact-form';
$network_url = THEGEM_THEME_URI . '/images/ethnic-home-hero-network.svg';
$home_uploads_url = home_url( '/wp-content/uploads/2025/03/' );
$visuals_url = home_url( '/wp-content/uploads/2026/03/' );
$form_markup = ethnic_homepage_contact_form_markup();
$shape_blocks_url = $home_uploads_url . 'home-blocks.svg';
$shape_service_url = $home_uploads_url . 'service-home.svg';
$shape_curve_url = $home_uploads_url . 'for-hero-2.svg';
$services_visual = $visuals_url . '3_home.webp';
$technology_visual = $visuals_url . '18_home.webp';
$industry_visual = $visuals_url . '2_about.webp';
$slides = array(
array(
'key' => 'commerce',
'accent' => 'Turn Digital Ambition Into',
'title' => 'Dependable Execution',
'copy' => 'Ethnic Infotech is an ecommerce development company in India specialising in Shopify Plus, Adobe Commerce, and Headless Commerce. We build for growing brands, international delivery, same team from kickoff to launch.',
'cta' => 'Start Your Build',
'url' => $contact_url,
'stack_label' => 'Commerce focus',
'stack_items' => array( 'Shopify Plus', 'Adobe Commerce', 'Headless Commerce', 'GraphCommerce' ),
'visual_label' => 'Ecommerce specialist',
'visual_heading' => 'Same team from kickoff to launch',
'visual_cards' => array( 'Since 2021', 'Growing brands', 'International delivery', 'Direct team' ),
'float_top' => 'Shopify Plus, Adobe Commerce, Headless',
'float_bottom' => 'Singapore / UK / Australia / India',
),
array(
'key' => 'app',
'accent' => 'Shopify Plus',
'title' => 'Development',
'copy' => 'Custom storefronts, migrations, Hydrogen builds, and Shopify Plus app integrations.',
'cta' => 'See Our Work',
'url' => $works_url,
'stack_label' => 'Shopify Plus scope',
'stack_items' => array( 'Custom storefronts', 'Migrations', 'Hydrogen', 'App integrations' ),
'visual_label' => 'Shopify Plus',
'visual_heading' => 'Custom storefronts for growing brands',
'visual_cards' => array( 'Custom storefronts', 'Migrations', 'Hydrogen builds', 'App integrations' ),
'float_top' => 'Built for brands that need more than a theme',
'float_bottom' => 'Same team, kickoff to launch',
),
array(
'key' => 'ai',
'accent' => 'Adobe Commerce /',
'title' => 'Magento',
'copy' => 'New builds, Magento 2 upgrades, GraphCommerce headless migrations, and B2B ecommerce delivery.',
'cta' => 'See Our Work',
'url' => $works_url,
'stack_label' => 'Adobe Commerce scope',
'stack_items' => array( 'New builds', 'Magento 2 upgrades', 'GraphCommerce', 'B2B ecommerce' ),
'visual_label' => 'Adobe Commerce',
'visual_heading' => 'Magento retained or modernised',
'visual_cards' => array( 'Magento 2 upgrades', 'B2B ecommerce', 'GraphCommerce', 'Catalog complexity' ),
'float_top' => 'Built for catalog depth and operational control',
'float_bottom' => 'Launch without unnecessary replatforms',
),
array(
'key' => 'devops',
'accent' => 'Headless',
'title' => 'Commerce',
'copy' => 'GraphCommerce and Shopify Hydrogen builds with modern React storefronts on top of your existing backend.',
'cta' => 'See Our Work',
'url' => $works_url,
'stack_label' => 'Headless scope',
'stack_items' => array( 'GraphCommerce', 'Shopify Hydrogen', 'React storefronts', 'Existing backend' ),
'visual_label' => 'Headless commerce',
'visual_heading' => 'Frontend independence, backend continuity',
'visual_cards' => array( 'React storefronts', 'GraphQL delivery', 'Performance focus', 'Existing backend' ),
'float_top' => 'Modern storefronts without backend disruption',
'float_bottom' => 'React / GraphQL / Commerce',
),
);
$client_logos = array(
array(
'name' => 'Tong Garden',
'logo' => 'https://shop.tonggarden.co.in/_next/static/media/logo.0bc927f1.svg',
'url' => home_url( '/case-studies/app-development/tonggarden/' ),
),
array(
'name' => 'RoughTrax 4X4',
'logo' => 'https://www.roughtrax4x4.com/static/version1774541315/frontend/plan2pixel/roughtrax-desktop/en_GB/images/rough-trax-logo_1.png',
'url' => home_url( '/case-studies/magento-ecommerce-development/roughtrax-4x4/' ),
),
array(
'name' => 'Fusion5',
'logo' => 'https://www.fusion5store.com/media/webp_image/logo/websites/4/logo_2.webp',
'url' => home_url( '/case-studies/app-development/omnichannel-retail-app-modernization/' ),
),
array(
'name' => 'Blue Lagoon',
'logo' => 'https://www.blue-lagoon.nl/static/version1778565542/frontend/Typify/BlueLagoon/nl_NL/images/logo.png',
'url' => home_url( '/case-studies/magento-ecommerce-development/blue-lagoon/' ),
),
array(
'name' => 'Zolamod',
'logo' => 'https://cdn.shopify.com/s/files/1/0672/9800/1129/files/zola_updated.svg?v=1744779206',
'url' => home_url( '/case-studies/shopify-ecommerce-development/zolamod/' ),
),
);
$services = array(
array(
'key' => 'shopify-plus',
'title' => 'Shopify Plus Development',
'badge' => 'SP',
'eyebrow' => 'Shopify Plus',
'copy' => 'Custom storefronts, migrations, Hydrogen builds, and Shopify Plus app integrations.',
'detail_items' => array( 'Custom storefronts', 'Migrations', 'Hydrogen builds', 'App integrations', 'Checkout UX', 'Launch support' ),
'image' => 'https://images.unsplash.com/photo-1586880244406-556ebe35f282?auto=format&fit=crop&w=1400&q=80',
'position' => '50% 50%',
'accent' => '#ff6b6b',
'link' => $services_url,
),
array(
'key' => 'adobe-commerce',
'title' => 'Adobe Commerce Development',
'badge' => 'AC',
'eyebrow' => 'Adobe Commerce',
'copy' => 'New builds, Magento 2 upgrades, GraphCommerce headless migrations, and B2B ecommerce delivery.',
'detail_items' => array( 'New builds', 'Magento 2 upgrades', 'GraphCommerce', 'B2B ecommerce', 'Catalog complexity', 'ERP / CRM sync' ),
'image' => 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?auto=format&fit=crop&w=1400&q=80',
'position' => '50% 50%',
'accent' => '#2f6bff',
'link' => $services_url,
),
array(
'key' => 'headless-commerce',
'title' => 'Headless Commerce',
'badge' => 'HC',
'eyebrow' => 'Headless',
'copy' => 'GraphCommerce and Shopify Hydrogen builds with modern React storefronts on top of your existing backend.',
'detail_items' => array( 'GraphCommerce', 'Shopify Hydrogen', 'React storefronts', 'Existing backend', 'GraphQL delivery', 'Performance focus' ),
'image' => 'https://images.unsplash.com/photo-1653387300291-bfa1eeb90e16?auto=format&fit=crop&w=1400&q=80',
'position' => '50% 50%',
'accent' => '#0ea5a4',
'link' => $services_url,
),
array(
'key' => 'replatforming',
'title' => 'Ecommerce Replatforming',
'badge' => 'RP',
'eyebrow' => 'Replatforming',
'copy' => 'Migration planning, data continuity, frontend rewrites, and platform transitions with minimal disruption.',
'detail_items' => array( 'Migration planning', 'Data continuity', 'Platform transitions', 'Catalog migration', 'Order continuity', 'Launch control' ),
'image' => 'https://images.unsplash.com/photo-1587293852726-70cdb56c2866?auto=format&fit=crop&w=1400&q=80',
'position' => '50% 50%',
'accent' => '#f59e0b',
'link' => $services_url,
),
array(
'key' => 'custom-ecommerce',
'title' => 'Custom Development',
'badge' => 'CE',
'eyebrow' => 'Custom builds',
'copy' => 'Tailored commerce experiences, custom modules, integrations, and workflows built around your operating model.',
'detail_items' => array( 'Custom modules', 'ERP / CRM integrations', 'Workflow design', 'Storefront tailoring', 'Operational tooling', 'Business-specific logic' ),
'image' => 'https://images.unsplash.com/photo-1563013544-824ae1b704d3?auto=format&fit=crop&w=1400&q=80',
'position' => '50% 50%',
'accent' => '#8b5cf6',
'link' => $services_url,
),
array(
'key' => 'ecommerce-devops',
'title' => 'DevOps',
'badge' => 'DO',
'eyebrow' => 'Platform operations',
'copy' => 'Kubernetes, Terraform, GCP, CI/CD, and release workflows designed for stable commerce delivery.',
'detail_items' => array( 'Kubernetes', 'Terraform', 'GCP', 'CI / CD', 'Observability', 'Release confidence' ),
'image' => 'https://images.unsplash.com/photo-1667984390538-3dea7a3fe33d?auto=format&fit=crop&w=1400&q=80',
'position' => '50% 50%',
'accent' => '#f97316',
'link' => $services_url,
),
);
$technology_capabilities = array(
array(
'title' => 'Shopify Plus Development',
'icon' => 'SP',
'accent' => '#f97316',
'description' => 'Custom storefronts, migrations, Hydrogen builds, and Shopify Plus app integrations.',
'items' => array( 'Custom storefronts', 'Migrations', 'Hydrogen' ),
),
array(
'title' => 'Adobe Commerce / Magento',
'icon' => 'AC',
'accent' => '#2563eb',
'description' => 'New builds, Magento 2 upgrades, Adobe Commerce SaaS readiness, and B2B ecommerce delivery.',
'items' => array( 'New builds', 'Magento 2 upgrades', 'B2B' ),
),
array(
'title' => 'Headless Commerce',
'icon' => 'HC',
'accent' => '#0ea5a4',
'description' => 'Shopify Hydrogen and modern React storefronts on top of your existing commerce backend.',
'items' => array( 'Hydrogen', 'React storefronts', 'Existing backend' ),
),
array(
'title' => 'Adobe Commerce as a SaaS',
'icon' => 'AS',
'accent' => '#f59e0b',
'description' => 'Adobe Commerce SaaS planning, architecture alignment, and rollout support for modern commerce teams.',
'items' => array( 'SaaS readiness', 'Architecture planning', 'Commerce rollout' ),
),
array(
'title' => 'Hyva',
'icon' => 'HY',
'accent' => '#10b981',
'description' => 'Hyva storefront builds and theme modernization focused on cleaner frontend delivery and better performance.',
'items' => array( 'Hyva themes', 'Frontend modernization', 'Performance' ),
),
array(
'title' => 'Integrations',
'icon' => 'IN',
'accent' => '#ec4899',
'description' => 'Commerce integrations for ERP, CRM, and operations tooling so storefronts stay connected to SAP, Zoho, and the systems your team already relies on.',
'items' => array( 'SAP', 'Zoho', 'ERP / CRM sync' ),
),
);
$industries = array(
array(
'title' => 'United States',
'copy' => 'Storefront delivery for teams balancing conversion performance, growth pacing, and operational readiness across a competitive market.',
'accent' => '#8b5cf6',
'icon' => 'US',
'image' => 'https://images.unsplash.com/photo-1752564291723-bb816a3dfb33?ixlib=rb-4.1.0&q=85&fm=jpg&crop=entropy&cs=srgb&dl=matheu-richard-VBIMtDdjuWc-unsplash.jpg',
'position' => '50% 36%',
),
array(
'title' => 'Europe',
'copy' => 'Regional ecommerce delivery shaped for localisation, cross-market consistency, and storefront experiences that adapt across languages and operations.',
'accent' => '#ec4899',
'icon' => 'EU',
'image' => 'https://images.unsplash.com/photo-1759158963837-ce2f1524b813?ixlib=rb-4.1.0&q=85&fm=jpg&crop=entropy&cs=srgb&dl=dao-hi-u-zxYxTh1qfDw-unsplash.jpg',
'position' => '50% 50%',
),
array(
'title' => 'Singapore',
'copy' => 'Delivery shaped for APAC brands that need reliable execution, clean storefronts, and operational continuity.',
'accent' => '#f97316',
'icon' => 'SG',
'image' => 'https://images.unsplash.com/photo-1675537057604-cafeef78a3d6?ixlib=rb-4.1.0&q=85&fm=jpg&crop=entropy&cs=srgb&dl=anthony-sebbo-Qn8VH9dE7-U-unsplash.jpg',
'position' => '50% 42%',
),
array(
'title' => 'United Kingdom',
'copy' => 'Commerce builds for teams managing larger catalogs, established operations, and conversion-focused storefront refinement.',
'accent' => '#06b6d4',
'icon' => 'UK',
'image' => 'https://images.unsplash.com/photo-1666886573452-9dc8ce8f5cc5?ixlib=rb-4.1.0&q=85&fm=jpg&crop=entropy&cs=srgb&dl=nappy-Q0qcTWEb7AI-unsplash.jpg',
'position' => '50% 38%',
),
array(
'title' => 'Australia',
'copy' => 'Cross-border ecommerce delivery with attention to performance, merchandising, and checkout quality.',
'accent' => '#2563eb',
'icon' => 'AU',
'image' => 'https://images.unsplash.com/photo-1726066012825-b1ab9ba6e158?ixlib=rb-4.1.0&q=85&fm=jpg&crop=entropy&cs=srgb&dl=sumup-Evfw4uCQsb4-unsplash.jpg',
'position' => '50% 44%',
),
array(
'title' => 'India',
'copy' => 'An India-based build team with direct delivery responsibility from kickoff through launch and iteration.',
'accent' => '#22c55e',
'icon' => 'IN',
'image' => 'https://images.unsplash.com/photo-1768796373360-95d80c5830fb?ixlib=rb-4.1.0&q=85&fm=jpg&crop=entropy&cs=srgb&dl=hoi-an-and-da-nang-photographer-6G3f9sYLDbA-unsplash.jpg',
'position' => '50% 48%',
),
array(
'title' => 'B2B Ecommerce',
'copy' => 'Operationally-aware storefronts and workflows for teams handling account logic, catalog depth, and buyer complexity.',
'accent' => '#0f766e',
'icon' => 'B2',
'image' => 'https://images.unsplash.com/photo-1663567125990-0a3d2a63eee7?ixlib=rb-4.1.0&q=85&fm=jpg&crop=entropy&cs=srgb&dl=andrea-castro-zV-yaX1oHjs-unsplash.jpg',
'position' => '50% 44%',
),
);
$industry_count = count( $industries );
$case_studies = array(
array(
'brand_mark' => 'TG',
'title' => 'Regional Ecommerce Brand',
'summary' => 'We migrated a Singapore-based brand from a Magento monolith to a GraphCommerce headless storefront, preserving the existing catalogue and order management while replacing the rendering layer with a modern React frontend.',
'technologies' => array( 'Magento', 'GraphCommerce', 'React + GraphQL' ),
'url' => $contact_url,
'cta' => 'Talk to Our Team',
'image' => $visuals_url . 'placeholder-1-768x512.png',
'position' => '50% 0%',
'accent' => '#2f6bff',
'visual_note_a' => 'Magento -> GraphCommerce',
'visual_note_b' => 'Frontend independence retained',
),
);
$case_study_post_type = post_type_exists( 'thegem_pf_item' ) ? 'thegem_pf_item' : 'post';
$case_study_taxonomy = 'thegem_pf_item' === $case_study_post_type ? 'thegem_portfolios' : 'category';
$case_study_palette = array( '#ff6b6b', '#0ea5a4', '#2f6bff', '#7c3aed', '#f59e0b', '#0f766e', '#1d4ed8' );
$dynamic_case_studies = array();
$case_studies_query = new WP_Query(
array(
'post_type' => $case_study_post_type,
'post_status' => 'publish',
'posts_per_page' => (int) apply_filters( 'ethnic_home_case_studies_limit', 6 ),
'orderby' => 'date',
'order' => 'DESC',
'ignore_sticky_posts' => true,
'no_found_rows' => true,
)
);
if ( $case_studies_query->have_posts() ) {
while ( $case_studies_query->have_posts() ) {
$case_studies_query->the_post();
$case_id = (int) get_the_ID();
$case_title = trim( (string) get_the_title( $case_id ) );
if ( '' === $case_title ) {
continue;
}
$case_excerpt_source = has_excerpt( $case_id ) ? get_the_excerpt( $case_id ) : get_post_field( 'post_content', $case_id );
$case_summary = wp_trim_words( wp_strip_all_tags( strip_shortcodes( (string) $case_excerpt_source ) ), 24, '…' );
if ( '' === trim( $case_summary ) ) {
$case_summary = 'Tailored digital delivery focused on measurable business outcomes.';
}
$case_payload = function_exists( 'ethnic_case_studies_build_post_payload' ) ? ethnic_case_studies_build_post_payload( $case_id ) : array();
$case_platforms = ! empty( $case_payload['platforms'] ) && is_array( $case_payload['platforms'] ) ? array_values( array_filter( array_map( 'trim', $case_payload['platforms'] ) ) ) : array();
$case_services = ! empty( $case_payload['services'] ) && is_array( $case_payload['services'] ) ? array_values( array_filter( array_map( 'trim', $case_payload['services'] ) ) ) : array();
$case_technologies = array_slice(
array_values(
array_unique(
array_filter(
array_merge( $case_platforms, $case_services )
)
)
),
0,
3
);
if ( empty( $case_technologies ) ) {
$case_terms = get_the_terms( $case_id, $case_study_taxonomy );
if ( is_wp_error( $case_terms ) || empty( $case_terms ) ) {
$case_terms = array();
}
$case_technologies = array_values(
array_filter(
array_map(
static function ( $term ) {
return isset( $term->name ) ? trim( (string) $term->name ) : '';
},
$case_terms
)
)
);
$case_technologies = array_slice( $case_technologies, 0, 3 );
}
if ( empty( $case_technologies ) ) {
$case_technologies = array( 'Custom Development' );
}
$case_brand_mark = '';
$case_title_bits = preg_split( '/[\s\-_]+/u', $case_title );
if ( is_array( $case_title_bits ) ) {
foreach ( $case_title_bits as $case_title_bit ) {
$case_title_bit = trim( (string) $case_title_bit );
if ( '' === $case_title_bit ) {
continue;
}
$case_initial = function_exists( 'mb_substr' ) ? mb_substr( $case_title_bit, 0, 1 ) : substr( $case_title_bit, 0, 1 );
$case_initial = function_exists( 'mb_strtoupper' ) ? mb_strtoupper( $case_initial ) : strtoupper( $case_initial );
$case_brand_mark .= $case_initial;
$case_mark_length = function_exists( 'mb_strlen' ) ? mb_strlen( $case_brand_mark ) : strlen( $case_brand_mark );
if ( $case_mark_length >= 2 ) {
break;
}
}
}
if ( '' === $case_brand_mark ) {
$case_brand_mark = 'CS';
}
$case_image_url = get_the_post_thumbnail_url( $case_id, 'large' );
if ( ! $case_image_url ) {
$case_image_url = $visuals_url . 'placeholder-1-768x512.png';
}
$case_color = $case_study_palette[ count( $dynamic_case_studies ) % count( $case_study_palette ) ];
$dynamic_case_studies[] = array(
'brand_mark' => $case_brand_mark,
'title' => $case_title,
'summary' => $case_summary,
'technologies' => $case_technologies,
'url' => get_permalink( $case_id ),
'cta' => 'Read More',
'image' => $case_image_url,
'position' => '50% 0%',
'accent' => $case_color,
'visual_note_a' => $case_technologies[0],
'visual_note_b' => isset( $case_technologies[1] ) ? $case_technologies[1] : 'Project Delivery',
);
}
wp_reset_postdata();
}
if ( ! empty( $dynamic_case_studies ) ) {
$case_studies = $dynamic_case_studies;
}
$case_study_count = count( $case_studies );
$why_choose_us = array(
array(
'title' => 'Built for Growing Brands',
'copy' => 'We work with growing brands at every stage from first store to enterprise replatform.',
'details' => array( 'Flexible project scope', 'Growing brands welcome', 'Enterprise replatform support' ),
'accent' => '#2563eb',
'icon' => $visuals_url . 'green-icon-07.svg',
),
array(
'title' => 'Same Team, Kickoff to Launch',
'copy' => 'You meet the developers building your store on day one. No handoffs, no junior swaps mid-project.',
'details' => array( 'Direct delivery team', 'No handoff gaps', 'Continuity from scope to launch' ),
'accent' => '#ff6b6b',
'icon' => $visuals_url . 'green-icon-01.svg',
),
array(
'title' => 'Built for International Scale',
'copy' => 'Clients in Singapore, the UK, and Australia. Multi-currency, multi-language, and cross-border commerce are standard, not add-ons.',
'details' => array( 'International delivery', 'Cross-border readiness', 'Operational complexity handled' ),
'accent' => '#0ea5a4',
'icon' => $visuals_url . 'green-icon-08.svg',
),
array(
'title' => 'Modern DevOps Stack',
'copy' => 'Kubernetes, Terraform, GCP. Your store ships on infrastructure built for scale, not shared hosting.',
'details' => array( 'Kubernetes', 'Terraform', 'Cloud operations for commerce' ),
'accent' => '#f59e0b',
'icon' => $visuals_url . 'green-icon-06.svg',
),
);
$testimonials = ethnic_homepage_get_testimonials();
$testimonial_count = count( $testimonials );
$faqs = array(
array(
'question' => 'Which platforms do you specialise in?',
'answer' => 'We specialise in Shopify Plus, Adobe Commerce, and Headless Commerce builds, including GraphCommerce and Shopify Hydrogen storefront delivery.',
),
array(
'question' => 'Do you build both Shopify Plus and Adobe Commerce stores?',
'answer' => 'Yes. We handle Shopify Plus storefronts, Adobe Commerce builds, Magento 2 upgrades, and the integration work around them.',
),
array(
'question' => 'Can you build headless storefronts?',
'answer' => 'Yes. We build GraphCommerce and Shopify Hydrogen storefronts when brands need modern React delivery on top of an existing commerce backend.',
),
array(
'question' => 'Do you handle migrations and replatforming?',
'answer' => 'Yes. We support replatforming, data continuity, frontend rewrites, and phased migrations designed to reduce operational disruption.',
),
array(
'question' => 'Do you support smaller scopes as well as larger builds?',
'answer' => 'Yes. We support focused delivery phases as well as larger builds and replatforming work, depending on what the store needs next.',
),
array(
'question' => 'Do we work with the same team from kickoff to launch?',
'answer' => 'Yes. You work directly with the team building the store, with continuity through discovery, delivery, launch, and follow-on iterations.',
),
array(
'question' => 'Do you work with international brands?',
'answer' => 'Yes. We work with brands in Singapore, the UK, Australia, and India, including multi-currency and cross-border commerce requirements.',
),
array(
'question' => 'How do we get started?',
'answer' => 'Share what you are building and we will outline what is possible, what it will take, and the best next step for the store or replatform.',
),
);
$insights_archive_page_id = (int) get_option( 'page_for_posts' );
$insights_archive_url = $insights_archive_page_id ? get_permalink( $insights_archive_page_id ) : '';
if ( ! $insights_archive_url || trailingslashit( $insights_archive_url ) === trailingslashit( home_url( '/' ) ) ) {
foreach ( array( 'insights', 'news', 'blog' ) as $insights_archive_slug ) {
$insights_archive_page = get_page_by_path( $insights_archive_slug );
if ( $insights_archive_page instanceof WP_Post ) {
$insights_archive_url = get_permalink( $insights_archive_page );
break;
}
}
}
if ( ! $insights_archive_url || trailingslashit( $insights_archive_url ) === trailingslashit( home_url( '/' ) ) ) {
$insights_archive_url = get_post_type_archive_link( 'post' );
}
if ( ! $insights_archive_url || trailingslashit( $insights_archive_url ) === trailingslashit( home_url( '/' ) ) ) {
$insights_archive_url = home_url( '/news/' );
}
$insights_posts = array();
$insight_view_meta_keys = apply_filters(
'ethnic_home_insight_view_meta_keys',
array(
'post_views_count',
'wpb_post_views_count',
'post_views',
'view_count',
'views',
)
);
$insights_query = new WP_Query(
array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 3,
'orderby' => 'date',
'order' => 'DESC',
'ignore_sticky_posts' => true,
'no_found_rows' => true,
)
);
if ( $insights_query->have_posts() ) {
while ( $insights_query->have_posts() ) {
$insights_query->the_post();
$post_id = (int) get_the_ID();
$insight_category_name = '';
$insight_categories = get_the_category( $post_id );
if ( ! empty( $insight_categories ) ) {
if ( class_exists( 'WPSEO_Primary_Term' ) ) {
$primary_term = new WPSEO_Primary_Term( 'category', $post_id );
$primary_term_id = (int) $primary_term->get_primary_term();
if ( $primary_term_id > 0 ) {
$primary_term_object = get_term( $primary_term_id, 'category' );
if ( $primary_term_object && ! is_wp_error( $primary_term_object ) ) {
$insight_category_name = $primary_term_object->name;
}
}
}
if ( '' === $insight_category_name && isset( $insight_categories[0] ) ) {
$insight_category_name = $insight_categories[0]->name;
}
}
$insight_excerpt_source = has_excerpt( $post_id ) ? get_the_excerpt( $post_id ) : get_post_field( 'post_content', $post_id );
$insight_excerpt = wp_trim_words( wp_strip_all_tags( strip_shortcodes( (string) $insight_excerpt_source ) ), 24, '…' );
if ( '' === trim( $insight_excerpt ) ) {
$insight_excerpt = 'Read the full insight from our team.';
}
$insight_content_text = wp_strip_all_tags( strip_shortcodes( (string) get_post_field( 'post_content', $post_id ) ) );
$insight_content_words = preg_split( '/\s+/u', trim( $insight_content_text ) );
$insight_word_count = is_array( $insight_content_words ) ? count( array_filter( $insight_content_words ) ) : 0;
$insight_reading_time = max( 1, (int) round( $insight_word_count / 200 ) );
$insight_views = null;
foreach ( $insight_view_meta_keys as $insight_view_meta_key ) {
$raw_view_count = get_post_meta( $post_id, $insight_view_meta_key, true );
if ( '' === $raw_view_count || null === $raw_view_count ) {
continue;
}
if ( is_numeric( $raw_view_count ) ) {
$insight_views = (int) $raw_view_count;
break;
}
$raw_view_digits = preg_replace( '/[^0-9]/', '', (string) $raw_view_count );
if ( '' !== $raw_view_digits ) {
$insight_views = (int) $raw_view_digits;
break;
}
}
$insight_image_url = get_the_post_thumbnail_url( $post_id, 'large' );
$insight_image_alt = '';
if ( $insight_image_url ) {
$insight_thumbnail_id = (int) get_post_thumbnail_id( $post_id );
$insight_image_alt = trim( (string) get_post_meta( $insight_thumbnail_id, '_wp_attachment_image_alt', true ) );
if ( '' === $insight_image_alt ) {
$insight_image_alt = get_the_title( $post_id );
}
}
$insights_posts[] = array(
'title' => get_the_title( $post_id ),
'url' => get_permalink( $post_id ),
'image_url' => $insight_image_url,
'image_alt' => $insight_image_alt,
'category' => $insight_category_name,
'date' => get_the_date( 'd M Y', $post_id ),
'date_iso' => get_the_date( 'c', $post_id ),
'excerpt' => $insight_excerpt,
'reading_time' => $insight_reading_time,
'views' => $insight_views,
);
}
wp_reset_postdata();
}
$industry_signals = array(
'Domain-aware discovery',
'Workflow-first planning',
'User journeys shaped by real operations',
);
ob_start();
?>
<div class="ethnic-homepage">
<section class="ethnic-home-hero ethnic-hero-section" data-autoplay="6000" aria-label="Featured service slider">
<div class="ethnic-home-hero__network" aria-hidden="true">
<img class="ethnic-hero-bg-network-img" src="<?php echo esc_url( $network_url ); ?>" alt="" loading="eager" decoding="async" />
</div>
<div class="ethnic-home-hero__inner">
<div class="ethnic-home-hero__stage">
<?php foreach ( $slides as $index => $slide ) : ?>
<?php $slide_heading_tag = 0 === $index ? 'h1' : 'h2'; ?>
<article
class="ethnic-home-hero__slide theme-<?php echo esc_attr( $slide['key'] ); ?><?php echo 0 === $index ? ' is-active' : ''; ?>"
data-slide-index="<?php echo esc_attr( $index ); ?>"
aria-hidden="<?php echo 0 === $index ? 'false' : 'true'; ?>"
>
<div class="ethnic-home-hero__copy">
<<?php echo esc_html( $slide_heading_tag ); ?> class="ethnic-home-hero__title">
<span><?php echo esc_html( $slide['accent'] ); ?></span>
<?php echo esc_html( $slide['title'] ); ?>
</<?php echo esc_html( $slide_heading_tag ); ?>>
<div class="ethnic-home-hero__lead">
<strong><?php echo esc_html( sprintf( '%02d', $index + 1 ) ); ?></strong>
<span class="ethnic-home-hero__lead-line" aria-hidden="true"></span>
<p><?php echo esc_html( $slide['copy'] ); ?></p>
</div>
<a class="ethnic-home-hero__cta" href="<?php echo esc_url( $slide['url'] ); ?>">
<span class="ethnic-home-hero__cta-icon" aria-hidden="true"></span>
<?php echo esc_html( $slide['cta'] ); ?>
</a>
<div class="ethnic-home-hero__stack">
<p><?php echo esc_html( $slide['stack_label'] ); ?></p>
<ul>
<?php foreach ( $slide['stack_items'] as $item ) : ?>
<li><?php echo esc_html( $item ); ?></li>
<?php endforeach; ?>
</ul>
</div>
</div>
<div class="ethnic-home-hero__visual" aria-hidden="true">
<div class="ethnic-home-hero__blob"></div>
<div class="ethnic-home-hero__mockup">
<div class="ethnic-home-hero__mockup-bar">
<span></span>
<span></span>
<span></span>
</div>
<div class="ethnic-home-hero__mockup-body">
<div class="ethnic-home-hero__mockup-sidebar">
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<div class="ethnic-home-hero__mockup-panel">
<span class="ethnic-home-hero__visual-label"><?php echo esc_html( $slide['visual_label'] ); ?></span>
<h3><?php echo esc_html( $slide['visual_heading'] ); ?></h3>
<div class="ethnic-home-hero__card-grid">
<?php foreach ( $slide['visual_cards'] as $card ) : ?>
<div class="ethnic-home-hero__card-item"><?php echo esc_html( $card ); ?></div>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
<div class="ethnic-home-hero__float ethnic-home-hero__float--top"><?php echo esc_html( $slide['float_top'] ); ?></div>
<div class="ethnic-home-hero__float ethnic-home-hero__float--bottom"><?php echo esc_html( $slide['float_bottom'] ); ?></div>
</div>
</article>
<?php endforeach; ?>
</div>
<div class="ethnic-home-hero__nav">
<div class="ethnic-home-hero__counter">
<span data-hero-current>01</span>
<span>/</span>
<span><?php echo esc_html( sprintf( '%02d', count( $slides ) ) ); ?></span>
</div>
<div class="ethnic-home-hero__dots" role="tablist" aria-label="Slider navigation">
<?php foreach ( $slides as $index => $slide ) : ?>
<button
type="button"
class="ethnic-home-hero__dot<?php echo 0 === $index ? ' is-active' : ''; ?>"
data-hero-dot="<?php echo esc_attr( $index ); ?>"
aria-label="<?php echo esc_attr( sprintf( 'Show slide %d: %s', $index + 1, $slide['accent'] ) ); ?>"
aria-selected="<?php echo 0 === $index ? 'true' : 'false'; ?>"
tabindex="<?php echo 0 === $index ? '0' : '-1'; ?>"
></button>
<?php endforeach; ?>
</div>
<div class="ethnic-home-hero__arrows">
<button type="button" class="ethnic-home-hero__arrow" data-hero-prev aria-label="Previous slide">
<span aria-hidden="true">←</span>
</button>
<button type="button" class="ethnic-home-hero__arrow" data-hero-next aria-label="Next slide">
<span aria-hidden="true">→</span>
</button>
</div>
</div>
</div>
</section>
<section class="ethnic-homepage__section ethnic-homepage__section--services" id="home-services">
<div class="ethnic-homepage__shell">
<div class="ethnic-homepage__services-layout">
<div class="ethnic-homepage__services-experience" data-service-showcase>
<div class="ethnic-homepage__service-panel-shell">
<?php foreach ( $services as $service_index => $service ) : ?>
<?php
$service_slug = sanitize_html_class( $service['key'] );
$panel_id = 'ethnic-service-panel-' . $service_slug;
$tab_id = 'ethnic-service-tab-' . $service_slug;
?>
<article
id="<?php echo esc_attr( $panel_id ); ?>"
class="ethnic-homepage__service-detail<?php echo 0 === $service_index ? ' is-active' : ''; ?>"
role="tabpanel"
data-service-panel
aria-labelledby="<?php echo esc_attr( $tab_id ); ?>"
style="--service-accent: <?php echo esc_attr( $service['accent'] ); ?>;"
<?php echo 0 === $service_index ? '' : ' hidden'; ?>
>
<div class="ethnic-homepage__service-detail-copy-shell">
<div class="ethnic-homepage__service-detail-topline">
<span class="ethnic-homepage__kicker">What We Build</span>
<span class="ethnic-homepage__service-detail-count"><?php echo esc_html( sprintf( '%02d / %02d', $service_index + 1, count( $services ) ) ); ?></span>
</div>
<span class="ethnic-homepage__service-detail-label"><?php echo esc_html( $service['eyebrow'] ); ?></span>
<h2 class="ethnic-homepage__title"><?php echo esc_html( $service['title'] ); ?></h2>
<p class="ethnic-homepage__description"><?php echo esc_html( $service['copy'] ); ?></p>
<a class="ethnic-homepage__service-detail-cta" href="<?php echo esc_url( $service['link'] ); ?>">Read More</a>
</div>
<div class="ethnic-homepage__service-detail-visual">
<img
src="<?php echo esc_url( $service['image'] ); ?>"
alt="<?php echo esc_attr( $service['title'] ); ?>"
loading="lazy"
decoding="async"
style="object-position: <?php echo esc_attr( $service['position'] ); ?>;"
/>
</div>
</article>
<?php endforeach; ?>
</div>
<div class="ethnic-homepage__service-selector-row">
<div class="ethnic-homepage__service-nav-controls" aria-label="Service navigation">
<button type="button" class="ethnic-homepage__service-nav-button" data-service-prev aria-label="Previous service">
<span aria-hidden="true">←</span>
</button>
<button type="button" class="ethnic-homepage__service-nav-button" data-service-next aria-label="Next service">
<span aria-hidden="true">→</span>
</button>
</div>
<div class="ethnic-homepage__service-grid" role="tablist" aria-label="Core service categories">
<?php foreach ( $services as $service_index => $service ) : ?>
<?php
$service_slug = sanitize_html_class( $service['key'] );
$panel_id = 'ethnic-service-panel-' . $service_slug;
$tab_id = 'ethnic-service-tab-' . $service_slug;
?>
<button
type="button"
class="ethnic-homepage__service-tile<?php echo 0 === $service_index ? ' is-active' : ''; ?>"
id="<?php echo esc_attr( $tab_id ); ?>"
role="tab"
data-service-card
data-service-target="<?php echo esc_attr( $panel_id ); ?>"
aria-controls="<?php echo esc_attr( $panel_id ); ?>"
aria-selected="<?php echo 0 === $service_index ? 'true' : 'false'; ?>"
tabindex="<?php echo 0 === $service_index ? '0' : '-1'; ?>"
style="--service-accent: <?php echo esc_attr( $service['accent'] ); ?>;"
>
<span class="ethnic-homepage__service-tile-copy">
<strong><?php echo esc_html( $service['title'] ); ?></strong>
<span class="ethnic-homepage__service-tile-summary"><?php echo esc_html( $service['copy'] ); ?></span>
</span>
</button>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="ethnic-homepage__section ethnic-homepage__section--technology" id="home-technology">
<div class="ethnic-homepage__shell">
<div class="ethnic-homepage__technology-stack">
<div class="ethnic-homepage__section-heading ethnic-homepage__technology-heading">
<span class="ethnic-homepage__kicker">Commerce specialization</span>
<h2 class="ethnic-homepage__title">We Go Deep Where Others Go Broad</h2>
<p class="ethnic-homepage__description">Most India agencies cover 40+ services. We cover one: ecommerce. Shopify Plus, Adobe Commerce, Headless Commerce, Adobe Commerce SaaS, and Hyva storefront delivery built by a focused team that has shipped real stores for international brands.</p>
</div>
<div class="ethnic-homepage__technology-capability-grid">
<?php foreach ( $technology_capabilities as $technology_index => $technology_capability ) : ?>
<article class="ethnic-homepage__technology-capability" style="--technology-accent: <?php echo esc_attr( $technology_capability['accent'] ); ?>;">
<div class="ethnic-homepage__technology-capability-head">
<span class="ethnic-homepage__technology-capability-index"><?php echo esc_html( sprintf( '%02d', $technology_index + 1 ) ); ?></span>
<span class="ethnic-homepage__technology-capability-rule" aria-hidden="true"></span>
<h3><?php echo esc_html( $technology_capability['title'] ); ?></h3>
</div>
<p><?php echo esc_html( $technology_capability['description'] ); ?></p>
<p class="ethnic-homepage__technology-capability-meta"><?php echo esc_html( implode( ' / ', $technology_capability['items'] ) ); ?></p>
</article>
<?php endforeach; ?>
</div>
</div>
</div>
</section>
<section class="ethnic-homepage__section ethnic-homepage__section--industries" id="home-industries">
<div class="ethnic-homepage__shell">
<div class="ethnic-homepage__industry-slider" data-industry-slider data-loop-slider data-loop-clones="4">
<div class="ethnic-homepage__industry-slider-head">
<div class="ethnic-homepage__section-heading ethnic-homepage__industry-heading">
<span class="ethnic-homepage__kicker">International scale</span>
<h2 class="ethnic-homepage__title">Built for International Scale</h2>
<p class="ethnic-homepage__description">Clients in the USA, Europe, Singapore, the UK, and Australia. Multi-currency, multi-language, and cross-border commerce are standard, not add-ons.</p>
</div>
<a class="ethnic-homepage__industry-cta" href="<?php echo esc_url( $industries_url ); ?>">See Our Work</a>
</div>
<div class="ethnic-homepage__industry-slider-frame">
<div
class="ethnic-homepage__industry-slider-track"
id="ethnic-industry-slider-track"
data-industry-track
data-loop-track
tabindex="0"
role="region"
aria-roledescription="carousel"
aria-label="International ecommerce delivery contexts"
>
<?php foreach ( $industries as $industry_index => $industry ) : ?>
<article
class="ethnic-homepage__industry-card"
data-industry-slide
data-loop-slide
role="group"
aria-roledescription="slide"
aria-label="<?php echo esc_attr( $industry['title'] . ', slide ' . ( $industry_index + 1 ) . ' of ' . $industry_count ); ?>"
style="--industry-accent: <?php echo esc_attr( $industry['accent'] ); ?>; --industry-image: url('<?php echo esc_url( $industry['image'] ); ?>'); --industry-position: <?php echo esc_attr( $industry['position'] ); ?>;"
>
<div class="ethnic-homepage__industry-card-body">
<div class="ethnic-homepage__industry-card-copy">
<span class="ethnic-homepage__industry-card-label"><?php echo esc_html( sprintf( '%02d', $industry_index + 1 ) ); ?></span>
<h3><?php echo esc_html( $industry['title'] ); ?></h3>
<span class="ethnic-homepage__industry-card-divider" aria-hidden="true"></span>
<p><?php echo esc_html( $industry['copy'] ); ?></p>
</div>
</div>
</article>
<?php endforeach; ?>
</div>
<div class="ethnic-homepage__industry-slider-controls" aria-label="Industry slider navigation">
<button type="button" class="ethnic-homepage__industry-slider-arrow ethnic-homepage__slider-arrow ethnic-homepage__industry-slider-arrow--prev" data-industry-prev data-loop-prev aria-controls="ethnic-industry-slider-track" aria-label="Show previous industry">
<span aria-hidden="true">←</span>
</button>
<button type="button" class="ethnic-homepage__industry-slider-arrow ethnic-homepage__slider-arrow ethnic-homepage__industry-slider-arrow--next" data-industry-next data-loop-next aria-controls="ethnic-industry-slider-track" aria-label="Show next industry">
<span aria-hidden="true">→</span>
</button>
</div>
</div>
</div>
</div>
</section>
<section class="ethnic-homepage__section ethnic-homepage__section--cases" id="home-cases">
<div class="ethnic-homepage__shell">
<div class="ethnic-homepage__case-intro">
<div class="ethnic-homepage__section-heading ethnic-homepage__case-heading">
<span class="ethnic-homepage__kicker">Selected work</span>
<h2 class="ethnic-homepage__title">Case Studies</h2>
</div>
<div class="ethnic-homepage__case-intro-copy">
<p class="ethnic-homepage__description">Shopify Plus, Adobe Commerce, replatforming, and headless commerce work delivered for international brands with direct delivery teams.</p>
<a class="ethnic-homepage__case-cta" href="<?php echo esc_url( $works_url ); ?>">See Our Work</a>
</div>
</div>
<div class="ethnic-homepage__case-slider" data-loop-slider data-loop-clones="1">
<div class="ethnic-homepage__case-slider-frame">
<div
class="ethnic-homepage__case-slider-track"
id="ethnic-case-slider-track"
data-loop-track
tabindex="0"
role="region"
aria-roledescription="carousel"
aria-label="Case studies and our work"
>
<?php foreach ( $case_studies as $case_index => $case_study ) : ?>
<article
class="ethnic-homepage__case-slide"
data-loop-slide
role="group"
aria-roledescription="slide"
aria-label="<?php echo esc_attr( $case_study['title'] . ', slide ' . ( $case_index + 1 ) . ' of ' . $case_study_count ); ?>"
style="--case-accent: <?php echo esc_attr( $case_study['accent'] ); ?>; --case-image: url('<?php echo esc_url( $case_study['image'] ); ?>'); --case-position: <?php echo esc_attr( $case_study['position'] ); ?>;"
>
<div class="ethnic-homepage__case-slide-copy">
<div class="ethnic-homepage__case-text">
<h3><?php echo esc_html( $case_study['title'] ); ?></h3>
<p><?php echo esc_html( $case_study['summary'] ); ?></p>
</div>
<div class="ethnic-homepage__case-slide-footer">
<div class="ethnic-homepage__case-technologies" aria-label="<?php echo esc_attr( $case_study['title'] . ' technologies' ); ?>">
<span class="ethnic-homepage__case-technologies-label">Technologies</span>
<div class="ethnic-homepage__case-technologies-list">
<?php foreach ( $case_study['technologies'] as $technology ) : ?>
<span class="ethnic-homepage__case-technologies-pill"><?php echo esc_html( $technology ); ?></span>
<?php endforeach; ?>
</div>
</div>
<?php if ( ! empty( $case_study['url'] ) ) : ?>
<a class="ethnic-homepage__case-slide-cta" href="<?php echo esc_url( $case_study['url'] ); ?>">
<span class="ethnic-homepage__case-slide-cta-label"><?php echo esc_html( isset( $case_study['cta'] ) ? $case_study['cta'] : 'Talk to Our Team' ); ?></span>
<span class="ethnic-homepage__case-slide-cta-icon" aria-hidden="true"></span>
</a>
<?php endif; ?>
</div>
</div>
<div class="ethnic-homepage__case-slide-visual" aria-hidden="true">
<div class="ethnic-homepage__case-device">
<div class="ethnic-homepage__case-device-screen">
<img class="ethnic-homepage__case-device-image" src="<?php echo esc_url( $case_study['image'] ); ?>" alt="" loading="lazy" decoding="async" />
</div>
</div>
</div>
</article>
<?php endforeach; ?>
</div>
</div>
<div class="ethnic-homepage__slider-nav ethnic-homepage__case-slider-nav" aria-label="Case study slider navigation">
<div class="ethnic-homepage__slider-progress ethnic-homepage__case-slider-progress">
<div class="ethnic-homepage__slider-dots" role="tablist" aria-label="Case study slides">
<?php foreach ( $case_studies as $case_index => $case_study ) : ?>
<button
type="button"
class="ethnic-homepage__slider-dot<?php echo 0 === $case_index ? ' is-active' : ''; ?>"
data-loop-dot="<?php echo esc_attr( $case_index ); ?>"
aria-label="<?php echo esc_attr( sprintf( 'Show slide %d: %s', $case_index + 1, $case_study['title'] ) ); ?>"
aria-selected="<?php echo 0 === $case_index ? 'true' : 'false'; ?>"
tabindex="<?php echo 0 === $case_index ? '0' : '-1'; ?>"
></button>
<?php endforeach; ?>
</div>
</div>
<div class="ethnic-homepage__slider-arrows ethnic-homepage__case-slider-controls">
<button type="button" class="ethnic-homepage__slider-arrow ethnic-homepage__case-slider-arrow ethnic-homepage__case-slider-arrow--prev" data-loop-prev aria-controls="ethnic-case-slider-track" aria-label="Show previous case study">
<span aria-hidden="true">←</span>
</button>
<button type="button" class="ethnic-homepage__slider-arrow ethnic-homepage__case-slider-arrow ethnic-homepage__case-slider-arrow--next" data-loop-next aria-controls="ethnic-case-slider-track" aria-label="Show next case study">
<span aria-hidden="true">→</span>
</button>
</div>
</div>
</div>
</div>
</section>
<section class="ethnic-homepage__section ethnic-homepage__section--trust" id="home-trust">
<div class="ethnic-homepage__shell">
<div class="ethnic-homepage__client-showcase">
<div class="ethnic-homepage__section-heading ethnic-homepage__client-heading">
<span class="ethnic-homepage__kicker">International client base</span>
<h2 class="ethnic-homepage__title">Built for Brands Across Three Continents</h2>
<p class="ethnic-homepage__description">From Singapore to the UK to Australia. ecommerce builds, shipped by the same team that will build yours.</p>
</div>
<div class="ethnic-homepage__logo-band">
<span class="ethnic-homepage__logo-label">Selected client work</span>
<div class="ethnic-homepage__logo-grid" aria-label="Selected client work">
<?php foreach ( $client_logos as $client_logo ) : ?>
<a
class="ethnic-homepage__logo-item"
href="<?php echo esc_url( $client_logo['url'] ); ?>"
aria-label="<?php echo esc_attr( 'View case study: ' . $client_logo['name'] ); ?>"
>
<img
src="<?php echo esc_url( $client_logo['logo'] ); ?>"
alt="<?php echo esc_attr( $client_logo['name'] . ' logo' ); ?>"
loading="lazy"
decoding="async"
/>
</a>
<?php endforeach; ?>
</div>
</div>
<div class="ethnic-homepage__client-footer">
<a class="ethnic-homepage__client-footer-link" href="<?php echo esc_url( $works_url ); ?>">View All Case Studies <span aria-hidden="true">→</span></a>
</div>
</div>
</div>
</section>
<section class="ethnic-homepage__section ethnic-homepage__section--why" id="home-why-us">
<div class="ethnic-homepage__shell">
<div class="ethnic-homepage__why-intro">
<div class="ethnic-homepage__section-heading ethnic-homepage__why-copy">
<span class="ethnic-homepage__kicker">Why brands choose us</span>
<h2 class="ethnic-homepage__title">Why Brands Choose Ethnic Infotech</h2>
<p class="ethnic-homepage__description">Focused ecommerce delivery, direct communication, and infrastructure built for stores that need more than surface-level implementation.</p>
</div>
<aside class="ethnic-homepage__why-aside" aria-label="Contact our team">
<span class="ethnic-homepage__why-aside-kicker">Contact us</span>
<h3>Talk to the Team Building It</h3>
<p>Tell us what you're building. We'll show you the practical path from scope to launch.</p>
<a class="ethnic-homepage__why-aside-link" href="<?php echo esc_url( $contact_url ); ?>">Start Your Build</a>
</aside>
</div>
<div class="ethnic-homepage__why-timeline">
<?php foreach ( $why_choose_us as $why_index => $why ) : ?>
<article class="ethnic-homepage__why-step" style="--why-accent: <?php echo esc_attr( $why['accent'] ); ?>;">
<span class="ethnic-homepage__why-step-number"><?php echo esc_html( ( $why_index + 1 ) . '.' ); ?></span>
<h3><?php echo esc_html( $why['title'] ); ?></h3>
<div class="ethnic-homepage__why-step-body">
<p><?php echo esc_html( $why['copy'] ); ?></p>
<p class="ethnic-homepage__why-step-meta"><?php echo esc_html( implode( ' / ', $why['details'] ) ); ?></p>
</div>
</article>
<?php endforeach; ?>
</div>
</div>
</section>
<section class="ethnic-homepage__section ethnic-homepage__section--feedback" id="home-feedback">
<div class="ethnic-homepage__shell">
<div class="ethnic-homepage__feedback-shell">
<div class="ethnic-homepage__feedback-heading">
<h2 class="ethnic-homepage__title">Clients Speak</h2>
<p class="ethnic-homepage__description">Feedback from brands and teams we have supported across Shopify Plus, Adobe Commerce, and headless commerce delivery.</p>
</div>
<div class="ethnic-homepage__testimonial-slider" data-loop-slider data-loop-clones="1" data-loop-align="center">
<div class="ethnic-homepage__testimonial-slider-frame">
<div
class="ethnic-homepage__testimonial-slider-track"
id="ethnic-testimonial-slider-track"
data-loop-track
tabindex="0"
role="region"
aria-roledescription="carousel"
aria-label="Client feedback testimonials"
>
<?php foreach ( $testimonials as $testimonial_index => $testimonial ) : ?>
<article
class="ethnic-homepage__testimonial-slide"
data-loop-slide
role="group"
aria-roledescription="slide"
aria-label="<?php echo esc_attr( $testimonial['name'] . ', slide ' . ( $testimonial_index + 1 ) . ' of ' . $testimonial_count ); ?>"
style="--testimonial-accent: <?php echo esc_attr( $testimonial['accent'] ); ?>;"
>
<div class="ethnic-homepage__testimonial-content">
<?php
$testimonial_secondary_line = '';
if ( ! empty( $testimonial['position'] ) ) {
$testimonial_secondary_line = (string) $testimonial['position'];
} elseif ( ! empty( $testimonial['role'] ) ) {
$testimonial_secondary_line = (string) $testimonial['role'];
} elseif ( ! empty( $testimonial['company'] ) ) {
$testimonial_secondary_line = (string) $testimonial['company'];
}
?>
<div class="ethnic-homepage__testimonial-top">
<div class="ethnic-homepage__testimonial-person">
<h3><?php echo esc_html( $testimonial['name'] ); ?></h3>
<?php if ( '' !== $testimonial_secondary_line ) : ?>
<p><?php echo esc_html( $testimonial_secondary_line ); ?></p>
<?php endif; ?>
</div>
<?php if ( ! empty( $testimonial['source_logo_id'] ) ) : ?>
<div class="ethnic-homepage__testimonial-source">
<?php
$source_logo_alt = trim( (string) get_post_meta( (int) $testimonial['source_logo_id'], '_wp_attachment_image_alt', true ) );
if ( '' === $source_logo_alt ) {
$source_logo_alt = sprintf( '%s review source logo', $testimonial['name'] );
}
?>
<?php echo wp_kses_post( wp_get_attachment_image( (int) $testimonial['source_logo_id'], 'full', false, array( 'class' => 'ethnic-homepage__testimonial-source-logo', 'loading' => 'lazy', 'decoding' => 'async', 'alt' => $source_logo_alt ) ) ); ?>
</div>
<?php endif; ?>
</div>
<p class="ethnic-homepage__testimonial-quote"><?php echo esc_html( $testimonial['quote'] ); ?></p>
</div>
</article>
<?php endforeach; ?>
</div>
</div>
<div class="ethnic-homepage__slider-nav ethnic-homepage__testimonial-slider-nav" aria-label="Testimonial slider navigation">
<div class="ethnic-homepage__slider-progress ethnic-homepage__testimonial-slider-progress">
<div class="ethnic-homepage__slider-dots" role="tablist" aria-label="Testimonial slides">
<?php foreach ( $testimonials as $testimonial_index => $testimonial ) : ?>
<button
type="button"
class="ethnic-homepage__slider-dot<?php echo 0 === $testimonial_index ? ' is-active' : ''; ?>"
data-loop-dot="<?php echo esc_attr( $testimonial_index ); ?>"
aria-label="<?php echo esc_attr( sprintf( 'Show slide %d: %s', $testimonial_index + 1, $testimonial['name'] ) ); ?>"
aria-selected="<?php echo 0 === $testimonial_index ? 'true' : 'false'; ?>"
tabindex="<?php echo 0 === $testimonial_index ? '0' : '-1'; ?>"
></button>
<?php endforeach; ?>
</div>
</div>
<div class="ethnic-homepage__slider-arrows ethnic-homepage__testimonial-slider-controls">
<button type="button" class="ethnic-homepage__slider-arrow ethnic-homepage__testimonial-slider-arrow ethnic-homepage__testimonial-slider-arrow--prev" data-loop-prev aria-controls="ethnic-testimonial-slider-track" aria-label="Show previous testimonial">
<span aria-hidden="true">←</span>
</button>
<button type="button" class="ethnic-homepage__slider-arrow ethnic-homepage__testimonial-slider-arrow ethnic-homepage__testimonial-slider-arrow--next" data-loop-next aria-controls="ethnic-testimonial-slider-track" aria-label="Show next testimonial">
<span aria-hidden="true">→</span>
</button>
</div>
</div>
<div class="ethnic-homepage__review-widget-shell">
<div
class="review-widget_net"
data-uuid="40208ffe-a0bf-4287-9a3d-f1663689fb37"
data-template="2"
data-lang="en"
data-theme="light"
></div>
</div>
</div>
</div>
</div>
</section>
<section class="ethnic-homepage__section ethnic-homepage__section--insights" id="home-insights">
<div class="ethnic-homepage__shell">
<div class="ethnic-homepage__insights-layout">
<div class="ethnic-homepage__insights-intro">
<div class="ethnic-homepage__insights-intro-inner">
<h2 class="ethnic-homepage__title">Commerce Insights</h2>
<span class="ethnic-homepage__insights-divider" aria-hidden="true"></span>
<p class="ethnic-homepage__description">Practical notes on Shopify Plus, Adobe Commerce, headless storefronts, and ecommerce delivery decisions.</p>
<a class="ethnic-homepage__insights-cta" href="<?php echo esc_url( $insights_archive_url ); ?>">
<span class="ethnic-homepage__insights-cta-icon" aria-hidden="true"></span>
See All Insights
</a>
</div>
</div>
<div class="ethnic-homepage__insights-slider-shell">
<?php if ( ! empty( $insights_posts ) ) : ?>
<div class="ethnic-homepage__insights-track" data-insights-scroller tabindex="0" role="region" aria-label="Latest blog insights">
<?php foreach ( $insights_posts as $insight ) : ?>
<article class="ethnic-homepage__insight-card">
<a class="ethnic-homepage__insight-link" href="<?php echo esc_url( $insight['url'] ); ?>">
<div class="ethnic-homepage__insight-media">
<?php if ( $insight['image_url'] ) : ?>
<img src="<?php echo esc_url( $insight['image_url'] ); ?>" alt="<?php echo esc_attr( $insight['image_alt'] ); ?>" loading="lazy" decoding="async" />
<?php else : ?>
<div class="ethnic-homepage__insight-media-fallback" aria-hidden="true">
<span>Latest Insight</span>
</div>
<?php endif; ?>
</div>
<div class="ethnic-homepage__insight-body">
<div class="ethnic-homepage__insight-top-meta">
<?php if ( $insight['category'] ) : ?>
<span class="ethnic-homepage__insight-category"><?php echo esc_html( $insight['category'] ); ?></span>
<?php endif; ?>
<time datetime="<?php echo esc_attr( $insight['date_iso'] ); ?>"><?php echo esc_html( $insight['date'] ); ?></time>
</div>
<h3><?php echo esc_html( $insight['title'] ); ?></h3>
<span class="ethnic-homepage__insight-rule" aria-hidden="true"></span>
<p><?php echo esc_html( $insight['excerpt'] ); ?></p>
<div class="ethnic-homepage__insight-footer-meta">
<span><?php echo esc_html( sprintf( '%d Min Read', (int) $insight['reading_time'] ) ); ?></span>
<?php if ( null !== $insight['views'] ) : ?>
<span><?php echo esc_html( number_format_i18n( (int) $insight['views'] ) . ' Views' ); ?></span>
<?php endif; ?>
</div>
</div>
</a>
</article>
<?php endforeach; ?>
</div>
<?php else : ?>
<div class="ethnic-homepage__insights-empty">
<p>New insights are on the way. Explore our blog archive for the latest updates.</p>
<a class="ethnic-homepage__button ethnic-homepage__button--secondary" href="<?php echo esc_url( $insights_archive_url ); ?>">View Blog Archive</a>
</div>
<?php endif; ?>
</div>
</div>
</div>
</section>
<section class="ethnic-homepage__section ethnic-homepage__section--faq" id="home-faq">
<div class="ethnic-homepage__shell">
<div class="ethnic-homepage__faq-shell">
<div class="ethnic-homepage__faq-heading">
<h2 class="ethnic-homepage__title">Frequently Asked Questions</h2>
<p class="ethnic-homepage__description">Find quick answers about platforms, delivery scope, team structure, and ecommerce build planning.</p>
</div>
<div class="ethnic-homepage__faq-list" data-faq-accordion>
<?php foreach ( $faqs as $faq_index => $faq_item ) : ?>
<?php
$faq_trigger_id = 'ethnic-faq-trigger-' . ( $faq_index + 1 );
$faq_panel_id = 'ethnic-faq-panel-' . ( $faq_index + 1 );
?>
<article class="ethnic-homepage__faq-item" data-faq-item>
<h3>
<button
type="button"
class="ethnic-homepage__faq-trigger"
id="<?php echo esc_attr( $faq_trigger_id ); ?>"
data-faq-trigger
aria-expanded="false"
aria-controls="<?php echo esc_attr( $faq_panel_id ); ?>"
>
<span class="ethnic-homepage__faq-question"><?php echo esc_html( $faq_item['question'] ); ?></span>
<span class="ethnic-homepage__faq-icon" aria-hidden="true">
<span class="ethnic-homepage__faq-icon-bar ethnic-homepage__faq-icon-bar--horizontal"></span>
<span class="ethnic-homepage__faq-icon-bar ethnic-homepage__faq-icon-bar--vertical"></span>
</span>
</button>
</h3>
<div
class="ethnic-homepage__faq-panel"
id="<?php echo esc_attr( $faq_panel_id ); ?>"
data-faq-panel
role="region"
aria-labelledby="<?php echo esc_attr( $faq_trigger_id ); ?>"
hidden
>
<div class="ethnic-homepage__faq-panel-inner">
<p><?php echo esc_html( $faq_item['answer'] ); ?></p>
</div>
</div>
</article>
<?php endforeach; ?>
</div>
<div class="ethnic-homepage__faq-cta">
<p>Still have questions? Tell us what you're building.</p>
<a class="ethnic-homepage__button ethnic-homepage__button--primary" href="<?php echo esc_url( $consultation_url ); ?>">Start Your Build</a>
</div>
</div>
</div>
</section>
<section class="ethnic-homepage__section ethnic-homepage__section--cta" id="home-contact-form">
<div class="ethnic-homepage__shell">
<div class="ethnic-homepage__cta-layout">
<div class="ethnic-homepage__cta-copy">
<span class="ethnic-homepage__kicker">Ready to Build?</span>
<h2 class="ethnic-homepage__title">Ready to Build?</h2>
<p class="ethnic-homepage__description">Tell us what you're building. We'll tell you what's possible and what it'll take. No sales deck. No minimum spend pitch. Just a straight conversation.</p>
<div class="ethnic-homepage__button-row">
<a class="ethnic-homepage__button ethnic-homepage__button--primary" href="<?php echo esc_url( $consultation_url ); ?>">Start Your Build</a>
<a class="ethnic-homepage__button ethnic-homepage__button--secondary" href="<?php echo esc_url( $proposal_url ); ?>">See Our Work</a>
</div>
<div class="ethnic-homepage__contact-points">
<p><strong>Email:</strong> info@ethnicinfotech.com</p>
<p><strong>Phone:</strong> +91 7874-341-000</p>
<p><strong>Explore:</strong> <a href="<?php echo esc_url( $services_url ); ?>">Services</a> <span>/</span> <a href="<?php echo esc_url( $about_url ); ?>">About</a> <span>/</span> <a href="<?php echo esc_url( $works_url ); ?>">Case Studies</a></p>
</div>
</div>
<div class="ethnic-homepage__form-card">
<div class="ethnic-homepage__form-header">
<span class="ethnic-homepage__form-kicker">Start Your Build</span>
<h3>Share a few details and we'll tell you what the right next step looks like.</h3>
</div>
<div class="ethnic-homepage__form-shell">
<?php echo $form_markup; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
</div>
</div>
</div>
</section>
</div>
<?php
return ob_get_clean();
}
}
if ( ! function_exists( 'ethnic_home_hero_elementor_stack' ) ) {
function ðnic_home_hero_elementor_stack() {
if ( ! isset( $GLOBALS['ethnic_home_hero_elementor_stack'] ) || ! is_array( $GLOBALS['ethnic_home_hero_elementor_stack'] ) ) {
$GLOBALS['ethnic_home_hero_elementor_stack'] = array();
}
return $GLOBALS['ethnic_home_hero_elementor_stack'];
}
}
if ( ! function_exists( 'ethnic_home_hero_track_elementor_document' ) ) {
function ethnic_home_hero_track_elementor_document( $data, $post_id ) {
if ( ! ethnic_home_hero_should_render() || empty( $data ) ) {
return $data;
}
$stack = ðnic_home_hero_elementor_stack();
$stack[] = (int) $post_id;
return $data;
}
add_filter( 'elementor/frontend/builder_content_data', 'ethnic_home_hero_track_elementor_document', 10, 2 );
}
if ( ! function_exists( 'ethnic_home_hero_prepend_elementor_markup' ) ) {
function ethnic_home_hero_prepend_elementor_markup( $content ) {
if ( ! ethnic_home_hero_should_render() || false !== strpos( $content, 'class="ethnic-homepage"' ) ) {
return $content;
}
$stack = ethnic_home_hero_elementor_stack();
$current_document = ! empty( $stack ) ? (int) end( $stack ) : 0;
$target_document = ethnic_home_hero_target_page_id();
if ( ! $target_document || $current_document !== $target_document ) {
return $content;
}
return ethnic_home_hero_markup();
}
add_filter( 'elementor/frontend/the_content', 'ethnic_home_hero_prepend_elementor_markup', 5 );
}
if ( ! function_exists( 'ethnic_home_hero_untrack_elementor_document' ) ) {
function ethnic_home_hero_untrack_elementor_document() {
$stack = ðnic_home_hero_elementor_stack();
if ( ! empty( $stack ) ) {
array_pop( $stack );
}
}
add_action( 'elementor/frontend/get_builder_content', 'ethnic_home_hero_untrack_elementor_document', 10, 3 );
}