Skip to content

DO AudioTours Player Installation Guide

The DO AudioTours player can be integrated into your real estate website in several ways. Choose the method that best fits your platform and technical requirements.

1. Direct Template Integration

Best for: IDX templates, custom-built websites, or direct access to listing page templates.

<!-- Player Component -->
<do-audio-tour-player-v2
    listingId="[MLS_NUMBER]"
    zipCode="[ZIP_CODE]"
    pageTranslate="true"
    playerTheme="light"
    defaultLanguage="en-US">
</do-audio-tour-player-v2>

<!-- Required Script - Place in header or before closing body tag -->
<script id="do-audio-tour-player" 
    type="module" 
    src="https://player.doaudiotours.com/do-audio-tour-player-v2.js?key=[YOUR_API_KEY]">
</script>

IDX Platform Examples

IDX Broker

// In your wrapper footer or listing template
if (window.location.href.includes('/idx/details/listing/')) {
    const mlsNumber = document.querySelector('meta[name="IDXNumber"]')?.content;
    const container = document.querySelector('#IDX-details');

    if (mlsNumber && container) {
        const player = document.createElement('do-audio-tour-player-v2');
        player.setAttribute('listingId', mlsNumber);
        player.setAttribute('zipCode', document.querySelector('meta[name="IDXZipCode"]')?.content || '');
        player.setAttribute('pageTranslate', 'true');
        player.setAttribute('playerTheme', 'light');

        container.insertBefore(player, container.querySelector('#IDX-description'));
    }
}

iHomefinder

document.addEventListener('ihfPropertyDetail', function(event) {
    const mlsNumber = event.detail.listingData.mlsNumber;
    const container = document.querySelector('.ihf-detail-container');

    if (mlsNumber && container) {
        const player = document.createElement('do-audio-tour-player-v2');
        player.setAttribute('listingId', mlsNumber);
        player.setAttribute('zipCode', event.detail.listingData.zip);
        player.setAttribute('pageTranslate', 'true');
        player.setAttribute('playerTheme', 'light');

        container.insertBefore(player, container.querySelector('.ihf-detail-features-info'));
    }
});

2. WordPress with IDX Integration

Best for: WordPress sites using popular IDX plugins. Each IDX plugin requires slightly different implementation.

IDX Broker WordPress Plugin

// In your theme's functions.php
function add_do_audio_player_script() {
    // Only load on IDX Broker detail pages
    if (function_exists('idx_is_listing_detail_page') && idx_is_listing_detail_page()) {
        wp_enqueue_script(
            'do-audio-player',
            'https://player.doaudiotours.com/do-audio-tour-player-v2.js?key=[YOUR_API_KEY]',
            array(),
            null,
            true
        );
    }
}
add_action('wp_enqueue_scripts', 'add_do_audio_player_script');

// In your idx-broker-platinum/views/details.php template or via action hook
function add_do_audio_player_markup() {
    if (function_exists('idx_is_listing_detail_page') && idx_is_listing_detail_page()) {
        $mls_number = idx_get_listing_meta('listingID');
        $zip_code = idx_get_listing_meta('zipcode');

        if ($mls_number) {
            echo '<do-audio-tour-player-v2
                listingId="' . esc_attr($mls_number) . '"
                zipCode="' . esc_attr($zip_code) . '"
                pageTranslate="true"
                playerTheme="light">
            </do-audio-tour-player-v2>';
        }
    }
}
add_action('idx_after_listing_description', 'add_do_audio_player_markup');

IMPress Listings (by IDX Broker)

// In your theme's functions.php
function add_do_audio_player_script() {
    // Check if we're on an IMPress listing page
    if (is_singular('listing')) {
        wp_enqueue_script(
            'do-audio-player',
            'https://player.doaudiotours.com/do-audio-tour-player-v2.js?key=[YOUR_API_KEY]',
            array(),
            null,
            true
        );
    }
}
add_action('wp_enqueue_scripts', 'add_do_audio_player_script');

// In your single-listing.php template
function add_do_audio_player_markup() {
    if (is_singular('listing')) {
        $mls_number = get_post_meta(get_the_ID(), '_listing_mls', true);
        $zip_code = get_post_meta(get_the_ID(), '_listing_zip', true);

        if ($mls_number) {
            echo '<do-audio-tour-player-v2
                listingId="' . esc_attr($mls_number) . '"
                zipCode="' . esc_attr($zip_code) . '"
                pageTranslate="true"
                playerTheme="light">
            </do-audio-tour-player-v2>';
        }
    }
}
add_action('impress_after_listing_details', 'add_do_audio_player_markup');

iHomefinder WordPress Plugin

