{"id":18068,"date":"2026-04-19T15:33:54","date_gmt":"2026-04-19T23:33:54","guid":{"rendered":"https:\/\/golive.vegas\/?page_id=18068"},"modified":"2026-04-19T16:19:15","modified_gmt":"2026-04-20T00:19:15","slug":"las-vegas-wedding-vendors","status":"publish","type":"page","link":"https:\/\/golive.vegas\/en\/las-vegas-wedding-vendors\/","title":{"rendered":"Las Vegas Wedding Vendors"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"18068\" class=\"elementor elementor-18068\">\n\t\t\t\t<div class=\"elementor-element elementor-element-116fd2e e-flex e-con-boxed e-con e-parent \" data-id=\"116fd2e\" data-element_type=\"container\" data-e-type=\"container\">\t\t\t<div class=\"e-con-inner\">\r\n\t\t\t\t<div class=\"elementor-element elementor-element-775f31a elementor-widget elementor-widget-spacer\" data-id=\"775f31a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t<div class=\"elementor-element elementor-element-06f8f54 e-flex e-con-boxed e-con e-parent \" data-id=\"06f8f54\" data-element_type=\"container\" data-e-type=\"container\">\t\t\t<div class=\"e-con-inner\">\r\n\t\t\t\t<div class=\"elementor-element elementor-element-3c01120 elementor-widget elementor-widget-html\" data-id=\"3c01120\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!--\nGo Live Vegas - Weddings Elementor HTML Widget\nSAFE VERSION: uses a public Cloud Function endpoint instead of direct Firestore reads.\n\nWHAT YOU NEED TO EDIT:\n1) Deploy the publicWeddingVendors function.\n2) Paste the function URL into API_URL below.\n3) Paste this whole file into an Elementor HTML widget.\n-->\n\n<div id=\"glv-weddings-root\">\n  <div class=\"glv-weddings-shell\">\n    <div class=\"glv-weddings-hero\">\n      <h2>Go Live Vegas Weddings<\/h2>\n      <p>Discover Las Vegas wedding venues and wedding services featured in Go Live Vegas.<\/p>\n\n      <div class=\"glv-weddings-support\">\n        <h3>Why advertise in the Go Live Vegas wedding vendor section<\/h3>\n        <p>Advertising in the wedding vendor section helps local Las Vegas businesses, vendors, entertainers, and wedding professionals reach people who are actively planning weddings, receptions, parties, and special events. It gives your business more visibility in front of couples, families, visitors, and local audiences looking for trusted services in Las Vegas.<\/p>\n        <p>It also helps connect your business to the Go Live Vegas website and app, giving you another place to be discovered by users searching for venues, entertainment, beauty services, planners, florists, transportation, photography, and other wedding-related services.<\/p>\n        <p>If you want to promote your business in the app and on the website, you can apply here.<\/p>\n        <div class=\"glv-weddings-support-actions\">\n          <a class=\"glv-weddings-btn glv-weddings-btn-primary\" href=\"https:\/\/golive.vegas\/?page_id=17889\" target=\"_blank\" rel=\"noopener noreferrer\">Apply to Advertise Your Business<\/a>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"glv-weddings-toolbar\">\n      <input id=\"glv-weddings-search\" type=\"text\" placeholder=\"Search venues, services, categories...\" \/>\n      <select id=\"glv-weddings-category\">\n        <option value=\"\">All Categories<\/option>\n      <\/select>\n      <button id=\"glv-weddings-refresh\" type=\"button\">Refresh<\/button>\n    <\/div>\n\n    <div id=\"glv-weddings-status\" class=\"glv-weddings-status\">Loading wedding vendors...<\/div>\n\n    <section class=\"glv-weddings-section\">\n      <div class=\"glv-weddings-section-head\">\n        <h3>Featured Wedding Vendors<\/h3>\n        <p>Highlighted wedding partners and venues in Las Vegas.<\/p>\n      <\/div>\n      <div id=\"glv-weddings-featured\" class=\"glv-weddings-grid\"><\/div>\n    <\/section>\n\n    <section class=\"glv-weddings-section\">\n      <div class=\"glv-weddings-section-head\">\n        <h3>All Wedding Vendors<\/h3>\n        <p>Browse venues, services, and wedding resources from Go Live Vegas.<\/p>\n      <\/div>\n      <div id=\"glv-weddings-grid\" class=\"glv-weddings-grid\"><\/div>\n    <\/section>\n  <\/div>\n<\/div>\n\n<style>\n  #glv-weddings-root {\n    color: #ffffff;\n    font-family: Arial, Helvetica, sans-serif;\n  }\n\n  #glv-weddings-root * {\n    box-sizing: border-box;\n  }\n\n  .glv-weddings-shell {\n    max-width: 1240px;\n    margin: 0 auto;\n    padding: 20px;\n  }\n\n  .glv-weddings-hero {\n    margin-bottom: 18px;\n  }\n\n  .glv-weddings-hero h2 {\n    margin: 0 0 10px;\n    font-size: 34px;\n    line-height: 1.08;\n    color: #ffffff;\n  }\n\n  .glv-weddings-hero p {\n    margin: 0;\n    color: rgba(255,255,255,.82);\n    font-size: 16px;\n    line-height: 1.55;\n    max-width: 820px;\n  }\n\n\n  .glv-weddings-support {\n    margin-top: 18px;\n    padding: 18px;\n    border-radius: 16px;\n    background: rgba(255,255,255,.06);\n    border: 1px solid rgba(255,255,255,.10);\n  }\n\n  .glv-weddings-support h3 {\n    margin: 0 0 10px;\n    font-size: 22px;\n    line-height: 1.2;\n    color: #ffffff;\n  }\n\n  .glv-weddings-support p {\n    margin: 0 0 12px;\n    color: rgba(255,255,255,.84);\n    font-size: 15px;\n    line-height: 1.6;\n    max-width: 980px;\n  }\n\n  .glv-weddings-support p:last-of-type {\n    margin-bottom: 0;\n  }\n\n  .glv-weddings-support-actions {\n    display: flex;\n    gap: 10px;\n    flex-wrap: wrap;\n    margin-top: 16px;\n  }\n\n  .glv-weddings-toolbar {\n    display: flex;\n    gap: 10px;\n    flex-wrap: wrap;\n    margin: 18px 0 16px;\n  }\n\n  .glv-weddings-toolbar input,\n  .glv-weddings-toolbar select {\n    min-width: 220px;\n    padding: 12px 14px;\n    border-radius: 12px;\n    border: 1px solid rgba(255,255,255,.16);\n    background: rgba(255,255,255,.08);\n    color: #fff;\n    outline: none;\n    font-size: 15px;\n  }\n\n  .glv-weddings-toolbar input {\n    flex: 1 1 280px;\n  }\n\n  .glv-weddings-toolbar option {\n    color: #111;\n  }\n\n  .glv-weddings-toolbar button,\n  .glv-weddings-btn {\n    appearance: none;\n    border: 0;\n    border-radius: 12px;\n    padding: 12px 16px;\n    text-decoration: none;\n    cursor: pointer;\n    font-weight: 700;\n    font-size: 14px;\n    transition: transform .15s ease, opacity .15s ease;\n  }\n\n  .glv-weddings-toolbar button {\n    background: #f9b000;\n    color: #111;\n  }\n\n  .glv-weddings-toolbar button:hover,\n  .glv-weddings-btn:hover {\n    transform: translateY(-1px);\n    opacity: .95;\n  }\n\n  .glv-weddings-status {\n    margin: 6px 0 18px;\n    color: rgba(255,255,255,.74);\n    font-size: 14px;\n  }\n\n  .glv-weddings-section {\n    margin-top: 28px;\n  }\n\n  .glv-weddings-section-head {\n    margin-bottom: 14px;\n  }\n\n  .glv-weddings-section-head h3 {\n    margin: 0 0 6px;\n    font-size: 26px;\n    line-height: 1.15;\n    color: #ffffff;\n  }\n\n  .glv-weddings-section-head p {\n    margin: 0;\n    color: rgba(255,255,255,.72);\n    font-size: 14px;\n  }\n\n  .glv-weddings-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n    gap: 18px;\n  }\n\n  .glv-weddings-card {\n    background: linear-gradient(180deg, rgba(255,255,255,.10), rgba(255,255,255,.05));\n    border: 1px solid rgba(255,255,255,.10);\n    border-radius: 18px;\n    overflow: hidden;\n    backdrop-filter: blur(8px);\n    box-shadow: 0 10px 28px rgba(0,0,0,.24);\n  }\n\n  .glv-weddings-card.is-featured {\n    border-color: rgba(249,176,0,.35);\n    box-shadow: 0 10px 28px rgba(0,0,0,.24), 0 0 0 1px rgba(249,176,0,.18) inset;\n  }\n\n  .glv-weddings-media {\n    aspect-ratio: 16 \/ 9;\n    overflow: hidden;\n    background: rgba(255,255,255,.05);\n  }\n\n  .glv-weddings-media img {\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n    display: block;\n  }\n\n  .glv-weddings-media-fallback {\n    width: 100%;\n    height: 100%;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    color: rgba(255,255,255,.55);\n    font-size: 14px;\n    background: rgba(255,255,255,.04);\n  }\n\n  .glv-weddings-body {\n    padding: 16px;\n  }\n\n  .glv-weddings-badges {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n    margin-bottom: 10px;\n  }\n\n  .glv-weddings-badge {\n    display: inline-flex;\n    align-items: center;\n    border-radius: 999px;\n    padding: 6px 10px;\n    font-size: 11px;\n    font-weight: 700;\n    letter-spacing: .04em;\n    text-transform: uppercase;\n  }\n\n  .glv-weddings-badge.featured {\n    background: rgba(249,176,0,.18);\n    color: #ffd36a;\n    border: 1px solid rgba(249,176,0,.28);\n  }\n\n  .glv-weddings-badge.standard {\n    background: rgba(255,255,255,.10);\n    color: #ffffff;\n    border: 1px solid rgba(255,255,255,.16);\n  }\n\n  .glv-weddings-title {\n    margin: 0 0 10px;\n    font-size: 22px;\n    line-height: 1.24;\n    color: #ffffff;\n  }\n\n  .glv-weddings-meta {\n    margin: 0 0 6px;\n    font-size: 14px;\n    color: rgba(255,255,255,.80);\n    line-height: 1.45;\n  }\n\n  .glv-weddings-desc {\n    margin: 12px 0 16px;\n    font-size: 14px;\n    line-height: 1.55;\n    color: rgba(255,255,255,.88);\n  }\n\n  .glv-weddings-actions {\n    display: flex;\n    gap: 10px;\n    flex-wrap: wrap;\n  }\n\n  .glv-weddings-btn-primary {\n    background: #f9b000;\n    color: #111;\n  }\n\n  .glv-weddings-btn-secondary {\n    background: rgba(255,255,255,.10);\n    color: #ffffff;\n    border: 1px solid rgba(255,255,255,.12);\n  }\n\n  .glv-weddings-empty,\n  .glv-weddings-error {\n    padding: 22px;\n    border-radius: 16px;\n    background: rgba(255,255,255,.06);\n    border: 1px solid rgba(255,255,255,.08);\n    color: #ffffff;\n  }\n\n  @media (max-width: 767px) {\n    .glv-weddings-shell {\n      padding: 14px;\n    }\n\n    .glv-weddings-hero h2 {\n      font-size: 28px;\n    }\n\n    .glv-weddings-section-head h3 {\n      font-size: 22px;\n    }\n  }\n<\/style>\n\n<script>\n  (function () {\n    const API_URL = \"https:\/\/us-central1-go-vegas-live.cloudfunctions.net\/publicWeddingVendors\";\n\n    const searchEl = document.getElementById(\"glv-weddings-search\");\n    const categoryEl = document.getElementById(\"glv-weddings-category\");\n    const refreshBtn = document.getElementById(\"glv-weddings-refresh\");\n    const statusEl = document.getElementById(\"glv-weddings-status\");\n    const featuredGrid = document.getElementById(\"glv-weddings-featured\");\n    const vendorsGrid = document.getElementById(\"glv-weddings-grid\");\n\n    let allVendors = [];\n    let featuredVendors = [];\n\n    function escapeHtml(value) {\n      return String(value ?? \"\")\n        .replace(\/&\/g, \"&amp;\")\n        .replace(\/<\/g, \"&lt;\")\n        .replace(\/>\/g, \"&gt;\")\n        .replace(\/\"\/g, \"&quot;\")\n        .replace(\/'\/g, \"&#039;\");\n    }\n\n    function normalizeUrl(url) {\n      const value = String(url || \"\").trim();\n      if (!value) return \"\";\n      if (value.startsWith(\"http:\/\/\") || value.startsWith(\"https:\/\/\") || value.startsWith(\"tel:\")) return value;\n      if (\/^\\+?[0-9()\\-\\s]+$\/.test(value)) {\n        return \"tel:\" + value.replace(\/\\s+\/g, \"\");\n      }\n      return \"https:\/\/\" + value.replace(\/^\\\/+\/, \"\");\n    }\n\n    function truncate(text, max) {\n      const str = String(text || \"\").trim();\n      if (str.length <= max) return str;\n      return str.slice(0, max).trimEnd() + \"...\";\n    }\n\n    function buildCategories(vendors) {\n      const categories = new Set();\n      vendors.forEach((v) => {\n        if (v.category) categories.add(v.category);\n        if (v.subCategory) categories.add(v.subCategory);\n      });\n\n      const current = categoryEl.value;\n      const options = ['<option value=\"\">All Categories<\/option>']\n        .concat(Array.from(categories).sort().map((c) => `<option value=\"${escapeHtml(c)}\">${escapeHtml(c)}<\/option>`));\n      categoryEl.innerHTML = options.join(\"\");\n      categoryEl.value = current;\n    }\n\n    function vendorMatches(vendor, term, category) {\n      const matchesCategory = !category ||\n        vendor.category === category ||\n        vendor.subCategory === category;\n\n      if (!matchesCategory) return false;\n\n      if (!term) return true;\n\n      const haystack = [\n        vendor.name,\n        vendor.description,\n        vendor.address,\n        vendor.category,\n        vendor.subCategory,\n        vendor.zone,\n        vendor.serviceArea,\n        Array.isArray(vendor.tags) ? vendor.tags.join(\" \") : \"\"\n      ].join(\" \").toLowerCase();\n\n      return haystack.includes(term);\n    }\n\n    function vendorCardHtml(vendor) {\n      const imageUrl = normalizeUrl(vendor.imageUrl || \"\");\n      const website = normalizeUrl(vendor.website || \"\");\n      const phone = normalizeUrl(vendor.phone || \"\");\n      const title = escapeHtml(vendor.name || \"Wedding Vendor\");\n      const category = escapeHtml(vendor.category || \"\");\n      const subCategory = escapeHtml(vendor.subCategory || \"\");\n      const address = escapeHtml(vendor.address || \"\");\n      const desc = escapeHtml(truncate(vendor.description || \"\", 180));\n      const price = escapeHtml(vendor.priceTier || vendor.priceLabel || \"\");\n      const verified = vendor.verified === true;\n\n      return `\n        <article class=\"glv-weddings-card ${vendor.featured ? \"is-featured\" : \"\"}\">\n          <div class=\"glv-weddings-media\">\n            ${imageUrl\n              ? `<img decoding=\"async\" src=\"${escapeHtml(imageUrl)}\" alt=\"${title}\" loading=\"lazy\">`\n              : '<div class=\"glv-weddings-media-fallback\">Go Live Vegas Weddings<\/div>'}\n          <\/div>\n          <div class=\"glv-weddings-body\">\n            <div class=\"glv-weddings-badges\">\n              ${vendor.featured ? '<span class=\"glv-weddings-badge featured\">Featured<\/span>' : ''}\n              ${category ? `<span class=\"glv-weddings-badge standard\">${category}<\/span>` : \"\"}\n              ${subCategory ? `<span class=\"glv-weddings-badge standard\">${subCategory}<\/span>` : \"\"}\n              ${verified ? '<span class=\"glv-weddings-badge standard\">Verified<\/span>' : \"\"}\n            <\/div>\n            <h3 class=\"glv-weddings-title\">${title}<\/h3>\n            ${address ? `<p class=\"glv-weddings-meta\"><strong>Address:<\/strong> ${address}<\/p>` : \"\"}\n            ${price ? `<p class=\"glv-weddings-meta\"><strong>Pricing:<\/strong> ${price}<\/p>` : \"\"}\n            ${desc ? `<p class=\"glv-weddings-desc\">${desc}<\/p>` : \"\"}\n            <div class=\"glv-weddings-actions\">\n              ${website ? `<a class=\"glv-weddings-btn glv-weddings-btn-primary\" href=\"${escapeHtml(website)}\" target=\"_blank\" rel=\"noopener noreferrer\">Visit Website<\/a>` : \"\"}\n              ${phone ? `<a class=\"glv-weddings-btn glv-weddings-btn-secondary\" href=\"${escapeHtml(phone)}\">Call Vendor<\/a>` : \"\"}\n            <\/div>\n          <\/div>\n        <\/article>\n      `;\n    }\n\n    function render() {\n      const term = (searchEl.value || \"\").trim().toLowerCase();\n      const category = categoryEl.value || \"\";\n\n      const filteredAll = allVendors.filter((vendor) => vendorMatches(vendor, term, category));\n      const filteredFeatured = featuredVendors.filter((vendor) => vendorMatches(vendor, term, category));\n\n      featuredGrid.innerHTML = filteredFeatured.length\n        ? filteredFeatured.map((vendor) => vendorCardHtml(vendor)).join(\"\")\n        : '<div class=\"glv-weddings-empty\">No featured wedding vendors found right now.<\/div>';\n\n      vendorsGrid.innerHTML = filteredAll.length\n        ? filteredAll.map((vendor) => vendorCardHtml(vendor)).join(\"\")\n        : '<div class=\"glv-weddings-empty\">No wedding vendors found right now.<\/div>';\n\n      statusEl.textContent = filteredFeatured.length + ' featured vendor(s) and ' + filteredAll.length + ' total vendor(s) loaded';\n    }\n\n    async function loadData() {\n      if (!API_URL || API_URL.indexOf(\"PASTE_YOUR_PUBLIC_WEDDING_FUNCTION_URL_HERE\") !== -1) {\n        statusEl.textContent = \"Add your wedding Cloud Function URL in the API_URL constant first.\";\n        featuredGrid.innerHTML = '<div class=\"glv-weddings-error\">API URL missing. Paste your deployed publicWeddingVendors function URL into the HTML file.<\/div>';\n        vendorsGrid.innerHTML = '<div class=\"glv-weddings-error\">API URL missing. Paste your deployed publicWeddingVendors function URL into the HTML file.<\/div>';\n        return;\n      }\n\n      statusEl.textContent = \"Loading wedding vendors...\";\n      featuredGrid.innerHTML = \"\";\n      vendorsGrid.innerHTML = \"\";\n\n      try {\n        const response = await fetch(API_URL, {\n          method: \"GET\",\n          headers: { \"Accept\": \"application\/json\" }\n        });\n\n        const data = await response.json();\n        if (!response.ok || !data || data.ok !== true) {\n          throw new Error((data && data.error) || \"Unable to load wedding vendors\");\n        }\n\n        allVendors = Array.isArray(data.vendors) ? data.vendors : [];\n        featuredVendors = Array.isArray(data.featuredVendors) ? data.featuredVendors : [];\n        buildCategories(allVendors);\n        render();\n      } catch (error) {\n        console.error(error);\n        statusEl.textContent = error && error.message ? error.message : \"Load failed\";\n        featuredGrid.innerHTML = '<div class=\"glv-weddings-error\">Unable to load featured wedding vendors right now.<\/div>';\n        vendorsGrid.innerHTML = '<div class=\"glv-weddings-error\">Unable to load wedding vendors right now.<\/div>';\n      }\n    }\n\n    searchEl.addEventListener(\"input\", render);\n    categoryEl.addEventListener(\"change\", render);\n    refreshBtn.addEventListener(\"click\", loadData);\n\n    loadData();\n  })();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Go Live Vegas Weddings Discover Las Vegas wedding venues and wedding services featured in Go Live Vegas. Why advertise in the Go Live Vegas wedding vendor section Advertising in the wedding vendor section helps local Las Vegas businesses, vendors, entertainers, and wedding professionals reach people who are actively planning weddings, receptions, parties, and special events. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"footnotes":""},"class_list":["post-18068","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/golive.vegas\/wp-json\/wp\/v2\/pages\/18068","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/golive.vegas\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/golive.vegas\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/golive.vegas\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/golive.vegas\/wp-json\/wp\/v2\/comments?post=18068"}],"version-history":[{"count":5,"href":"https:\/\/golive.vegas\/wp-json\/wp\/v2\/pages\/18068\/revisions"}],"predecessor-version":[{"id":18102,"href":"https:\/\/golive.vegas\/wp-json\/wp\/v2\/pages\/18068\/revisions\/18102"}],"wp:attachment":[{"href":"https:\/\/golive.vegas\/wp-json\/wp\/v2\/media?parent=18068"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}