// // Keyed off DOCUMENT_ROOT rather than __DIR__ on purpose. Every docroot is // a sibling of _universal on all three servers (/var/www on SAAS and WDN, // ~/public_html on WHOIS), so this one line is correct everywhere AND at // any depth. __DIR__ . '/../_universal/...' only resolves correctly from a // file sitting directly in the docroot: from something like // blocks/head.php it silently points at /blocks/../_universal, // which does not exist. A third of these sites emit their head from a // subdirectory, so that form would have failed on about a dozen of them. // // An absolute path would need a different line per server, which is the // drift this file exists to remove. // // Safe to include more than once per request; it emits on the first call // and no-ops afterwards. // // // TO CHANGE A TAG, OR SWITCH A SITE ON // // Edit $GA_MEASUREMENT below. Nothing else anywhere needs touching, on any // server, for any site. That is the entire point of this file. // // A host with no entry below emits NOTHING - not an empty script tag, not // a comment. So the include can be rolled out to every site first, with // zero change to any page, and the tags switched on later by editing this // file alone. Rolling out the include and turning on tracking are // deliberately two separate, independently reversible steps. // // // WHAT THIS DOES NOT COVER, AND WHY // // Only pages that route through a site's index.php get a tag, because // that is where the include goes. Pages reached directly, and any static // .html left in a docroot, are not covered. That is an accepted decision, // not an oversight: those files are being cleaned up so that index.php is // the only thing emitting a head, and coverage improves on its own as that // lands. See the exceptions list below for the current gaps. // // // EXCEPTIONS - sites deliberately or unavoidably not covered right now. // Keep this list current. It is the only record of what is missing. // // bytomasz.com user domain, out of scope by decision // darataylor.com user domain, out of scope by decision // // calodash.com has no index.php at all, so there is no front // door to put the include in. Needs a look before // it can be covered. // // actoremail.com no docroot of their own on SAAS, WDN or WHOIS. // findhealthspa.com Both resolve and serve pages, so each is aliased // onto some other vhost or pointed at another // folder. Where they are actually served from is // unresolved. // // Legacy static .html pages, roughly 134 of them across the estate and // concentrated in everysingleblog.com, mueue.com, reels.link, // hiredactor.com and actorslinkup.com. Not reachable from PHP, so nothing // here can tag them. They go away with the index.php cleanup. // // // Measurement IDs, keyed by bare host - no www, no port, lowercase. // // Empty on purpose until the GA4 properties exist. Add entries as // 'domain.com' => 'G-XXXXXXXXXX'. // $GA_MEASUREMENT = array( // 'webforactors.com' => 'G-...', // 'actorsforum.com' => 'G-...', // 'youbackstage.com' => 'G-...', ); // // Nothing below here should need editing to add or change a site. // // Never during CLI or cron work: those have no page to tag and no host to // key off, and a stray script tag in generated output is a real bug. if( PHP_SAPI === 'cli' ) return; // One tag per request. Guards against a page that includes this from both a // head partial and its own , which would otherwise double-count every // pageview in that property. if( defined( 'GA_TAG_EMITTED' ) ) return; // Host as the config is keyed: strip the port, drop a leading www, lowercase. $GA_HOST = strtolower( (string) ( $_SERVER['HTTP_HOST'] ?? '' ) ); $GA_HOST = explode( ':', $GA_HOST )[0]; $GA_HOST = preg_replace( '/^www\./', '', $GA_HOST ); if( $GA_HOST === '' || empty( $GA_MEASUREMENT[ $GA_HOST ] ) ) return; $GA_ID = $GA_MEASUREMENT[ $GA_HOST ]; // Belt and braces. Everything in the array is ours and static, but this is // echoed into a script tag on every page of every site, so it is validated // rather than trusted: a typo that broke the shape would break every page it // reached, not just fail to track. if( !preg_match( '/^G-[A-Z0-9]{4,20}$/', $GA_ID ) ) return; define( 'GA_TAG_EMITTED', true ); ?>

SCHOOLS & COACHES

Build a smart actor website in 90 seconds! Click here to begin.

QR Business Cards for Actors

QR Business Cards for Actors

07.26.2025 A Card That Takes Casting Straight to Your Website
Check it out »
Timeline View for Your Career

Timeline View for Your Career

05.24.2025 Your Credits Laid Out as a Career at a Glance
Check it out »

Niche professional websites for people in the film and TV industry.

Weeee, you found me!

I'm your buddy Bottie, I was hiding behind the scenes, but now that you've found me I'd be happy to tell you what I'm doing.

Actor Website helper: Bottie

I just wrote a few fun facts about Web For Actors

Would you like to take a look?
Click here to check them out. I hope it will cause involuntary audible response.