| 开发者 | oriamarketing |
|---|---|
| 更新时间 | 2026年5月4日 23:14 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 6.9 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
/hub/ (for example /hub/blog and /hub/reviews). You can change the URL prefix to match your brand in Settings > Oria Site Sync — valid values are any single URL-safe word such as content, resources, or your own brand name. Legacy /oria/ paths keep working regardless, so existing links never break.
Lead-generation tools (embedded as widgets):
wp-sitemap.xml) with the per-post URL so search engines discover and rank them.[oria_embed] shortcode:
[oria_embed type="reviews"]
[oria_embed type="booking"]
[oria_embed type="estimator"]
[oria_embed type="ai-viz" height="800"]
What you need:
oria-site-sync folder to /wp-content/plugins/No. The plugin works with any WordPress theme automatically. SSR pages render inside your theme via get_header() and get_footer().
No. SSR responses are cached in WordPress transients (5 minutes for lists, 24 hours for individual posts) so the plugin only contacts Oria when content actually changes.
Iframes hide content from Google. With SSR, the HTML is part of your page on your domain, so search engines can crawl, index, and rank it as your content.
Yes. Use your Oria dashboard under Settings → Website Features. The plugin reads those toggles automatically and shows the current state inside Settings → Oria Site Sync.
/hub/ to anything you want in Settings → Oria Site Sync), but Oria's admin dashboard had no way to know what you set, so preview links generated in Oria assumed /hub/ and broke for tenants who customized the prefix to something else (e.g. /content/ or /resources/).url_prefix and the plugin version. Oria stores them per-tenant and uses them when building admin preview links, so the link in your Oria dashboard always points at the correct path on your WordPress site./blog wasn't recognized when the plugin tried to add a new "Blog" pointing at /hub/blog — different URLs, same intent, two menu entries. Now the plugin skips by label OR URL match (case-insensitive).Services Hub, Contact Form, or Chat off in Oria's settings, the next click of "Add enabled Oria pages" cleans them out of the WordPress menu instead of leaving orphans.enabledFeatures from Oria's /api/connect/branding response and only serves the approved hub pages on the tenant's WordPress site. Disabled pages fall through to a proper HTTP 404 instead of rendering thin duplicate content.wpcf7_mail_sent (after successful send)wpforms_process_completegform_after_submissionelementor_pro/forms/new_recordforminator_form_after_save_entry/areas/{city} with homeowner_scenario, costTable, neighborhoods, FAQ, and trade-aware content. Before this release the plugin only routed the two-slug /areas/{city}/{service} pattern, so every bare city page returned 404 — content was generated and indexed in the database but no public URL reached it. Now /areas/{city} routes to the same SSR rendering layer used by /hub/areas, surfacing the full per-city content. Sibling fix in the server's renderServiceArea ensures the actual generator field schema is rendered (was previously reading wrong field names and falling back to generic defaults).index, follow, max-image-preview:large so Google can show large image previews in search results.is_page(), is_singular(), and is_front_page() all returned false and the theme's menu logic fell through to defaults. Fix: oria_sync_pose_as_page() sets $wp_query->is_page = true + is_singular = true before get_header() so the theme sees Oria pages as first-class singular pages.nocache_headers() on SSR routes with Cache-Control: public, max-age=300, must-revalidate, stale-while-revalidate=60. Before this, if an edge CDN (Cloudflare, GoDaddy Gateway) ever cached a transient error response, the cache would stick for whatever the host's default TTL was — Alon's site had a stale 301→404 cached by Cloudflare for 31 days. Short explicit TTL means any incident self-heals within 5 minutes.<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" /> on every SSR surface. Before, the plugin relied on Google's default behavior and emitted no explicit directive; being explicit unlocks the Googlebot "large image preview" behavior in SERPs and signals intent to other crawlers (Bing, DuckDuckGo, Yandex).<meta property="article:published_time"> and <meta property="article:modified_time"> on SSR pages. The server already provides these timestamps in the render fragment; before 3.5.6 the plugin dropped them. These feed Google's Article / BlogPosting Rich Results freshness signal.logoUrl, og_image, and JSON-LD image/logo reference is now wrapped in an absolute-URL helper (toAbsoluteMediaUrl). Previously many references leaked relative paths into structured data and Open Graph tags — Google can't resolve /api/blog-images/... against the tenant's domain, so the image references were effectively broken. Affects BlogPosting publisher logo, Article image, Project/CreativeWork image, og_image on every surface. Deployed alongside plugin 3.5.6.<div> child of body except the topbar and iframe wrapper. On SSR pages that rule silently hid every theme wrapper div — the blog section was in the HTML but invisible. Scoped the rule to body.oria-iframe-mode so it only applies on iframe pages, and added that class to the iframe renderer's body tag..oria-card, .oria-grid, .oria-ssr-content etc. — the theme's default .entry-content typography gave huge headings and images ran at native width. Now list pages render as proper card grids with consistent typography, cover-cropped images, and mobile breakpoints./hub/book, /hub/chat, /hub/ai-viz, etc.) rendered unstyled — massive unconstrained SVG arrow, broken layout. Root cause: the plugin exits at the parse_request hook (priority 0) to beat WordPress routing, but that fires before wp_enqueue_scripts, so the style + script handles registered by oria_sync_register_embed_assets() didn't exist yet when the iframe renderer tried to enqueue them. Result: wp_enqueue_style() silently no-op'd and no <link> tag was emitted.wp_enqueue_style / wp_print_styles), just closes the hook-ordering gap.Call to undefined method WP_Sitemaps::add_provider() fatal that crashed every install with an API key set. The 3.4.0 sitemap hook used $sitemaps->add_provider(), which is not a method on WordPress Core's WP_Sitemaps class — the correct API is wp_register_sitemap_provider(). This was the real cause of Alon Design & Remodeling's WSOD on 2026-04-24 (the 3.5.1 try/catch wrappers didn't cover this because the bug lives in the wp_sitemaps_init closure, not in the new 3.5.0 pixel code). Now wrapped in try/catch as defense-in-depth.if ( ! function_exists( ... ) ) guard, preventing the "Cannot redeclare oria_sync_*" fatal that occurred when an older pre-WP.org install of the same functions (via the WPCode snippet) was still present alongside the new plugin. Tenants migrating from the snippet can now safely activate the plugin without first manually removing the snippet.empty($cfg['metaPixelId']) threw a TypeError.error_log() and silently skipped rather than bubbling into a fatal.oria_sync_safe_array_get() helper for null-safe nested array access.is_array, is_string) before use — no more implicit coercion surprises.oria_sync_inject_pixel, oria_sync_flush_pixel_cache) so WordPress can cleanly unregister the hooks if the plugin deactivates mid-request.<head>. PageView fires on load. No manual snippet install required.window.dispatchEvent(new CustomEvent('oria:lead_submitted')) from any form on the site will fire a Lead event to the tenant's pixel. Oria-rendered forms already dispatch this; custom forms can too.oria_sync_pixel_config) to avoid API round-trips on every pageview. Cache is invalidated automatically when the tenant changes their API key.<noscript> tracking pixel fallback included for browsers without JavaScript./areas/{city}/{service} (no prefix required) maps to Oria's auto-generated city × service landing pages. Before this release these URLs returned 404 on tenant domains because only single-slug routes under the configurable prefix were matched.Oria_Renderer::fetch_city_service() helper hits /api/connect/service-areas/:city/:service?render=html on the Oria API to retrieve pre-rendered SSR HTML and Schema.org markup (Service + LocalBusiness + FAQPage). 24-hour transient cache.oria_sync_render_city_service_page() wraps the fragment in the tenant's theme via get_header() / get_footer() so Google can crawl the content on the tenant's own domain.oria_sync_register_embed_assets() — the sequence wp_register_*/wp_enqueue_* inside the comment was prematurely closing the docblock (the */ inside that token). Rewrote to wp_register_style / wp_enqueue_style so PHP parses the docblock correctly.<style> and <script> output in the iframe embed render function replaced with wp_enqueue_style() and wp_enqueue_script() registering the new assets/embed.css and assets/embed.js static files (Plugin Guideline 13).get_header() and get_footer(). The content is part of your page on your domain, so Google indexes it as your content (iframes were not crawlable, so SEO link equity was leaking back to oriamarketing.com)./hub/* paths so SEO link equity flows through your domain.wp_head hook so SEO plugins like Yoast can observe and modify them.wp-sitemap.xml now lists every individual blog post, case study, area page, and project at its full URL with a per-post lastmod timestamp.
/api/connect/sitemap and cached for 1 hour.
Performance
$_SERVER['REQUEST_URI'] access now unslashed and sanitized via wp_unslash() and sanitize_text_field().parse_url() calls replaced with the WordPress wrapper wp_parse_url()./hub/estimate, /hub/photo-quote, /hub/contact, /hub/chat./oria/ to /hub/); legacy /oria/* paths still route for backward compatibility.[oria_embed] shortcode lets tenants drop any Oria widget into any WordPress page/post.