// In your theme's functions.php
function add_do_audio_player_script() {
    // Check if we're on an iHomefinder listing page
    if (function_exists('ihf_is_listing_detail') && ihf_is_listing_detail()) {
        wp_enqueue_script(
            'do-audio-player',
            'https://player.doaudiotours.com/do-audio-tour-player-v2.js?key=[YOUR_API_KEY]',
            array(),
            null,
            true
        );

        // Add initialization script
        add_action('wp_footer', function() {
            ?>
            <script>
            document.addEventListener('ihfPropertyDetail', function(event) {
                const mlsNumber = event.detail.listingData.mlsNumber;
                const container = document.querySelector('.ihf-detail-container');

                if (mlsNumber && container) {
                    const player = document.createElement('do-audio-tour-player-v2');
                    player.setAttribute('listingId', mlsNumber);
                    player.setAttribute('zipCode', event.detail.listingData.zip);
                    player.setAttribute('pageTranslate', 'true');
                    player.setAttribute('playerTheme', 'light');

                    container.insertBefore(player, container.querySelector('.ihf-detail-features-info'));
                }
            });
            </script>
            <?php
        });
    }
}
add_action('wp_enqueue_scripts', 'add_do_audio_player_script');

3. Google Tag Manager Installation

Best for: Sites where direct template modification isn't possible or when you need flexible deployment rules.

  1. Create a new Custom HTML tag in GTM
  2. Add the following code:

    <script>
    (function() {
      // Only proceed if we're on a listing page
      if (!isListingPage()) return; // See helper function below
    
      // Create and insert the script
      const script = document.createElement('script');
      script.id = 'do-audio-tour-player';
      script.type = 'module';
      script.src = 'https://player.doaudiotours.com/do-audio-tour-player-v2.js?key=[YOUR_API_KEY]';
      document.head.appendChild(script);
    
      // Create and insert the player when MLS number is available
      const mlsNumber = getMLSNumber(); // See helper function below
      if (mlsNumber) {
        const player = document.createElement('do-audio-tour-player-v2');
        player.setAttribute('listingId', mlsNumber);
        player.setAttribute('pageTranslate', 'true');
        player.setAttribute('playerTheme', 'light');
    
        // Insert the player in your desired location
        const container = getListingContainer(); // See helper function below
        if (container) {
          container.appendChild(player);
        }
      }
    })();
    
    // Helper Functions - Customize these for your website
    function isListingPage() {
      // Common patterns for listing pages
      return (
        window.location.href.includes('/idx/details/') ||
        window.location.href.includes('/property/') ||
        document.querySelector('#listing-details') !== null ||
        document.querySelector('.property-details') !== null
      );
    }
    
    function getMLSNumber() {
      // Common patterns for finding MLS numbers
      return (
        document.querySelector('meta[name="IDXNumber"]')?.content ||
        document.querySelector('[data-mls]')?.getAttribute('data-mls') ||
        document.querySelector('.mls-number')?.textContent?.trim() ||
        window.listingData?.mlsNumber
      );
    }
    
    function getListingContainer() {
      // Common patterns for listing containers
      return (
        document.querySelector('#IDX-details') ||
        document.querySelector('.property-details') ||
        document.querySelector('#listing-content')
      );
    }
    </script>
    

  3. Set trigger conditions:

    • Page Path contains /idx/details/ or /property/
    • DOM Element with class 'property-details' exists
    • Custom Variable matching your listing page pattern

Configuration Options

Required Parameters

Parameter Description Example
key MLO API key key="your-api-key-here"
listingId MLS number or listing identifier listingId="2405225"

Optional Parameters

Parameter Default Description Example
zipCode "" Property ZIP code zipCode="45245"
playerWidth "100%" Player width playerWidth="500px"
pageTranslate false Enable page translation pageTranslate="true"
playerTheme "dark" Visual theme playerTheme="light"
defaultLanguage "en-US" Default language defaultLanguage="es-US"

Implementation Tips

Detecting Listing Pages

Common methods across platforms:

  • URL patterns (e.g., /idx/details/, /property/)
  • WordPress conditional functions (e.g., is_singular('listing'))
  • IDX plugin functions (e.g., idx_is_listing_detail_page())
  • Presence of specific DOM elements
  • Custom post types and taxonomies

Finding MLS Numbers

Common locations:

  • WordPress post meta
  • IDX plugin functions and hooks
  • Meta tags
  • Data attributes
  • URL parameters
  • JavaScript variables

Best Practices

  1. Load the script only on listing pages
  2. Use platform-specific hooks and functions when available
  3. Handle dynamic page loads (common in IDX platforms)
  4. Add error handling for missing MLS numbers
  5. Test on mobile devices
  6. Verify page translation functionality
  7. Consider caching implications with IDX data

Support

Having technical issues? Check our:

Need implementation support? See our Contact & Support page.