Add custom page templates for Home, Contact, and Services

- Created a new Contact Page template with a contact form and information section.
- Developed a Home Page template featuring a hero section, core capabilities, and pricing details.
- Introduced a Services Page template outlining core services and industry solutions.
- Added a default page template for standard pages without a custom template.
- Implemented a single post template for displaying individual blog posts.
- Created a style.css file for theme metadata and styling.
This commit is contained in:
Matt Batchelder
2026-02-19 09:10:01 -05:00
commit 9fddd43a2c
21 changed files with 2959 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

179
ots-signs-import.xml Normal file
View File

@@ -0,0 +1,179 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!-- WordPress eXtended RSS — OTS Signs full site import with editable meta fields -->
<rss version="2.0"
xmlns:excerpt="http://wordpress.org/export/1.2/excerpt/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:wp="http://wordpress.org/export/1.2/"
>
<channel>
<title>OTS Signs</title>
<link>https://ots-signs.com</link>
<description>The Complete Digital Signage Solution</description>
<pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate>
<language>en-US</language>
<wp:wxr_version>1.2</wp:wxr_version>
<wp:base_site_url>https://ots-signs.com</wp:base_site_url>
<wp:base_blog_url>https://ots-signs.com</wp:base_blog_url>
<wp:author>
<wp:author_id>1</wp:author_id>
<wp:author_login><![CDATA[admin]]></wp:author_login>
<wp:author_email><![CDATA[admin@ots-signs.com]]></wp:author_email>
<wp:author_display_name><![CDATA[OTS Signs]]></wp:author_display_name>
<wp:author_first_name><![CDATA[OTS]]></wp:author_first_name>
<wp:author_last_name><![CDATA[Signs]]></wp:author_last_name>
</wp:author>
<!-- ══════════════════════════════════════════════════════
PAGE: Home
══════════════════════════════════════════════════════════ -->
<item>
<title>Home</title>
<link>https://ots-signs.com/</link>
<pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate>
<dc:creator><![CDATA[admin]]></dc:creator>
<content:encoded><![CDATA[]]></content:encoded>
<excerpt:encoded><![CDATA[]]></excerpt:encoded>
<wp:post_id>2</wp:post_id>
<wp:post_date><![CDATA[2026-02-19 00:00:00]]></wp:post_date>
<wp:post_date_gmt><![CDATA[2026-02-19 00:00:00]]></wp:post_date_gmt>
<wp:comment_status><![CDATA[closed]]></wp:comment_status>
<wp:ping_status><![CDATA[closed]]></wp:ping_status>
<wp:post_name><![CDATA[home]]></wp:post_name>
<wp:status><![CDATA[publish]]></wp:status>
<wp:post_parent>0</wp:post_parent>
<wp:menu_order>0</wp:menu_order>
<wp:post_type><![CDATA[page]]></wp:post_type>
<wp:post_password><![CDATA[]]></wp:post_password>
<wp:is_sticky>0</wp:is_sticky>
<wp:postmeta><wp:meta_key><![CDATA[_wp_page_template]]></wp:meta_key><wp:meta_value><![CDATA[page-home.php]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[hero_title]]></wp:meta_key><wp:meta_value><![CDATA[Turn any screen into a <span class="highlight">dynamic communication</span> tool for your business.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[hero_description]]></wp:meta_key><wp:meta_value><![CDATA[The complete package for engaging digital signage. From eye-catching retail displays to dynamic informational screens, we craft tailored solutions that capture attention and deliver your message.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[hero_cta_primary_label]]></wp:meta_key><wp:meta_value><![CDATA[Get in Touch]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[hero_cta_secondary_label]]></wp:meta_key><wp:meta_value><![CDATA[View Demo]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[stat_1_value]]></wp:meta_key><wp:meta_value><![CDATA[500+]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[stat_1_label]]></wp:meta_key><wp:meta_value><![CDATA[Screens Managed]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[stat_2_value]]></wp:meta_key><wp:meta_value><![CDATA[6]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[stat_2_label]]></wp:meta_key><wp:meta_value><![CDATA[Industry Verticals]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[stat_3_value]]></wp:meta_key><wp:meta_value><![CDATA[99.9%]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[stat_3_label]]></wp:meta_key><wp:meta_value><![CDATA[Uptime SLA]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[features_heading]]></wp:meta_key><wp:meta_value><![CDATA[Everything You Need for Engaging Digital Signage]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[features_subheading]]></wp:meta_key><wp:meta_value><![CDATA[We provide a complete, end-to-end digital signage solution — from hardware to content management to live data integrations.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[industries_heading]]></wp:meta_key><wp:meta_value><![CDATA[Our Services Empower Your Brand]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[industries_subheading]]></wp:meta_key><wp:meta_value><![CDATA[Modern businesses need real-time communication. Digital signage helps you connect with your audience where it matters most.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[pricing_heading]]></wp:meta_key><wp:meta_value><![CDATA[Affordable Solutions, Scalable Options]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[pricing_subheading]]></wp:meta_key><wp:meta_value><![CDATA[All plans include content scheduling/day-parting, live data integrations, unlimited user seats, and the ability to publish content to your signs in minutes.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[cta_heading]]></wp:meta_key><wp:meta_value><![CDATA[Ready to Transform Your Screens?]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[cta_description]]></wp:meta_key><wp:meta_value><![CDATA[Get in touch today and discover how OTS Signs can revolutionize the way you communicate with your audience.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[_yoast_wpseo_title]]></wp:meta_key><wp:meta_value><![CDATA[OTS Signs The Complete Digital Signage Solution]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[_yoast_wpseo_metadesc]]></wp:meta_key><wp:meta_value><![CDATA[Turn any screen into a dynamic communication tool. OTS Signs delivers complete digital signage solutions for hospitality, retail, corporate, and more.]]></wp:meta_value></wp:postmeta>
</item>
<!-- ══════════════════════════════════════════════════════
PAGE: About
══════════════════════════════════════════════════════════ -->
<item>
<title>About</title>
<link>https://ots-signs.com/about/</link>
<pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate>
<dc:creator><![CDATA[admin]]></dc:creator>
<content:encoded><![CDATA[]]></content:encoded>
<excerpt:encoded><![CDATA[]]></excerpt:encoded>
<wp:post_id>3</wp:post_id>
<wp:post_date><![CDATA[2026-02-19 00:00:00]]></wp:post_date>
<wp:post_date_gmt><![CDATA[2026-02-19 00:00:00]]></wp:post_date_gmt>
<wp:comment_status><![CDATA[closed]]></wp:comment_status>
<wp:ping_status><![CDATA[closed]]></wp:ping_status>
<wp:post_name><![CDATA[about]]></wp:post_name>
<wp:status><![CDATA[publish]]></wp:status>
<wp:post_parent>0</wp:post_parent>
<wp:menu_order>1</wp:menu_order>
<wp:post_type><![CDATA[page]]></wp:post_type>
<wp:post_password><![CDATA[]]></wp:post_password>
<wp:is_sticky>0</wp:is_sticky>
<wp:postmeta><wp:meta_key><![CDATA[_wp_page_template]]></wp:meta_key><wp:meta_value><![CDATA[page-about.php]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[hero_title]]></wp:meta_key><wp:meta_value><![CDATA[The Complete Digital Signage Solution]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[hero_description]]></wp:meta_key><wp:meta_value><![CDATA[We help businesses of all sizes connect with their audiences through powerful, easy-to-manage digital signage.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[about_heading]]></wp:meta_key><wp:meta_value><![CDATA[Bringing Your Message to Life on Every Screen]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[about_intro]]></wp:meta_key><wp:meta_value><![CDATA[OTS Signs is a digital signage company dedicated to transforming how businesses communicate with their audiences. We offer a complete, end-to-end solution — from the hardware players to our cloud management platform to custom content creation.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[about_body]]></wp:meta_key><wp:meta_value><![CDATA[Digital signage is the modern way to connect with your audience, transforming any screen into a way to communicate and engage. Whether you need an eye-catching retail display, a dynamic menu board, or enterprise-grade live data dashboards, we deliver solutions that capture attention and get results.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[cta_heading]]></wp:meta_key><wp:meta_value><![CDATA[Let's Build Something Great Together]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[cta_description]]></wp:meta_key><wp:meta_value><![CDATA[Ready to see what OTS Signs can do for your business? Get in touch or explore our demo platform.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[_yoast_wpseo_title]]></wp:meta_key><wp:meta_value><![CDATA[About OTS Signs Complete Digital Signage Solutions]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[_yoast_wpseo_metadesc]]></wp:meta_key><wp:meta_value><![CDATA[Learn about OTS Signs, an Oribi Technology Services company delivering complete, end-to-end digital signage solutions for businesses of all sizes.]]></wp:meta_value></wp:postmeta>
</item>
<!-- ══════════════════════════════════════════════════════
PAGE: Services
══════════════════════════════════════════════════════════ -->
<item>
<title>Services</title>
<link>https://ots-signs.com/services/</link>
<pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate>
<dc:creator><![CDATA[admin]]></dc:creator>
<content:encoded><![CDATA[]]></content:encoded>
<excerpt:encoded><![CDATA[]]></excerpt:encoded>
<wp:post_id>4</wp:post_id>
<wp:post_date><![CDATA[2026-02-19 00:00:00]]></wp:post_date>
<wp:post_date_gmt><![CDATA[2026-02-19 00:00:00]]></wp:post_date_gmt>
<wp:comment_status><![CDATA[closed]]></wp:comment_status>
<wp:ping_status><![CDATA[closed]]></wp:ping_status>
<wp:post_name><![CDATA[services]]></wp:post_name>
<wp:status><![CDATA[publish]]></wp:status>
<wp:post_parent>0</wp:post_parent>
<wp:menu_order>2</wp:menu_order>
<wp:post_type><![CDATA[page]]></wp:post_type>
<wp:post_password><![CDATA[]]></wp:post_password>
<wp:is_sticky>0</wp:is_sticky>
<wp:postmeta><wp:meta_key><![CDATA[_wp_page_template]]></wp:meta_key><wp:meta_value><![CDATA[page-services.php]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[hero_title]]></wp:meta_key><wp:meta_value><![CDATA[Services & Solutions]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[hero_description]]></wp:meta_key><wp:meta_value><![CDATA[From content creation to cloud management to live data integrations — we deliver everything you need for a complete digital signage deployment.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[services_heading]]></wp:meta_key><wp:meta_value><![CDATA[The Complete Package for Engaging Digital Signage]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[services_subheading]]></wp:meta_key><wp:meta_value><![CDATA[Every service we offer is designed to make your digital signage as impactful, reliable, and easy to manage as possible.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[pricing_heading]]></wp:meta_key><wp:meta_value><![CDATA[Affordable Solutions, Scalable Options]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[pricing_subheading]]></wp:meta_key><wp:meta_value><![CDATA[Simple, transparent pricing with no hidden fees. Choose the plan that fits your business size.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[cta_heading]]></wp:meta_key><wp:meta_value><![CDATA[Want to See How Our Platform Works?]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[cta_description]]></wp:meta_key><wp:meta_value><![CDATA[Request access to our demo instance and explore the OTS Signs platform hands-on.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[_yoast_wpseo_title]]></wp:meta_key><wp:meta_value><![CDATA[Services Digital Signage Solutions by OTS Signs]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[_yoast_wpseo_metadesc]]></wp:meta_key><wp:meta_value><![CDATA[From digital menu boards to live data integrations and offline playback — explore the full range of digital signage services offered by OTS Signs.]]></wp:meta_value></wp:postmeta>
</item>
<!-- ══════════════════════════════════════════════════════
PAGE: Contact
══════════════════════════════════════════════════════════ -->
<item>
<title>Contact</title>
<link>https://ots-signs.com/contact/</link>
<pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate>
<dc:creator><![CDATA[admin]]></dc:creator>
<content:encoded><![CDATA[]]></content:encoded>
<excerpt:encoded><![CDATA[]]></excerpt:encoded>
<wp:post_id>5</wp:post_id>
<wp:post_date><![CDATA[2026-02-19 00:00:00]]></wp:post_date>
<wp:post_date_gmt><![CDATA[2026-02-19 00:00:00]]></wp:post_date_gmt>
<wp:comment_status><![CDATA[closed]]></wp:comment_status>
<wp:ping_status><![CDATA[closed]]></wp:ping_status>
<wp:post_name><![CDATA[contact]]></wp:post_name>
<wp:status><![CDATA[publish]]></wp:status>
<wp:post_parent>0</wp:post_parent>
<wp:menu_order>3</wp:menu_order>
<wp:post_type><![CDATA[page]]></wp:post_type>
<wp:post_password><![CDATA[]]></wp:post_password>
<wp:is_sticky>0</wp:is_sticky>
<wp:postmeta><wp:meta_key><![CDATA[_wp_page_template]]></wp:meta_key><wp:meta_value><![CDATA[page-contact.php]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[hero_title]]></wp:meta_key><wp:meta_value><![CDATA[Get in Touch]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[hero_description]]></wp:meta_key><wp:meta_value><![CDATA[Ready to transform your screens? We'd love to hear about your project. Drop us a message and we'll get back to you promptly.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[contact_heading]]></wp:meta_key><wp:meta_value><![CDATA[Let's Start the Conversation]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[contact_subheading]]></wp:meta_key><wp:meta_value><![CDATA[Whether you're looking for a quote, want to see a demo, or just have questions — we're here to help.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[contact_email]]></wp:meta_key><wp:meta_value><![CDATA[info@ots-signs.com]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[demo_heading]]></wp:meta_key><wp:meta_value><![CDATA[Explore Our Demo Platform]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[demo_description]]></wp:meta_key><wp:meta_value><![CDATA[See the OTS Signs CMS in action. Request access to our live demo instance and experience the platform for yourself before making any commitment.]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[_yoast_wpseo_title]]></wp:meta_key><wp:meta_value><![CDATA[Contact OTS Signs Get in Touch]]></wp:meta_value></wp:postmeta>
<wp:postmeta><wp:meta_key><![CDATA[_yoast_wpseo_metadesc]]></wp:meta_key><wp:meta_value><![CDATA[Ready to transform your screens? Get in touch with OTS Signs today to discuss your digital signage project or request a demo.]]></wp:meta_value></wp:postmeta>
</item>
</channel>
</rss>

BIN
ots-signs-setup-plugin.zip Normal file

Binary file not shown.

BIN
ots-signs-theme.zip Normal file

Binary file not shown.

BIN
wp-content/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,139 @@
<?php
/**
* Plugin Name: OTS Signs One-Click Site Setup
* Description: Run once after importing pages and activating the OTS Signs theme. Sets the front page, creates the navigation menu, and configures site options. Delete this plugin when done.
* Version: 1.0.0
* Author: OTS Signs
*/
if ( ! defined( 'ABSPATH' ) ) exit;
// ─── Run setup on plugin activation ───────────────────────────────────────────
register_activation_hook( __FILE__, 'ots_setup_run' );
function ots_setup_run() {
// 1. Site identity
update_option( 'blogname', 'OTS Signs' );
update_option( 'blogdescription', 'The Complete Digital Signage Solution' );
// 2. Set reading settings — show a static front page
update_option( 'show_on_front', 'page' );
// 3. Find the pages by slug and set front/posts page
$home_page = get_page_by_path( 'home' );
if ( $home_page ) {
update_option( 'page_on_front', $home_page->ID );
}
// 4. Permalinks — set to post name
update_option( 'permalink_structure', '/%postname%/' );
flush_rewrite_rules();
// 5. Build the Primary navigation menu
ots_build_primary_menu();
// 6. Disable comments site-wide (marketing site)
update_option( 'default_comment_status', 'closed' );
update_option( 'default_ping_status', 'closed' );
// 7. Set timezone
update_option( 'timezone_string', 'America/New_York' );
// 8. Mark setup as done
update_option( 'ots_setup_done', '1' );
}
function ots_build_primary_menu() {
// Delete existing menu with same name if any
$existing = get_term_by( 'name', 'Primary Menu', 'nav_menu' );
if ( $existing ) {
wp_delete_nav_menu( $existing->term_id );
}
$menu_id = wp_create_nav_menu( 'Primary Menu' );
if ( is_wp_error( $menu_id ) ) return;
$menu_pages = [
[ 'slug' => 'home', 'label' => 'Home' ],
[ 'slug' => 'services', 'label' => 'Services' ],
[ 'slug' => 'about', 'label' => 'About' ],
[ 'slug' => 'contact', 'label' => 'Contact' ],
];
foreach ( $menu_pages as $item ) {
$page = get_page_by_path( $item['slug'] );
if ( ! $page ) continue;
wp_update_nav_menu_item( $menu_id, 0, [
'menu-item-title' => $item['label'],
'menu-item-object-id' => $page->ID,
'menu-item-object' => 'page',
'menu-item-type' => 'post_type',
'menu-item-status' => 'publish',
] );
}
// Assign menu to the 'primary' theme location
$locations = get_theme_mod( 'nav_menu_locations', [] );
$locations['primary'] = $menu_id;
set_theme_mod( 'nav_menu_locations', $locations );
}
// ─── Admin notice ─────────────────────────────────────────────────────────────
add_action( 'admin_notices', 'ots_setup_admin_notice' );
function ots_setup_admin_notice() {
if ( ! current_user_can( 'manage_options' ) ) return;
$done = get_option( 'ots_setup_done' );
?>
<div class="notice notice-<?php echo $done ? 'success' : 'warning'; ?> is-dismissible" style="padding:16px 20px;">
<?php if ( $done ) : ?>
<h3 style="margin:0 0 8px;">&#10003; OTS Signs Setup Complete!</h3>
<p style="margin:0 0 12px;">
Your site has been configured:<br>
&bull; Front page set to <strong>Home</strong><br>
&bull; Primary navigation menu created (Home, Services, About, Contact)<br>
&bull; Permalink structure set to <code>/%postname%/</code><br>
&bull; Comments disabled site-wide
</p>
<p style="margin:0;">
<a href="<?php echo esc_url( admin_url( 'plugins.php' ) ); ?>" class="button button-primary">Go to Plugins to delete this setup plugin</a>
&nbsp;<a href="<?php echo esc_url( home_url( '/' ) ); ?>" class="button" target="_blank">View Site</a>
</p>
<?php else : ?>
<h3 style="margin:0 0 8px;">OTS Signs Site Setup Required</h3>
<p style="margin:0 0 12px;">
The OTS Signs setup plugin is installed but hasn't run yet.
Make sure you have <strong>imported <code>ots-signs-import.xml</code></strong> via
<em>Tools → Import → WordPress</em> first, then deactivate and reactivate this plugin.
</p>
<p style="margin:0;">
<a href="<?php echo esc_url( admin_url( 'import.php' ) ); ?>" class="button button-primary">Go to Import</a>
</p>
<?php endif; ?>
</div>
<?php
}
// ─── Re-run button from plugin list ──────────────────────────────────────────
add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), 'ots_setup_plugin_links' );
function ots_setup_plugin_links( $links ) {
$run_link = '<a href="' . esc_url( wp_nonce_url( admin_url( '?ots_rerun_setup=1' ), 'ots_rerun' ) ) . '" style="color:#2271b1;font-weight:600;">Re-run Setup</a>';
array_unshift( $links, $run_link );
return $links;
}
add_action( 'admin_init', 'ots_maybe_rerun_setup' );
function ots_maybe_rerun_setup() {
if ( ! isset( $_GET['ots_rerun_setup'] ) ) return;
if ( ! current_user_can( 'manage_options' ) ) return;
if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'ots_rerun' ) ) return;
ots_setup_run();
wp_redirect( admin_url( 'plugins.php?ots_setup_reran=1' ) );
exit;
}

Binary file not shown.

View File

@@ -0,0 +1,23 @@
<?php
/**
* 404 Not Found template.
*/
get_header();
?>
<div class="page-header-light"></div>
<section class="section" style="text-align:center;min-height:60vh;display:flex;align-items:center;">
<div class="container">
<div style="font-size:5rem;margin-bottom:1rem;">&#128269;</div>
<h1 style="font-size:clamp(3rem,8vw,6rem);color:var(--color-primary);line-height:1;">404</h1>
<h2 style="margin-bottom:1rem;">Page Not Found</h2>
<p class="lead" style="margin-bottom:2rem;">The page you're looking for doesn't exist or has been moved.</p>
<div class="btn-group" style="justify-content:center;">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" class="btn btn-primary">Back to Home</a>
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-outline">Contact Us</a>
</div>
</div>
</section>
<?php get_footer(); ?>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,142 @@
/**
* OTS Signs — Main JavaScript
*/
( function () {
'use strict';
// ── Sticky header ─────────────────────────────────────────────────────────
const header = document.getElementById( 'site-header' );
if ( header ) {
const onScroll = () => {
header.classList.toggle( 'scrolled', window.scrollY > 40 );
};
window.addEventListener( 'scroll', onScroll, { passive: true } );
onScroll(); // run on init
}
// ── Mobile nav toggle ──────────────────────────────────────────────────────
const navToggle = document.getElementById( 'nav-toggle' );
const siteNav = document.getElementById( 'site-nav' );
if ( navToggle && siteNav ) {
navToggle.addEventListener( 'click', () => {
const isOpen = siteNav.classList.toggle( 'open' );
navToggle.classList.toggle( 'open', isOpen );
navToggle.setAttribute( 'aria-expanded', isOpen );
document.body.style.overflow = isOpen ? 'hidden' : '';
} );
// Close on nav link click
siteNav.querySelectorAll( 'a' ).forEach( link => {
link.addEventListener( 'click', () => {
siteNav.classList.remove( 'open' );
navToggle.classList.remove( 'open' );
navToggle.setAttribute( 'aria-expanded', 'false' );
document.body.style.overflow = '';
} );
} );
}
// ── Scroll-to-top button ──────────────────────────────────────────────────
const scrollTopBtn = document.querySelector( '.scroll-top' );
if ( scrollTopBtn ) {
window.addEventListener( 'scroll', () => {
scrollTopBtn.classList.toggle( 'visible', window.scrollY > 400 );
}, { passive: true } );
scrollTopBtn.addEventListener( 'click', () => {
window.scrollTo( { top: 0, behavior: 'smooth' } );
} );
}
// ── Contact form AJAX ─────────────────────────────────────────────────────
const contactForm = document.getElementById( 'contact-form' );
if ( contactForm ) {
const submitBtn = document.getElementById( 'contact-submit' );
const btnText = submitBtn ? submitBtn.querySelector( '.btn-text' ) : null;
const btnLoading = submitBtn ? submitBtn.querySelector( '.btn-loading' ) : null;
const notice = document.getElementById( 'form-notice' );
contactForm.addEventListener( 'submit', async ( e ) => {
e.preventDefault();
// Basic client-side validation
const name = contactForm.querySelector( '[name="name"]' );
const email = contactForm.querySelector( '[name="email"]' );
const message = contactForm.querySelector( '[name="message"]' );
if ( ! name.value.trim() || ! email.value.trim() || ! message.value.trim() ) {
showNotice( 'error', 'Please fill in all required fields.' );
return;
}
// Set loading state
if ( submitBtn ) submitBtn.disabled = true;
if ( btnText ) btnText.style.display = 'none';
if ( btnLoading ) btnLoading.style.display = 'inline';
if ( notice ) notice.className = 'form-notice';
try {
const formData = new FormData( contactForm );
formData.append( 'action', 'ots_contact' );
formData.append( 'nonce', otsAjax.nonce );
const response = await fetch( otsAjax.url, {
method: 'POST',
body: formData,
credentials: 'same-origin',
} );
const data = await response.json();
if ( data.success ) {
showNotice( 'success', data.data.message || 'Message sent successfully!' );
contactForm.reset();
} else {
showNotice( 'error', data.data.message || 'Something went wrong. Please try again.' );
}
} catch ( err ) {
showNotice( 'error', 'Network error. Please check your connection and try again.' );
} finally {
if ( submitBtn ) submitBtn.disabled = false;
if ( btnText ) btnText.style.display = 'inline';
if ( btnLoading ) btnLoading.style.display = 'none';
}
} );
function showNotice( type, message ) {
if ( ! notice ) return;
notice.textContent = message;
notice.className = 'form-notice ' + type;
notice.style.display = 'block';
notice.scrollIntoView( { behavior: 'smooth', block: 'nearest' } );
}
}
// ── Animate cards on scroll (intersection observer) ──────────────────────
if ( 'IntersectionObserver' in window ) {
const cards = document.querySelectorAll( '.feature-card, .industry-card, .value-card, .service-industry-card, .pricing-card' );
const style = document.createElement( 'style' );
style.textContent = `
.animate-card { opacity: 0; transform: translateY(24px); transition: opacity 0.5s ease, transform 0.5s ease; }
.animate-card.visible { opacity: 1; transform: translateY(0); }
`;
document.head.appendChild( style );
cards.forEach( ( card, i ) => {
card.classList.add( 'animate-card' );
card.style.transitionDelay = ( ( i % 4 ) * 80 ) + 'ms';
} );
const observer = new IntersectionObserver( ( entries ) => {
entries.forEach( entry => {
if ( entry.isIntersecting ) {
entry.target.classList.add( 'visible' );
observer.unobserve( entry.target );
}
} );
}, { threshold: 0.1 } );
cards.forEach( card => observer.observe( card ) );
}
} )();

View File

@@ -0,0 +1,53 @@
<footer class="site-footer">
<div class="container footer-inner">
<div class="footer-brand">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" class="site-logo footer-logo">
<span class="logo-text">OTS <strong>Signs</strong></span>
</a>
<p class="footer-tagline">The Complete Digital Signage Solution</p>
<p class="footer-parent">An <a href="https://oribi-tech.com" target="_blank" rel="noopener">Oribi Technology Services</a> product</p>
</div>
<div class="footer-links">
<div class="footer-col">
<h4>Platform</h4>
<ul>
<li><a href="<?php echo esc_url( home_url( '/services' ) ); ?>">Services</a></li>
<li><a href="<?php echo esc_url( home_url( '/#features' ) ); ?>">Features</a></li>
<li><a href="<?php echo esc_url( home_url( '/#pricing' ) ); ?>">Pricing</a></li>
<li><a href="https://demo.ots-signs.com" target="_blank" rel="noopener">Request Demo</a></li>
</ul>
</div>
<div class="footer-col">
<h4>Industries</h4>
<ul>
<li><a href="<?php echo esc_url( home_url( '/services#hospitality' ) ); ?>">Hospitality</a></li>
<li><a href="<?php echo esc_url( home_url( '/services#retail' ) ); ?>">Retail</a></li>
<li><a href="<?php echo esc_url( home_url( '/services#corporate' ) ); ?>">Corporate</a></li>
<li><a href="<?php echo esc_url( home_url( '/services#education' ) ); ?>">Education</a></li>
</ul>
</div>
<div class="footer-col">
<h4>Company</h4>
<ul>
<li><a href="<?php echo esc_url( home_url( '/about' ) ); ?>">About</a></li>
<li><a href="<?php echo esc_url( home_url( '/contact' ) ); ?>">Contact</a></li>
</ul>
</div>
</div>
</div>
<div class="footer-bottom">
<div class="container">
<p>&copy; <?php echo date( 'Y' ); ?> OTS Signs. All rights reserved.</p>
</div>
</div>
</footer>
<button class="scroll-top" aria-label="Back to top">&#8593;</button>
<?php wp_footer(); ?>
</body>
</html>

View File

@@ -0,0 +1,336 @@
<?php
/**
* OTS Signs Theme Functions
*/
if ( ! defined( 'ABSPATH' ) ) exit;
define( 'OTS_THEME_VERSION', '1.0.0' );
define( 'OTS_THEME_DIR', get_template_directory() );
define( 'OTS_THEME_URI', get_template_directory_uri() );
// ─── Theme Setup ──────────────────────────────────────────────────────────────
function ots_setup() {
add_theme_support( 'title-tag' );
add_theme_support( 'post-thumbnails' );
add_theme_support( 'html5', [ 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption' ] );
add_theme_support( 'custom-logo', [
'height' => 60,
'width' => 200,
'flex-height' => true,
'flex-width' => true,
] );
register_nav_menus( [
'primary' => __( 'Primary Menu', 'ots-signs' ),
'footer' => __( 'Footer Menu', 'ots-signs' ),
] );
}
add_action( 'after_setup_theme', 'ots_setup' );
// ─── Fallback Menu ────────────────────────────────────────────────────────────
if ( ! function_exists( 'ots_fallback_menu' ) ) {
function ots_fallback_menu() {
echo '<ul class="nav-menu">';
echo '<li><a href="' . esc_url( home_url( '/' ) ) . '">Home</a></li>';
echo '<li><a href="' . esc_url( home_url( '/services' ) ) . '">Services</a></li>';
echo '<li><a href="' . esc_url( home_url( '/about' ) ) . '">About</a></li>';
echo '<li><a href="' . esc_url( home_url( '/contact' ) ) . '">Contact</a></li>';
echo '</ul>';
}
}
// ─── Enqueue Assets ───────────────────────────────────────────────────────────
function ots_enqueue_assets() {
// Google Fonts
wp_enqueue_style(
'ots-fonts',
'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap',
[],
null
);
// Main stylesheet — use filemtime for cache-busting during development
wp_enqueue_style(
'ots-main',
OTS_THEME_URI . '/assets/css/main.css',
[ 'ots-fonts' ],
filemtime( OTS_THEME_DIR . '/assets/css/main.css' )
);
// Main JS — use filemtime for cache-busting during development
wp_enqueue_script(
'ots-main',
OTS_THEME_URI . '/assets/js/main.js',
[],
filemtime( OTS_THEME_DIR . '/assets/js/main.js' ),
true
);
// Pass ajaxurl and nonce to JS
wp_localize_script( 'ots-main', 'otsAjax', [
'url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'ots_contact_nonce' ),
] );
}
add_action( 'wp_enqueue_scripts', 'ots_enqueue_assets' );
// ─── Constrain Custom Logo Output ─────────────────────────────────────────
/**
* Force the custom logo image to have inline size constraints and use a
* smaller image size so the browser never paints the full-resolution upload.
*/
add_filter( 'get_custom_logo', 'ots_constrain_custom_logo' );
function ots_constrain_custom_logo( $html ) {
if ( empty( $html ) ) {
return $html;
}
// Swap the full-size src for the 'medium' version (much smaller file)
$custom_logo_id = get_theme_mod( 'custom_logo' );
if ( $custom_logo_id ) {
$medium = wp_get_attachment_image_url( $custom_logo_id, 'medium' );
$full = wp_get_attachment_image_url( $custom_logo_id, 'full' );
if ( $medium && $full && $medium !== $full ) {
$html = str_replace( esc_url( $full ), esc_url( $medium ), $html );
}
}
// Inject inline max-height directly on the <img> tag
$html = preg_replace(
'/<img\b/',
'<img style="max-height:40px;width:auto;height:auto;max-width:180px;display:block;object-fit:contain;"',
$html,
1
);
// Strip any srcset/sizes that might force a larger source
$html = preg_replace( '/\s*srcset="[^"]*"/', '', $html );
$html = preg_replace( '/\s*sizes="[^"]*"/', '', $html );
return $html;
}
// ─── Contact Form AJAX Handler ─────────────────────────────────────────────
function ots_handle_contact() {
check_ajax_referer( 'ots_contact_nonce', 'nonce' );
$name = sanitize_text_field( $_POST['name'] ?? '' );
$email = sanitize_email( $_POST['email'] ?? '' );
$phone = sanitize_text_field( $_POST['phone'] ?? '' );
$company = sanitize_text_field( $_POST['company'] ?? '' );
$message = sanitize_textarea_field( $_POST['message'] ?? '' );
if ( empty( $name ) || empty( $email ) || empty( $message ) ) {
wp_send_json_error( [ 'message' => 'Please fill in all required fields.' ] );
}
if ( ! is_email( $email ) ) {
wp_send_json_error( [ 'message' => 'Please enter a valid email address.' ] );
}
$to = get_option( 'admin_email' );
$subject = 'New Contact Form Submission from ' . $name;
$body = "Name: {$name}\n";
$body .= "Email: {$email}\n";
if ( $phone ) $body .= "Phone: {$phone}\n";
if ( $company ) $body .= "Company: {$company}\n";
$body .= "\nMessage:\n{$message}";
$headers = [
'Content-Type: text/plain; charset=UTF-8',
'Reply-To: ' . $name . ' <' . $email . '>',
];
$sent = wp_mail( $to, $subject, $body, $headers );
if ( $sent ) {
wp_send_json_success( [ 'message' => 'Thanks! We\'ll be in touch shortly.' ] );
} else {
wp_send_json_error( [ 'message' => 'Sorry, there was a problem sending your message. Please try again.' ] );
}
}
add_action( 'wp_ajax_ots_contact', 'ots_handle_contact' );
add_action( 'wp_ajax_nopriv_ots_contact', 'ots_handle_contact' );
// ─── Custom Page Templates ─────────────────────────────────────────────────
function ots_body_classes( $classes ) {
$classes[] = 'ots-theme';
return $classes;
}
add_filter( 'body_class', 'ots_body_classes' );
// ─── Excerpt length ────────────────────────────────────────────────────────
function ots_excerpt_length( $length ) {
return 25;
}
add_filter( 'excerpt_length', 'ots_excerpt_length' );
// ─── Meta Boxes ────────────────────────────────────────────────────────────
/**
* Each page template gets its own meta box with the key
* marketing copy fields. All fields fall back to sensible
* defaults so the site works without any editing.
*/
add_action( 'add_meta_boxes', 'ots_register_meta_boxes' );
function ots_register_meta_boxes() {
$screens = [ 'page' ];
add_meta_box(
'ots_page_hero',
'Page Hero Content',
'ots_render_hero_meta_box',
$screens,
'normal',
'high'
);
}
function ots_render_hero_meta_box( $post ) {
wp_nonce_field( 'ots_save_meta', 'ots_meta_nonce' );
$template = get_page_template_slug( $post->ID );
$fields = ots_get_meta_fields_for_template( $template );
if ( empty( $fields ) ) {
echo '<p style="color:#888;">No editable fields for this page template.</p>';
return;
}
echo '<style>
.ots-meta-table { width:100%; border-collapse:collapse; }
.ots-meta-table th { text-align:left; padding:10px 8px 4px; font-size:13px; color:#1d2327; width:180px; vertical-align:top; }
.ots-meta-table td { padding:6px 8px 12px; }
.ots-meta-table input[type=text], .ots-meta-table textarea { width:100%; font-size:13px; }
.ots-meta-table textarea { min-height:80px; }
.ots-meta-table .hint { font-size:11px; color:#888; margin-top:4px; }
.ots-meta-section { background:#f6f7f7; border-left:3px solid #2271b1; padding:6px 10px; margin:12px 0 6px; font-size:12px; font-weight:700; text-transform:uppercase; letter-spacing:.05em; color:#2271b1; }
</style>';
echo '<table class="ots-meta-table">';
foreach ( $fields as $field ) {
if ( $field['type'] === 'section' ) {
echo '<tr><td colspan="2"><div class="ots-meta-section">' . esc_html( $field['label'] ) . '</div></td></tr>';
continue;
}
$value = get_post_meta( $post->ID, $field['key'], true );
if ( $value === '' ) $value = $field['default'] ?? '';
echo '<tr>';
echo '<th><label for="ots_' . esc_attr( $field['key'] ) . '">' . esc_html( $field['label'] ) . '</label></th>';
echo '<td>';
if ( $field['type'] === 'textarea' ) {
echo '<textarea id="ots_' . esc_attr( $field['key'] ) . '" name="ots_meta[' . esc_attr( $field['key'] ) . ']" rows="3">' . esc_textarea( $value ) . '</textarea>';
} else {
echo '<input type="text" id="ots_' . esc_attr( $field['key'] ) . '" name="ots_meta[' . esc_attr( $field['key'] ) . ']" value="' . esc_attr( $value ) . '">';
}
if ( ! empty( $field['hint'] ) ) {
echo '<div class="hint">' . esc_html( $field['hint'] ) . '</div>';
}
echo '</td></tr>';
}
echo '</table>';
echo '<p style="margin-top:12px;padding-top:12px;border-top:1px solid #ddd;font-size:12px;color:#888;">
Fields left blank will use the default content shown above as placeholder text.
</p>';
}
function ots_get_meta_fields_for_template( $template ) {
$templates = [
'page-home.php' => [
[ 'type' => 'section', 'label' => 'Hero Section' ],
[ 'key' => 'hero_title', 'label' => 'Hero Title', 'type' => 'textarea', 'default' => 'Turn any screen into a dynamic communication tool for your business.', 'hint' => 'Wrap a keyword in <span class="highlight">…</span> to colour it teal.' ],
[ 'key' => 'hero_description', 'label' => 'Hero Description', 'type' => 'textarea', 'default' => 'The complete package for engaging digital signage. From eye-catching retail displays to dynamic informational screens, we craft tailored solutions that capture attention and deliver your message.' ],
[ 'key' => 'hero_cta_primary_label', 'label' => 'Primary CTA Label', 'type' => 'text', 'default' => 'Get in Touch' ],
[ 'key' => 'hero_cta_secondary_label', 'label' => 'Secondary CTA Label', 'type' => 'text', 'default' => 'View Demo' ],
[ 'type' => 'section', 'label' => 'Hero Stats' ],
[ 'key' => 'stat_1_value', 'label' => 'Stat 1 Value', 'type' => 'text', 'default' => '500+' ],
[ 'key' => 'stat_1_label', 'label' => 'Stat 1 Label', 'type' => 'text', 'default' => 'Screens Managed' ],
[ 'key' => 'stat_2_value', 'label' => 'Stat 2 Value', 'type' => 'text', 'default' => '6' ],
[ 'key' => 'stat_2_label', 'label' => 'Stat 2 Label', 'type' => 'text', 'default' => 'Industry Verticals' ],
[ 'key' => 'stat_3_value', 'label' => 'Stat 3 Value', 'type' => 'text', 'default' => '99.9%' ],
[ 'key' => 'stat_3_label', 'label' => 'Stat 3 Label', 'type' => 'text', 'default' => 'Uptime SLA' ],
[ 'type' => 'section', 'label' => 'Features Section' ],
[ 'key' => 'features_heading', 'label' => 'Features Heading', 'type' => 'text', 'default' => 'Everything You Need for Engaging Digital Signage' ],
[ 'key' => 'features_subheading', 'label' => 'Features Subheading', 'type' => 'textarea', 'default' => 'We provide a complete, end-to-end digital signage solution — from hardware to content management to live data integrations.' ],
[ 'type' => 'section', 'label' => 'Industries Section' ],
[ 'key' => 'industries_heading', 'label' => 'Industries Heading', 'type' => 'text', 'default' => 'Our Services Empower Your Brand' ],
[ 'key' => 'industries_subheading', 'label' => 'Industries Subheading', 'type' => 'textarea', 'default' => 'Modern businesses need real-time communication. Digital signage helps you connect with your audience where it matters most.' ],
[ 'type' => 'section', 'label' => 'Pricing Section' ],
[ 'key' => 'pricing_heading', 'label' => 'Pricing Heading', 'type' => 'text', 'default' => 'Affordable Solutions, Scalable Options' ],
[ 'key' => 'pricing_subheading', 'label' => 'Pricing Subheading', 'type' => 'textarea', 'default' => 'All plans include content scheduling/day-parting, live data integrations, unlimited user seats, and the ability to publish content to your signs in minutes.' ],
[ 'type' => 'section', 'label' => 'CTA Banner' ],
[ 'key' => 'cta_heading', 'label' => 'CTA Heading', 'type' => 'text', 'default' => 'Ready to Transform Your Screens?' ],
[ 'key' => 'cta_description', 'label' => 'CTA Description', 'type' => 'textarea', 'default' => 'Get in touch today and discover how OTS Signs can revolutionize the way you communicate with your audience.' ],
],
'page-about.php' => [
[ 'type' => 'section', 'label' => 'Page Hero' ],
[ 'key' => 'hero_title', 'label' => 'Page Title', 'type' => 'text', 'default' => 'The Complete Digital Signage Solution' ],
[ 'key' => 'hero_description', 'label' => 'Page Subtitle', 'type' => 'textarea', 'default' => 'We help businesses of all sizes connect with their audiences through powerful, easy-to-manage digital signage.' ],
[ 'type' => 'section', 'label' => 'Who We Are Section' ],
[ 'key' => 'about_heading', 'label' => 'Section Heading', 'type' => 'text', 'default' => 'Bringing Your Message to Life on Every Screen' ],
[ 'key' => 'about_intro', 'label' => 'Intro Paragraph', 'type' => 'textarea', 'default' => 'OTS Signs is a digital signage company dedicated to transforming how businesses communicate with their audiences. We offer a complete, end-to-end solution — from the hardware players to our cloud management platform to custom content creation.' ],
[ 'key' => 'about_body', 'label' => 'Body Paragraph', 'type' => 'textarea', 'default' => 'Digital signage is the modern way to connect with your audience, transforming any screen into a way to communicate and engage. Whether you need an eye-catching retail display, a dynamic menu board, or enterprise-grade live data dashboards, we deliver solutions that capture attention and get results.' ],
[ 'type' => 'section', 'label' => 'CTA Banner' ],
[ 'key' => 'cta_heading', 'label' => 'CTA Heading', 'type' => 'text', 'default' => "Let's Build Something Great Together" ],
[ 'key' => 'cta_description', 'label' => 'CTA Description', 'type' => 'textarea', 'default' => 'Ready to see what OTS Signs can do for your business? Get in touch or explore our demo platform.' ],
],
'page-services.php' => [
[ 'type' => 'section', 'label' => 'Page Hero' ],
[ 'key' => 'hero_title', 'label' => 'Page Title', 'type' => 'text', 'default' => 'Services & Solutions' ],
[ 'key' => 'hero_description', 'label' => 'Page Subtitle', 'type' => 'textarea', 'default' => 'From content creation to cloud management to live data integrations — we deliver everything you need for a complete digital signage deployment.' ],
[ 'type' => 'section', 'label' => 'Core Services Section' ],
[ 'key' => 'services_heading', 'label' => 'Section Heading', 'type' => 'text', 'default' => 'The Complete Package for Engaging Digital Signage' ],
[ 'key' => 'services_subheading', 'label' => 'Section Subheading', 'type' => 'textarea', 'default' => 'Every service we offer is designed to make your digital signage as impactful, reliable, and easy to manage as possible.' ],
[ 'type' => 'section', 'label' => 'Pricing Section' ],
[ 'key' => 'pricing_heading', 'label' => 'Pricing Heading', 'type' => 'text', 'default' => 'Affordable Solutions, Scalable Options' ],
[ 'key' => 'pricing_subheading', 'label' => 'Pricing Subheading', 'type' => 'textarea', 'default' => 'Simple, transparent pricing with no hidden fees. Choose the plan that fits your business size.' ],
[ 'type' => 'section', 'label' => 'CTA Banner' ],
[ 'key' => 'cta_heading', 'label' => 'CTA Heading', 'type' => 'text', 'default' => 'Want to See How Our Platform Works?' ],
[ 'key' => 'cta_description', 'label' => 'CTA Description', 'type' => 'textarea', 'default' => 'Request access to our demo instance and explore the OTS Signs platform hands-on.' ],
],
'page-contact.php' => [
[ 'type' => 'section', 'label' => 'Page Hero' ],
[ 'key' => 'hero_title', 'label' => 'Page Title', 'type' => 'text', 'default' => 'Get in Touch' ],
[ 'key' => 'hero_description', 'label' => 'Page Subtitle', 'type' => 'textarea', 'default' => "Ready to transform your screens? We'd love to hear about your project. Drop us a message and we'll get back to you promptly." ],
[ 'type' => 'section', 'label' => 'Contact Info' ],
[ 'key' => 'contact_heading', 'label' => 'Section Heading', 'type' => 'text', 'default' => "Let's Start the Conversation" ],
[ 'key' => 'contact_subheading', 'label' => 'Section Subheading', 'type' => 'textarea', 'default' => "Whether you're looking for a quote, want to see a demo, or just have questions — we're here to help." ],
[ 'key' => 'contact_email', 'label' => 'Contact Email', 'type' => 'text', 'default' => 'info@ots-signs.com' ],
[ 'type' => 'section', 'label' => 'Demo CTA Section' ],
[ 'key' => 'demo_heading', 'label' => 'Demo Heading', 'type' => 'text', 'default' => 'Explore Our Demo Platform' ],
[ 'key' => 'demo_description', 'label' => 'Demo Description', 'type' => 'textarea', 'default' => 'See the OTS Signs CMS in action. Request access to our live demo instance and experience the platform for yourself before making any commitment.' ],
],
];
return $templates[ $template ] ?? [];
}
// Save meta fields
add_action( 'save_post_page', 'ots_save_meta_fields' );
function ots_save_meta_fields( $post_id ) {
if ( ! isset( $_POST['ots_meta_nonce'] ) ) return;
if ( ! wp_verify_nonce( $_POST['ots_meta_nonce'], 'ots_save_meta' ) ) return;
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
if ( ! current_user_can( 'edit_page', $post_id ) ) return;
if ( ! isset( $_POST['ots_meta'] ) || ! is_array( $_POST['ots_meta'] ) ) return;
foreach ( $_POST['ots_meta'] as $key => $value ) {
$key = sanitize_key( $key );
// Allow basic HTML (spans, br, strong, em) for rich text fields
$allowed = array_merge( wp_kses_allowed_html( 'post' ), [] );
update_post_meta( $post_id, $key, wp_kses_post( $value ) );
}
}
/**
* Helper: get a meta value with a default fallback.
*/
function ots_meta( $post_id, $key, $default = '' ) {
$value = get_post_meta( $post_id, $key, true );
return ( $value !== '' && $value !== false ) ? $value : $default;
}

View File

@@ -0,0 +1,47 @@
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="profile" href="https://gmpg.org/xfn/11">
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<?php wp_body_open(); ?>
<header class="site-header" id="site-header">
<div class="container header-inner">
<div class="site-logo" style="max-height:40px;overflow:hidden;">
<?php if ( has_custom_logo() ) : ?>
<div class="logo-constraint" style="display:flex;align-items:center;max-height:40px;max-width:180px;overflow:hidden;">
<?php the_custom_logo(); ?>
</div>
<?php else : ?>
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" aria-label="OTS Signs Home">
<span class="logo-text">OTS <strong>Signs</strong></span>
</a>
<?php endif; ?>
</div>
<nav class="site-nav" id="site-nav" aria-label="Primary navigation">
<?php
wp_nav_menu( [
'theme_location' => 'primary',
'menu_class' => 'nav-menu',
'container' => false,
'fallback_cb' => 'ots_fallback_menu',
] );
?>
</nav>
<div class="header-cta">
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-primary btn-sm">Get in Touch</a>
</div>
<button class="nav-toggle" id="nav-toggle" aria-label="Toggle navigation" aria-expanded="false">
<span></span><span></span><span></span>
</button>
</div>
</header>

View File

@@ -0,0 +1,45 @@
<?php
/**
* The main template file / fallback for all archive views.
*/
get_header();
?>
<div class="page-header-light"></div>
<section class="page-hero">
<div class="container">
<h1><?php
if ( is_home() ) :
echo 'Blog';
elseif ( is_archive() ) :
the_archive_title();
else :
echo 'OTS Signs';
endif;
?></h1>
</div>
</section>
<section class="section">
<div class="container">
<?php if ( have_posts() ) : ?>
<div class="grid-3">
<?php while ( have_posts() ) : the_post(); ?>
<article class="feature-card">
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<p><?php the_excerpt(); ?></p>
<a href="<?php the_permalink(); ?>" class="btn btn-outline btn-sm">Read More</a>
</article>
<?php endwhile; ?>
</div>
<div style="margin-top:2rem;">
<?php the_posts_pagination(); ?>
</div>
<?php else : ?>
<p>No posts found.</p>
<?php endif; ?>
</div>
</section>
<?php get_footer(); ?>

View File

@@ -0,0 +1,149 @@
<?php
/**
* Template Name: About Page
*/
get_header();
?>
<div class="page-header-light"></div>
<!-- ═══════════════════════════════════════════════════════════
PAGE HERO
════════════════════════════════════════════════════════════════ -->
<section class="page-hero">
<div class="container">
<?php
$id = get_the_ID();
$pg_title = ots_meta( $id, 'hero_title', 'The Complete Digital Signage Solution' );
$pg_sub = ots_meta( $id, 'hero_description', 'We help businesses of all sizes connect with their audiences through powerful, easy-to-manage digital signage.' );
?>
<span class="section-label" style="color:var(--color-accent);display:block;margin-bottom:.75rem;">About OTS Signs</span>
<h1><?php echo esc_html( $pg_title ); ?></h1>
<p class="lead"><?php echo wp_kses_post( $pg_sub ); ?></p>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
WHO WE ARE
════════════════════════════════════════════════════════════════ -->
<section class="section">
<div class="container">
<div class="about-intro">
<div class="about-intro-visual">&#128247;</div>
<div>
<?php
$about_h = ots_meta( $id, 'about_heading', 'Bringing Your Message to Life on Every Screen' );
$about_intro = ots_meta( $id, 'about_intro', 'OTS Signs is a digital signage company dedicated to transforming how businesses communicate with their audiences. We offer a complete, end-to-end solution — from the hardware players to our cloud management platform to custom content creation.' );
$about_body = ots_meta( $id, 'about_body', 'Digital signage is the modern way to connect with your audience, transforming any screen into a way to communicate and engage. Whether you need an eye-catching retail display, a dynamic menu board, or enterprise-grade live data dashboards, we deliver solutions that capture attention and get results.' );
?>
<span class="section-label">Who We Are</span>
<h2><?php echo esc_html( $about_h ); ?></h2>
<p class="lead" style="margin-bottom:1.5rem;"><?php echo wp_kses_post( $about_intro ); ?></p>
<p style="color:var(--color-text-muted);"><?php echo wp_kses_post( $about_body ); ?></p>
<p style="color:var(--color-text-muted);">OTS Signs is a service by <a href="https://oribi-tech.com" target="_blank" rel="noopener" style="color:var(--color-primary);font-weight:600;">Oribi Technology Services</a>, backed by a team of technology professionals passionate about modern communication.</p>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
VALUES
════════════════════════════════════════════════════════════════ -->
<section class="section section-alt">
<div class="container">
<div class="section-header">
<span class="section-label">Our Approach</span>
<h2>What Sets Us Apart</h2>
<p class="lead">We don't just sell screens — we deliver a complete communication platform built for reliability, ease of use, and real business results.</p>
</div>
<div class="grid-3">
<div class="value-card">
<div class="value-icon">&#9889;</div>
<h3>Easy to Use</h3>
<p style="color:var(--color-text-muted);">Our cloud CMS is designed for any skill level. Publish content to your signs in minutes, no technical expertise required.</p>
</div>
<div class="value-card">
<div class="value-icon">&#128200;</div>
<h3>Scalable Platform</h3>
<p style="color:var(--color-text-muted);">Whether you manage one screen or 500+, our platform scales effortlessly with your business without sacrificing performance.</p>
</div>
<div class="value-card">
<div class="value-icon">&#128274;</div>
<h3>Enterprise Security</h3>
<p style="color:var(--color-text-muted);">Enterprise-grade security safeguards your content and network with rock-solid reliability and uptime you can count on.</p>
</div>
<div class="value-card">
<div class="value-icon">&#127760;</div>
<h3>Always Connected</h3>
<p style="color:var(--color-text-muted);">Our intelligent player devices keep your content playing even without internet — so your message never goes dark.</p>
</div>
<div class="value-card">
<div class="value-icon">&#127775;</div>
<h3>Professional Content</h3>
<p style="color:var(--color-text-muted);">We offer professional photography and video production to ensure your signage looks polished, engaging, and on-brand.</p>
</div>
<div class="value-card">
<div class="value-icon">&#129309;</div>
<h3>Ongoing Support</h3>
<p style="color:var(--color-text-muted);">We're your digital signage partner — not just a vendor. We're here to help you get the most out of your investment.</p>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
PLATFORM OVERVIEW
════════════════════════════════════════════════════════════════ -->
<section class="section">
<div class="container">
<div class="section-header">
<span class="section-label">The Platform</span>
<h2>Cloud-Native Infrastructure Built for Performance</h2>
<p class="lead">Our application platform lets you publish content instantly across any network, with built-in real-time analytics and a secure, cloud-native architecture.</p>
</div>
<div class="grid-2">
<div class="feature-card">
<div class="feature-icon">&#128187;</div>
<h3>Cloud CMS</h3>
<p>Manage all your screens from a single, intuitive dashboard. Schedule content, monitor displays, and push updates in real time from anywhere in the world.</p>
</div>
<div class="feature-card">
<div class="feature-icon">&#128202;</div>
<h3>Real-Time Analytics</h3>
<p>Track what's playing, when, and on which screens. Get actionable insights to optimize your content strategy and maximize engagement.</p>
</div>
<div class="feature-card">
<div class="feature-icon">&#128268;</div>
<h3>Flexible Hardware</h3>
<p>Our players work with any HDMI screen, making integration into your existing setup seamless. Or get a complete bundled solution including a commercial display.</p>
</div>
<div class="feature-card">
<div class="feature-icon">&#9881;</div>
<h3>Live Data Pipelines</h3>
<p>Connect your web dashboards, APIs, or data feeds to display live metrics, prices, news, or any dynamic content automatically on your screens.</p>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
CTA
════════════════════════════════════════════════════════════════ -->
<section class="cta-banner">
<div class="container">
<?php
$cta_h = ots_meta( $id, 'cta_heading', "Let's Build Something Great Together" );
$cta_txt = ots_meta( $id, 'cta_description', 'Ready to see what OTS Signs can do for your business? Get in touch or explore our demo platform.' );
?>
<h2><?php echo esc_html( $cta_h ); ?></h2>
<p><?php echo wp_kses_post( $cta_txt ); ?></p>
<div class="btn-group" style="justify-content:center;">
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-ghost btn-lg">Get in Touch</a>
<a href="<?php echo esc_url( home_url( '/services' ) ); ?>" class="btn btn-lg" style="background:#fff;color:var(--color-primary);">Our Services</a>
</div>
</div>
</section>
<?php get_footer(); ?>

View File

@@ -0,0 +1,163 @@
<?php
/**
* Template Name: Contact Page
*/
get_header();
?>
<div class="page-header-light"></div>
<!-- ═══════════════════════════════════════════════════════════
PAGE HERO
════════════════════════════════════════════════════════════════ -->
<section class="page-hero">
<div class="container">
<?php
$id = get_the_ID();
$pg_title = ots_meta( $id, 'hero_title', 'Get in Touch' );
$pg_sub = ots_meta( $id, 'hero_description', "Ready to transform your screens? We'd love to hear about your project. Drop us a message and we'll get back to you promptly." );
?>
<span class="section-label" style="color:var(--color-accent);display:block;margin-bottom:.75rem;">Say Hello</span>
<h1><?php echo esc_html( $pg_title ); ?></h1>
<p class="lead"><?php echo wp_kses_post( $pg_sub ); ?></p>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
CONTACT FORM + INFO
════════════════════════════════════════════════════════════════ -->
<section class="section">
<div class="container">
<div class="contact-layout">
<!-- Contact Info -->
<div class="contact-info">
<?php
$con_h = ots_meta( $id, 'contact_heading', "Let's Start the Conversation" );
$con_sub = ots_meta( $id, 'contact_subheading', "Whether you're looking for a quote, want to see a demo, or just have questions — we're here to help." );
$con_email = ots_meta( $id, 'contact_email', 'info@ots-signs.com' );
?>
<span class="section-label">Contact Us</span>
<h2><?php echo esc_html( $con_h ); ?></h2>
<p class="lead"><?php echo wp_kses_post( $con_sub ); ?></p>
<div class="contact-method">
<div class="contact-method-icon">&#128140;</div>
<div>
<div class="contact-method-label">Email</div>
<div class="contact-method-value"><a href="mailto:<?php echo esc_attr( $con_email ); ?>" style="color:var(--color-primary);"><?php echo esc_html( $con_email ); ?></a></div>
</div>
</div>
<div class="contact-method">
<div class="contact-method-icon">&#127760;</div>
<div>
<div class="contact-method-label">Demo Platform</div>
<div class="contact-method-value"><a href="https://demo.ots-signs.com" target="_blank" rel="noopener" style="color:var(--color-primary);">demo.ots-signs.com</a></div>
</div>
</div>
<div class="contact-method">
<div class="contact-method-icon">&#127968;</div>
<div>
<div class="contact-method-label">Company</div>
<div class="contact-method-value">An <a href="https://oribi-tech.com" target="_blank" rel="noopener" style="color:var(--color-primary);">Oribi Technology Services</a> product</div>
</div>
</div>
<hr class="divider">
<h3 style="font-size:1rem;margin-bottom:1rem;color:var(--color-dark);">What to Expect</h3>
<ul style="list-style:none;display:flex;flex-direction:column;gap:.75rem;">
<li style="display:flex;align-items:flex-start;gap:.75rem;font-size:.9rem;color:var(--color-text-muted);">
<span style="color:var(--color-accent);font-weight:700;flex-shrink:0;">01</span>
<span>We'll review your message and respond within one business day.</span>
</li>
<li style="display:flex;align-items:flex-start;gap:.75rem;font-size:.9rem;color:var(--color-text-muted);">
<span style="color:var(--color-accent);font-weight:700;flex-shrink:0;">02</span>
<span>We'll schedule a quick discovery call to understand your needs.</span>
</li>
<li style="display:flex;align-items:flex-start;gap:.75rem;font-size:.9rem;color:var(--color-text-muted);">
<span style="color:var(--color-accent);font-weight:700;flex-shrink:0;">03</span>
<span>We'll prepare a tailored proposal and walk you through the platform.</span>
</li>
</ul>
</div>
<!-- Contact Form -->
<div class="contact-form-wrap">
<h3 style="margin-bottom:1.5rem;font-size:1.2rem;">Send Us a Message</h3>
<form id="contact-form" novalidate>
<?php wp_nonce_field( 'ots_contact_nonce', '_nonce', true, true ); ?>
<div class="form-row">
<div class="form-group">
<label for="contact-name">Full Name <span class="req">*</span></label>
<input type="text" id="contact-name" name="name" placeholder="Jane Smith" required>
</div>
<div class="form-group">
<label for="contact-email">Email Address <span class="req">*</span></label>
<input type="email" id="contact-email" name="email" placeholder="jane@company.com" required>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="contact-phone">Phone Number</label>
<input type="tel" id="contact-phone" name="phone" placeholder="+1 (555) 000-0000">
</div>
<div class="form-group">
<label for="contact-company">Company / Organisation</label>
<input type="text" id="contact-company" name="company" placeholder="Acme Corp">
</div>
</div>
<div class="form-group">
<label for="contact-interest">I'm interested in…</label>
<select id="contact-interest" name="interest">
<option value="">Select an option</option>
<option value="Essentials Plan ($7/screen/month)">Essentials Plan ($7/screen/month)</option>
<option value="Pro / Enterprise Plan">Pro / Enterprise Plan</option>
<option value="Digital Menu Boards">Digital Menu Boards</option>
<option value="Live Data Integration">Live Data Integration</option>
<option value="General Enquiry">General Enquiry</option>
<option value="Demo Access">Demo Access</option>
</select>
</div>
<div class="form-group">
<label for="contact-message">Message <span class="req">*</span></label>
<textarea id="contact-message" name="message" placeholder="Tell us a bit about your project, number of screens, location, and any specific requirements…" required></textarea>
</div>
<button type="submit" class="btn btn-primary btn-lg" style="width:100%;justify-content:center;" id="contact-submit">
<span class="btn-text">Send Message</span>
<span class="btn-loading" style="display:none;">Sending…</span>
</button>
<div class="form-notice" id="form-notice" role="alert"></div>
</form>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
DEMO CTA
════════════════════════════════════════════════════════════════ -->
<section class="section section-alt" style="text-align:center;padding-block:4rem;">
<div class="container">
<?php
$demo_h = ots_meta( $id, 'demo_heading', 'Explore Our Demo Platform' );
$demo_txt = ots_meta( $id, 'demo_description', 'See the OTS Signs CMS in action. Request access to our live demo instance and experience the platform for yourself before making any commitment.' );
?>
<span class="section-label">Try Before You Buy</span>
<h2 style="margin-bottom:1rem;"><?php echo esc_html( $demo_h ); ?></h2>
<p class="lead" style="margin-bottom:2rem;"><?php echo wp_kses_post( $demo_txt ); ?></p>
<a href="https://demo.ots-signs.com" target="_blank" rel="noopener" class="btn btn-primary btn-lg">Request Demo Access &rarr;</a>
</div>
</section>
<?php get_footer(); ?>

View File

@@ -0,0 +1,294 @@
<?php
/**
* Template Name: Home Page
*/
get_header();
?>
<!-- ═══════════════════════════════════════════════════════════
HERO
════════════════════════════════════════════════════════════════ -->
<section class="hero">
<div class="hero-bg-grid"></div>
<div class="hero-glow"></div>
<div class="hero-glow-2"></div>
<div class="container hero-inner">
<?php
$id = get_the_ID();
$hero_title = ots_meta( $id, 'hero_title', 'Turn any screen into a <span class="highlight">dynamic communication</span> tool for your business.' );
$hero_desc = ots_meta( $id, 'hero_description', 'The complete package for engaging digital signage. From eye-catching retail displays to dynamic informational screens, we craft tailored solutions that capture attention and deliver your message.' );
$cta_primary = ots_meta( $id, 'hero_cta_primary_label', 'Get in Touch' );
$cta_secondary = ots_meta( $id, 'hero_cta_secondary_label', 'View Demo' );
$stat_1_val = ots_meta( $id, 'stat_1_value', '500+' );
$stat_1_lbl = ots_meta( $id, 'stat_1_label', 'Screens Managed' );
$stat_2_val = ots_meta( $id, 'stat_2_value', '6' );
$stat_2_lbl = ots_meta( $id, 'stat_2_label', 'Industry Verticals' );
$stat_3_val = ots_meta( $id, 'stat_3_value', '99.9%' );
$stat_3_lbl = ots_meta( $id, 'stat_3_label', 'Uptime SLA' );
?>
<div class="hero-content">
<span class="hero-label">&#9679; Digital Signage Solutions</span>
<h1 class="hero-title"><?php echo wp_kses_post( $hero_title ); ?></h1>
<p class="hero-description"><?php echo wp_kses_post( $hero_desc ); ?></p>
<div class="btn-group">
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-primary btn-lg"><?php echo esc_html( $cta_primary ); ?></a>
<a href="https://demo.ots-signs.com" target="_blank" rel="noopener" class="btn btn-ghost btn-lg"><?php echo esc_html( $cta_secondary ); ?> &rarr;</a>
</div>
<div class="hero-stats">
<div>
<div class="hero-stat-value"><?php echo esc_html( $stat_1_val ); ?></div>
<div class="hero-stat-label"><?php echo esc_html( $stat_1_lbl ); ?></div>
</div>
<div>
<div class="hero-stat-value"><?php echo esc_html( $stat_2_val ); ?></div>
<div class="hero-stat-label"><?php echo esc_html( $stat_2_lbl ); ?></div>
</div>
<div>
<div class="hero-stat-value"><?php echo esc_html( $stat_3_val ); ?></div>
<div class="hero-stat-label"><?php echo esc_html( $stat_3_lbl ); ?></div>
</div>
</div>
</div>
<div class="hero-visual">
<div class="hero-screen-mock">
<div class="hero-badge hero-badge-2">
<span class="hero-badge-dot"></span> Live content publishing
</div>
<div class="hero-screen-outer">
<div class="hero-screen-bar">
<span></span><span></span><span></span>
</div>
<div class="hero-screen-content">
<div class="hero-screen-logo">OTS <span>Signs</span></div>
<div class="hero-screen-tagline">Live Data Dashboard</div>
<div class="hero-screen-bars">
<div></div><div></div><div></div><div></div><div></div><div></div>
</div>
</div>
</div>
<div class="hero-badge hero-badge-1">
<span class="hero-badge-dot"></span> Offline playback enabled
</div>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
CORE CAPABILITIES
════════════════════════════════════════════════════════════════ -->
<section class="section" id="features">
<div class="container">
<?php
$feat_h = ots_meta( $id, 'features_heading', 'Everything You Need for Engaging Digital Signage' );
$feat_sub = ots_meta( $id, 'features_subheading', 'We provide a complete, end-to-end digital signage solution — from hardware to content management to live data integrations.' );
?>
<div class="section-header">
<span class="section-label">What We Offer</span>
<h2><?php echo esc_html( $feat_h ); ?></h2>
<p class="lead"><?php echo wp_kses_post( $feat_sub ); ?></p>
</div>
<div class="grid-4">
<div class="feature-card">
<div class="feature-icon">&#128247;</div>
<h3>Showcase Your Products</h3>
<p>Professional photography and video production services to showcase your products and services with high-quality, polished visuals.</p>
</div>
<div class="feature-card">
<div class="feature-icon">&#128202;</div>
<h3>Live Data Integrations</h3>
<p>Integrate your existing web dashboards and real-time data with our platform to display up-to-the-minute metrics and insights.</p>
</div>
<div class="feature-card">
<div class="feature-icon">&#127869;</div>
<h3>Digital Menu Boards</h3>
<p>Make your menu as appealing as your product. We incorporate your branding with high-quality photography to showcase your offerings.</p>
</div>
<div class="feature-card">
<div class="feature-icon">&#128267;</div>
<h3>Offline Playback</h3>
<p>Our intelligent player devices keep your message on screen even when the internet isn't available — so communication never stops.</p>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
INDUSTRIES
════════════════════════════════════════════════════════════════ -->
<section class="section section-dark" id="industries">
<div class="container">
<?php
$ind_h = ots_meta( $id, 'industries_heading', 'Our Services Empower Your Brand' );
$ind_sub = ots_meta( $id, 'industries_subheading', 'Modern businesses need real-time communication. Digital signage helps you connect with your audience where it matters most.' );
?>
<div class="section-header">
<span class="section-label">Industries We Serve</span>
<h2><?php echo esc_html( $ind_h ); ?></h2>
<p class="lead"><?php echo wp_kses_post( $ind_sub ); ?></p>
</div>
<div class="grid-3">
<div class="industry-card" id="hospitality">
<div class="industry-card-icon">&#127974;</div>
<h3>Hospitality</h3>
<p>Showcase menus, promotions, and special events while guiding guests through lobbies, restaurants, and bars.</p>
</div>
<div class="industry-card" id="retail">
<div class="industry-card-icon">&#128717;</div>
<h3>Retail</h3>
<p>Drive product upsells, announce flash-sales, and offer in-store navigation with fresh, eye-catching displays.</p>
</div>
<div class="industry-card" id="outdoor-marketplace">
<div class="industry-card-icon">&#127747;</div>
<h3>Outdoor Marketplace</h3>
<p>Whether it's a weekly farmers market or seasonal fair, digital signage adds a modern, professional touch without losing the charm.</p>
</div>
<div class="industry-card" id="corporate">
<div class="industry-card-icon">&#127970;</div>
<h3>Corporate Office</h3>
<p>Enhance your meeting experience with Teams meeting rooms. Communicate schedules, company news, and employee alerts.</p>
</div>
<div class="industry-card" id="live-data">
<div class="industry-card-icon">&#128308;</div>
<h3>Live Data Displays</h3>
<p>Connect existing web dashboards and real-time data to our platform. Bring key metrics and insights to life in real-time.</p>
</div>
<div class="industry-card" id="education">
<div class="industry-card-icon">&#127979;</div>
<h3>Education</h3>
<p>Broadcast class schedules, announcements, and interactive learning content in campuses and auditoriums.</p>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
PLATFORM / TECHNOLOGY
════════════════════════════════════════════════════════════════ -->
<section class="section section-alt">
<div class="container">
<div class="section-header">
<span class="section-label">Platform</span>
<h2>Technology Designed to Work for You</h2>
<p class="lead">Our application platform lets you publish content instantly across any network, with built-in real-time analytics and a secure, cloud-native architecture.</p>
</div>
<div>
<div class="platform-row">
<div class="platform-text">
<h3>Manage All Your Screens in One Place</h3>
<p>Our cloud CMS offers the power and flexibility to manage digital displays for businesses of all sizes. Whether you're a single location or a multi-site enterprise, our digital signage network is built to grow with you.</p>
</div>
<div class="platform-visual">&#128187;</div>
</div>
<div class="platform-row reverse">
<div class="platform-text">
<h3>Dynamic Content Scheduling</h3>
<p>Effortlessly schedule your content for maximum impact. Plan ahead by setting content to play at specific times, daypart, or trigger based on real-world events. Automate your messaging to ensure the right information is displayed at the right time.</p>
</div>
<div class="platform-visual">&#128197;</div>
</div>
<div class="platform-row">
<div class="platform-text">
<h3>Use Existing Screens</h3>
<p>Our digital signage players work on any screen with HDMI, so you can easily integrate them into your current setup. We also offer bundled packages that include both the player and a high-quality commercial-grade display.</p>
</div>
<div class="platform-visual">&#128250;</div>
</div>
<div class="platform-row reverse">
<div class="platform-text">
<h3>Secure &amp; Reliable</h3>
<p>Enterprise-grade security safeguards your content and network, while our advanced hosting platform guarantees rock-solid reliability. Our intelligent player devices continue playing content even when offline, so your communication never misses a beat.</p>
</div>
<div class="platform-visual">&#128274;</div>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
PRICING
════════════════════════════════════════════════════════════════ -->
<section class="section" id="pricing">
<div class="container">
<?php
$price_h = ots_meta( $id, 'pricing_heading', 'Affordable Solutions, Scalable Options' );
$price_sub = ots_meta( $id, 'pricing_subheading', 'All plans include content scheduling/day-parting, live data integrations, unlimited user seats, and the ability to publish content to your signs in minutes.' );
?>
<div class="section-header">
<span class="section-label">Pricing</span>
<h2><?php echo esc_html( $price_h ); ?></h2>
<p class="lead"><?php echo wp_kses_post( $price_sub ); ?></p>
</div>
<div class="pricing-grid">
<div class="pricing-card">
<div class="pricing-name">Essentials</div>
<div class="pricing-price">
<div class="pricing-amount"><sup>$</sup>7</div>
<div class="pricing-per">per screen / month &mdash; or $70 / screen annually</div>
</div>
<ul class="pricing-features">
<li><span class="pricing-check">&#10003;</span> Up to 20 screens</li>
<li><span class="pricing-check">&#10003;</span> Content scheduling &amp; day-parting</li>
<li><span class="pricing-check">&#10003;</span> Live data integrations</li>
<li><span class="pricing-check">&#10003;</span> Unlimited user seats</li>
<li><span class="pricing-check">&#10003;</span> Custom subdomain</li>
<li><span class="pricing-check">&#10003;</span> Shared CMS server</li>
</ul>
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-outline" style="width:100%;justify-content:center;">Get Started</a>
</div>
<div class="pricing-card featured">
<div class="pricing-badge">Enterprise</div>
<div class="pricing-name">Pro</div>
<div class="pricing-price">
<div class="pricing-amount" style="font-size:1.75rem;">Contact Us</div>
<div class="pricing-per">Custom pricing for your scale</div>
</div>
<ul class="pricing-features">
<li><span class="pricing-check">&#10003;</span> 500+ screens</li>
<li><span class="pricing-check">&#10003;</span> Content scheduling &amp; day-parting</li>
<li><span class="pricing-check">&#10003;</span> Custom live data integrations</li>
<li><span class="pricing-check">&#10003;</span> Unlimited user seats</li>
<li><span class="pricing-check">&#10003;</span> Custom domain</li>
<li><span class="pricing-check">&#10003;</span> Dedicated CMS server</li>
</ul>
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-primary" style="width:100%;justify-content:center;">Contact Sales</a>
</div>
</div>
<p class="text-center mt-4" style="color:var(--color-text-muted);font-size:.9rem;">
Want to see the platform in action?
<a href="https://demo.ots-signs.com" target="_blank" rel="noopener" style="color:var(--color-primary);font-weight:600;">Request access to our demo instance &rarr;</a>
</p>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
CTA BANNER
════════════════════════════════════════════════════════════════ -->
<section class="cta-banner">
<div class="container">
<?php
$cta_h = ots_meta( $id, 'cta_heading', 'Ready to Transform Your Screens?' );
$cta_txt = ots_meta( $id, 'cta_description', 'Get in touch today and discover how OTS Signs can revolutionize the way you communicate with your audience.' );
?>
<h2><?php echo esc_html( $cta_h ); ?></h2>
<p><?php echo wp_kses_post( $cta_txt ); ?></p>
<div class="btn-group" style="justify-content:center;">
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-ghost btn-lg">Get in Touch</a>
<a href="https://demo.ots-signs.com" target="_blank" rel="noopener" class="btn btn-lg" style="background:#fff;color:var(--color-primary);">View Demo</a>
</div>
</div>
</section>
<?php get_footer(); ?>

View File

@@ -0,0 +1,264 @@
<?php
/**
* Template Name: Services Page
*/
get_header();
?>
<div class="page-header-light"></div>
<!-- ═══════════════════════════════════════════════════════════
PAGE HERO
════════════════════════════════════════════════════════════════ -->
<section class="page-hero">
<div class="container">
<?php
$id = get_the_ID();
$pg_title = ots_meta( $id, 'hero_title', 'Services &amp; Solutions' );
$pg_sub = ots_meta( $id, 'hero_description', 'From content creation to cloud management to live data integrations — we deliver everything you need for a complete digital signage deployment.' );
?>
<span class="section-label" style="color:var(--color-accent);display:block;margin-bottom:.75rem;">What We Do</span>
<h1><?php echo wp_kses_post( $pg_title ); ?></h1>
<p class="lead"><?php echo wp_kses_post( $pg_sub ); ?></p>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
CORE SERVICES
════════════════════════════════════════════════════════════════ -->
<section class="section">
<div class="container">
<?php
$svc_h = ots_meta( $id, 'services_heading', 'The Complete Package for Engaging Digital Signage' );
$svc_sub = ots_meta( $id, 'services_subheading', 'Every service we offer is designed to make your digital signage as impactful, reliable, and easy to manage as possible.' );
?>
<div class="section-header">
<span class="section-label">Core Services</span>
<h2><?php echo esc_html( $svc_h ); ?></h2>
<p class="lead"><?php echo wp_kses_post( $svc_sub ); ?></p>
</div>
<div>
<div class="platform-row">
<div class="platform-text">
<span class="section-label">Content Creation</span>
<h3>Showcase Your Products</h3>
<p>High-quality visuals make all the difference. We offer professional photography and video production services to showcase your products, services, or environment. We ensure your content looks polished and engaging — because great signage starts with great content.</p>
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-outline mt-3">Get a Quote</a>
</div>
<div class="platform-visual">&#128247;</div>
</div>
<div class="platform-row reverse">
<div class="platform-text">
<span class="section-label">Data Integration</span>
<h3>Live Data Integrations</h3>
<p>Integrate your existing web dashboards and real-time data with our platform to bring your most important information to life on digital signage. We make it easy to display up-to-the-minute data and insights — stock prices, KPIs, queue lengths, weather, and more.</p>
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-outline mt-3">Learn More</a>
</div>
<div class="platform-visual">&#128202;</div>
</div>
<div class="platform-row">
<div class="platform-text">
<span class="section-label">Food &amp; Beverage</span>
<h3>Digital Menu Boards</h3>
<p>Make your menu as appealing as your product. We incorporate your branding and include high-quality photography to showcase your product in the most enticing way possible. Update menu items, prices, and specials instantly from our cloud CMS &mdash; no reprinting required.</p>
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-outline mt-3">See Examples</a>
</div>
<div class="platform-visual">&#127869;</div>
</div>
<div class="platform-row reverse">
<div class="platform-text">
<span class="section-label">Reliability</span>
<h3>Offline Playback Support</h3>
<p>Our intelligent player devices are engineered to keep your message on screen, even when the internet isn't available. So you can rely on them in locations where connecting to the internet is difficult or impossible. Content keeps playing, always.</p>
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-outline mt-3">View Devices</a>
</div>
<div class="platform-visual">&#128267;</div>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
INDUSTRIES
════════════════════════════════════════════════════════════════ -->
<section class="section section-alt">
<div class="container">
<div class="section-header">
<span class="section-label">Industries</span>
<h2>Solutions for Every Industry</h2>
<p class="lead">We understand that every industry has different communication needs. Our platform is flexible enough to serve them all.</p>
</div>
<div class="service-industry-grid">
<div class="service-industry-card" id="hospitality">
<div class="industry-icon">&#127974;</div>
<h3>Hospitality</h3>
<p>Showcase menus, promotions, and special events while guiding guests through lobbies, restaurants, and bars. Create a memorable first impression with polished, dynamic signage throughout your venue.</p>
</div>
<div class="service-industry-card" id="retail">
<div class="industry-icon">&#128717;</div>
<h3>Retail</h3>
<p>Drive product upsells, announce flash-sales, and offer in-store navigation with fresh, eye-catching displays. Update content instantly in response to stock levels, seasonal campaigns, or breaking promotions.</p>
</div>
<div class="service-industry-card" id="outdoor-marketplace">
<div class="industry-icon">&#127747;</div>
<h3>Outdoor Marketplace</h3>
<p>Whether it's a weekly farmers market or seasonal fairs, digital signage adds a modern, professional touch without losing the charm of the market experience. Perfect for weather-resilient, portable signage solutions.</p>
</div>
<div class="service-industry-card" id="corporate">
<div class="industry-icon">&#127970;</div>
<h3>Corporate Office</h3>
<p>Enhance your meeting experience with Teams-integrated meeting room displays. Communicate meeting schedules, company news, and employee alerts with live dashboards and internal communication screens.</p>
</div>
<div class="service-industry-card" id="live-data">
<div class="industry-icon">&#128308;</div>
<h3>Live Data Displays</h3>
<p>Connect your existing web dashboards and real-time data to our platform for customized digital signage. We bring your key metrics and insights to life in real-time — ideal for trading floors, operations centres, and control rooms.</p>
</div>
<div class="service-industry-card" id="education">
<div class="industry-icon">&#127979;</div>
<h3>Education</h3>
<p>Broadcast class schedules, announcements, and interactive learning content in campuses and auditoriums. Keep students and staff informed with centrally managed screens across your entire campus.</p>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
PLATFORM FEATURES
════════════════════════════════════════════════════════════════ -->
<section class="section">
<div class="container">
<div class="section-header">
<span class="section-label">Platform Features</span>
<h2>Built-In Features Included with Every Plan</h2>
<p class="lead">Every OTS Signs subscription comes loaded with powerful features to help you manage, schedule, and optimize your content.</p>
</div>
<div class="grid-4">
<div class="feature-card">
<div class="feature-icon">&#128197;</div>
<h3>Content Scheduling</h3>
<p>Schedule content to play at specific times, or daypart your messaging to show the right content at the right time of day.</p>
</div>
<div class="feature-card">
<div class="feature-icon">&#128202;</div>
<h3>Live Data Feeds</h3>
<p>Connect any web-accessible data source to your signage for automated, real-time content updates without manual intervention.</p>
</div>
<div class="feature-card">
<div class="feature-icon">&#128101;</div>
<h3>Unlimited Users</h3>
<p>Invite your whole team. Every plan includes unlimited user seats so everyone who needs access can contribute.</p>
</div>
<div class="feature-card">
<div class="feature-icon">&#9889;</div>
<h3>Instant Publishing</h3>
<p>Publish content to your signs in minutes. No complex deployments, no waiting — changes appear on screen immediately.</p>
</div>
<div class="feature-card">
<div class="feature-icon">&#128267;</div>
<h3>Offline Playback</h3>
<p>Intelligent caching means your screens never go dark, even during internet outages or in connectivity-limited locations.</p>
</div>
<div class="feature-card">
<div class="feature-icon">&#128274;</div>
<h3>Enterprise Security</h3>
<p>Role-based access control, encrypted connections, and enterprise-grade infrastructure keep your content and data safe.</p>
</div>
<div class="feature-card">
<div class="feature-icon">&#128187;</div>
<h3>Cloud Management</h3>
<p>Manage your entire network of screens from any browser on any device — no software installation required.</p>
</div>
<div class="feature-card">
<div class="feature-icon">&#128250;</div>
<h3>Any Screen</h3>
<p>Works with any HDMI-compatible display. Transition existing screens into smart signage with our compact player devices.</p>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
PRICING
════════════════════════════════════════════════════════════════ -->
<section class="section section-alt" id="pricing">
<div class="container">
<?php
$price_h = ots_meta( $id, 'pricing_heading', 'Affordable Solutions, Scalable Options' );
$price_sub = ots_meta( $id, 'pricing_subheading', 'Simple, transparent pricing with no hidden fees. Choose the plan that fits your business size.' );
?>
<div class="section-header">
<span class="section-label">Pricing</span>
<h2><?php echo esc_html( $price_h ); ?></h2>
<p class="lead"><?php echo wp_kses_post( $price_sub ); ?></p>
</div>
<div class="pricing-grid">
<div class="pricing-card">
<div class="pricing-name">Essentials</div>
<div class="pricing-price">
<div class="pricing-amount"><sup>$</sup>7</div>
<div class="pricing-per">per screen / month &mdash; or $70 / screen annually</div>
</div>
<ul class="pricing-features">
<li><span class="pricing-check">&#10003;</span> Up to 20 screens</li>
<li><span class="pricing-check">&#10003;</span> Content scheduling &amp; day-parting</li>
<li><span class="pricing-check">&#10003;</span> Live data integrations</li>
<li><span class="pricing-check">&#10003;</span> Unlimited user seats</li>
<li><span class="pricing-check">&#10003;</span> Custom subdomain</li>
<li><span class="pricing-check">&#10003;</span> Shared CMS server</li>
</ul>
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-outline" style="width:100%;justify-content:center;">Get Started</a>
</div>
<div class="pricing-card featured">
<div class="pricing-badge">Enterprise</div>
<div class="pricing-name">Pro</div>
<div class="pricing-price">
<div class="pricing-amount" style="font-size:1.75rem;">Contact Us</div>
<div class="pricing-per">Custom pricing for your scale</div>
</div>
<ul class="pricing-features">
<li><span class="pricing-check">&#10003;</span> 500+ screens</li>
<li><span class="pricing-check">&#10003;</span> Content scheduling &amp; day-parting</li>
<li><span class="pricing-check">&#10003;</span> Custom live data integrations</li>
<li><span class="pricing-check">&#10003;</span> Unlimited user seats</li>
<li><span class="pricing-check">&#10003;</span> Custom domain</li>
<li><span class="pricing-check">&#10003;</span> Dedicated CMS server</li>
</ul>
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-primary" style="width:100%;justify-content:center;">Contact Sales</a>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════
CTA
════════════════════════════════════════════════════════════════ -->
<section class="cta-banner">
<div class="container">
<?php
$cta_h = ots_meta( $id, 'cta_heading', 'Want to See How Our Platform Works?' );
$cta_txt = ots_meta( $id, 'cta_description', 'Request access to our demo instance and explore the OTS Signs platform hands-on.' );
?>
<h2><?php echo esc_html( $cta_h ); ?></h2>
<p><?php echo wp_kses_post( $cta_txt ); ?></p>
<div class="btn-group" style="justify-content:center;">
<a href="https://demo.ots-signs.com" target="_blank" rel="noopener" class="btn btn-lg" style="background:#fff;color:var(--color-primary);">Request Demo Access</a>
<a href="<?php echo esc_url( home_url( '/contact' ) ); ?>" class="btn btn-ghost btn-lg">Talk to Sales</a>
</div>
</div>
</section>
<?php get_footer(); ?>

View File

@@ -0,0 +1,34 @@
<?php
/**
* Default page template.
* Used for pages that don't specify a custom template.
*/
get_header();
?>
<div class="page-header-light"></div>
<section class="page-hero">
<div class="container">
<h1><?php the_title(); ?></h1>
</div>
</section>
<section class="section">
<div class="container" style="max-width:800px;">
<?php
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
?>
<div class="entry-content">
<?php the_content(); ?>
</div>
<?php
endwhile;
endif;
?>
</div>
</section>
<?php get_footer(); ?>

View File

@@ -0,0 +1,37 @@
<?php
/**
* Single post template.
*/
get_header();
?>
<div class="page-header-light"></div>
<section class="page-hero">
<div class="container">
<h1><?php the_title(); ?></h1>
<p class="lead" style="color:rgba(255,255,255,.6);"><?php echo get_the_date(); ?></p>
</div>
</section>
<section class="section">
<div class="container" style="max-width:800px;">
<article>
<div class="entry-content" style="line-height:1.8;color:var(--color-text-muted);">
<?php
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
the_content();
endwhile;
endif;
?>
</div>
</article>
<div style="margin-top:3rem;">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" class="btn btn-outline">&larr; Back to Home</a>
</div>
</div>
</section>
<?php get_footer(); ?>

View File

@@ -0,0 +1,12 @@
/*
Theme Name: OTS Signs
Theme URI: https://ots-signs.com
Author: OTS Signs
Author URI: https://ots-signs.com
Description: A clean, modern marketing theme for OTS Signs digital signage company.
Version: 1.0.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: ots-signs
Tags: digital-signage, marketing, modern, business
*/