尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A comprehensive WordPress plugin that provides an interactive tire catalog for Rivian vehicle owners. Features advanced filtering, side-by-side comparison, user and guest reviews, affiliate link management, analytics, and an efficiency scoring system to help drivers choose the best tires for range and performance.
翻譯準備中
正在載入完整 README。 以下為已儲存的摘錄。
A comprehensive WordPress plugin that provides an interactive tire catalog for Rivian vehicle owners. Features advanced filtering, side-by-side comparison, user and guest reviews, affiliate link management, analytics, and an efficiency scoring system to help drivers choose the best tires for range and performance.檢視完整 README ↗A comprehensive WordPress plugin that provides an interactive tire catalog for Rivian vehicle owners. Features advanced filtering, side-by-side comparison, user and guest reviews, affiliate link management, analytics, and an efficiency scoring system to help drivers choose the best tires for range and performance.
?brand=Michelin&size=275/65R18), enabling shareable links and browser back/forward navigation.WHATS-NEW.md), with a dot until the newest release has been seen; the same notes live at /tire-guide/whats-new/.shoppingProducts request per tire size, scoped to the configured advertisers. Includes a Test Connection button that runs a real query and reports CJ's own errors.RTG_CJ_PAT constant in wp-config.php when defined (keeping it out of the database), otherwise from a write-only settings field that never renders the saved value back. No credentials are stored in the repository.RTG_Catalog_Source interface and register via the rtg_catalog_sources filter. A JSON-backed source also ships with the plugin as a fallback for retailers with no machine-readable feed.navigator.sendBeacon() with 5-second server-side deduplication.?tire= link shows rich previews with tire name, description, price, and image..min.js and .min.css files with console stripping. Served automatically when SCRIPT_DEBUG is off.fa-solid) rendered by the site's theme; the plugin enqueues no icon font of its own.role, aria-label, aria-checked, aria-expanded, aria-controls, aria-live on all interactive elements..screen-reader-text utility class, status regions for dynamic content.prefers-reduced-motion for animations.GET /wp-json/rtg/v1/tires — Filtered, paginated tire listing.GET /wp-json/rtg/v1/tires/{tire_id} — Single tire with ratings.GET /wp-json/rtg/v1/tires/{tire_id}/reviews — Paginated reviews.GET /wp-json/rtg/v1/feed — Full tire catalog JSON feed with ratings and Roamer real-world efficiency data.GET /wp-json/rtg/v1/whats-new — The parsed release notes the guide's Changelog dialog loads.POST /wp-json/rtg/v1/advise — Help me choose: three picks with reasons and trade-offs.GET /wp-json/rtg/v1/tires/{tire_id}/review-summary — "What owners say" for a tire page.GET /wp-json/rtg/v1/compare-summary?ids=a,b — The compare page's plain-words paragraph.wp-content/plugins/ directory:
wp-content/plugins/rivian-tire-guide/
cd wp-content/plugins/rivian-tire-guide
npm install && npm run build
[rivian_tire_guide] to any page or post.Tire Guide — Place on any page to display the full catalog:
[rivian_tire_guide]
With pre-filter attributes:
[rivian_tire_guide vehicle="R1" brand="Michelin" category="All-Season" size="275/65R20" sort="price-asc" 3pms="yes"]
User Reviews — Display all reviews by a specific user (via ?reviewer=ID URL param). Without the param the page shows the signed-in visitor's own reviews, so a "My reviews" menu item can link the page's bare URL (default /user-reviews/); signed-out visitors are asked to sign in. Member names on a tire page link here. The page is styled like the tire page (breadcrumb, title, one card per review with the tire linked to its page) from its own stylesheet, frontend/css/user-reviews.css.
[rivian_user_reviews]
Saved Tires — A signed-in member's shortlist (the heart on cards and tire pages). The plugin serves it at /saved-tires/ (the slug is a setting) on its own, marked noindex; a published page at that slug with the shortcode takes over, so it can sit in a menu next to My Reviews:
[rivian_saved_tires]
Write a Review — The review page. The plugin serves it at /tire-review/ (the slug is a setting) on its own, marked noindex. To control the page's SEO, create a WordPress page at that same slug with the shortcode in it: a published page at the review slug takes over from the built-in route, and your SEO plugin handles its title, description and indexing like any other page.
[rivian_tire_review]
For bulk operations, use Tire Guide > Tools to import tires via CSV.
Tire Guide > Wheels holds one row per wheel: a name, the stock tire size, alternate sizes, an image, the vehicles it fits, and a sort order. Every vehicle-to-size rule in the plugin is derived from these rows: the vehicle toggle, the size menu, the load-index fitment checks, the advisor's candidates, the discovery qualifier and the review page's vehicle switch. There is no separate size list to maintain.
To list a size Rivian never offered, add a wheel, set Source to Third-party, enter the size it is run with as its stock size (and any others as alternates), tick the vehicle, and write a Fitment note such as "Needs an 8.5-inch or wider wheel around ET35. Some owners report light rubbing at full lock." The note shows under the tire page's third-party notice, in the card's info tooltip, and on the wheel guide card. A size is treated as third-party for a vehicle only when no factory wheel for that vehicle lists it; a factory listing always wins. Add the size to the sizes list and the size-to-diameter map under Settings > Dropdown Options so the tire page can show its overall diameter.
The plugin registers a custom URL at /tire-compare/ (configurable in settings). Users select tires from the guide and compare specs side-by-side with best-value highlighting.
Settings → AI Tire Advisor. Add an Anthropic API key (or define RTG_ANTHROPIC_API_KEY in wp-config.php), pick a model (Claude Opus 5 by default), and set the per-visitor limit. Answers are cached (a day for picks and comparisons, thirty days for review summaries) and keyed on the catalog, so an edit to a tire or a new review refreshes them. With the advisor on and no key, "Help me choose" still works from the guide's rules; the review summaries and the compare paragraph need a key. Routes: POST /wp-json/rtg/v1/advise, GET /wp-json/rtg/v1/tires/{id}/review-summary, GET /wp-json/rtg/v1/compare-summary?ids=a,b.
The plugin registers /tire-guide/whats-new/, rendered inside the theme from WHATS-NEW.md at the plugin root. Write that file for owners, not developers: one ## version - date heading per release, an optional intro line, then bullets that open with a bold lead sentence. Skip releases with nothing visible. It is parsed once per plugin version (or file edit) and also served at GET /wp-json/rtg/v1/whats-new for the guide's Changelog dialog.
Navigate to Tire Guide > Settings to configure:
rivian-tire-guide/
├── rivian-tire-guide.php # Main plugin entry point
├── CHANGELOG.md # Developer record: reasons, file names, tests
├── WHATS-NEW.md # Owner-facing release notes (rendered in the guide)
├── ROADMAP.md # Open items and what has shipped
├── uninstall.php # Cleanup on plugin deletion
├── package.json # Build tools (esbuild) and the Node test script
├── esbuild.config.mjs # Build configuration
├── includes/
│ ├── class-rtg-activator.php # Database creation & numbered migrations
│ ├── class-rtg-deactivator.php # Deactivation cleanup
│ ├── class-rtg-database.php # All database operations, caching, the vehicle and third-party size maps
│ ├── class-rtg-fitment.php # Load-index and third-party wheel fitment rules (JS twin: modules/fitment.js)
│ ├── class-rtg-admin.php # Admin UI, CSV import/export, settings, wheel editor
│ ├── class-rtg-frontend.php # Shortcode rendering & asset enqueue
│ ├── class-rtg-ajax.php # AJAX endpoints (ratings, reviews, analytics, filter options)
│ ├── class-rtg-rest-api.php # REST API endpoints and the cached /feed
│ ├── class-rtg-rate-limiter.php # Shared per-IP limiter for reviews and REST
│ ├── class-rtg-compare.php # Comparison page routing & CSP headers
│ ├── class-rtg-tire-page.php # /tires/{slug}/ landing pages
│ ├── class-rtg-tire-review.php # /tire-review/ page and its shortcode
│ ├── class-rtg-theme-render.php # Renders routed pages inside the theme; ad blocklist
│ ├── class-rtg-schema.php # Schema.org JSON-LD structured data
│ ├── class-rtg-meta.php # Per-tire meta, Open Graph & Twitter Cards
│ ├── class-rtg-whats-new.php # What's new: notes parser, page, REST route
│ ├── class-rtg-advisor.php # AI Tire Advisor: ranking, prompts, Claude client, routes
│ ├── class-rtg-roamer-sync.php # Rivian Roamer efficiency data sync
│ ├── class-rtg-catalog-sync.php # Tire Discovery: the daily catalog check
│ ├── class-rtg-catalog-source.php # Retailer source interface (+ class-rtg-catalog-source-cj.php)
│ ├── class-rtg-tire-qualifier.php # Discovery: spec parsing and qualification rules
│ ├── class-rtg-candidates.php # Discovery: the review queue table
│ ├── class-rtg-catalog-presence.php, class-rtg-coverage.php, class-rtg-health.php
│ ├── class-rtg-price-sync.php, class-rtg-stale-prices.php, class-rtg-retailer.php
│ ├── class-rtg-link-sync.php, class-rtg-link-checker.php, class-rtg-tire-images.php
│ ├── class-rtg-lock.php # Named locks for cron and migrations
│ └── class-rtg-mailer.php # HTML email notifications
├── admin/
│ ├── views/ # Admin page templates (14 views, incl. wheel-list / wheel-edit and tire-discovery)
│ ├── css/ # Admin stylesheet (+ .min)
│ └── js/ # admin-scripts.js, rtg-discovery.js, rtg-roamer.js
├── frontend/
│ ├── templates/ # tire-guide, tire-page-content, compare, tire-review, user-reviews, whats-new
│ ├── css/ # rivian-tires.css (+ .min)
│ └── js/
│ ├── rivian-tires.js # Main entry point (ES modules, bundled)
│ ├── compare.js # Comparison page (bundled, shares the guide's modules)
│ ├── tire-page.js # Tire page interactions
│ ├── tire-review.js # Review page (not bundled)
│ ├── user-reviews.js # User reviews page script
│ ├── rtg-shared.js # Shared URL validation & escaping
│ └── modules/ # Focused ES modules
│ ├── state.js # Global state, incl. the vehicle and third-party size maps
│ ├── helpers.js # DOM utilities, debounce, icons
│ ├── validation.js # Input sanitization & patterns
│ ├── allowed-domains.js # Link domain allowlist
│ ├── analytics.js # Click & search tracking
│ ├── cards.js # Tire card rendering and the fitment slot
│ ├── fitment.js # Load-index and third-party fitment (PHP twin: class-rtg-fitment.php)
│ ├── pricing.js # Set-of-four price and freshness
│ ├── efficiency.js # Efficiency badge helpers
│ ├── vehicle-memory.js # Remembered vehicle toggle
│ ├── compare.js # Compare checkbox & bar
│ ├── filters.js # Filter UI, size menu, sorting, URL state
│ ├── ratings.js # Card ratings: loading, stars, posting
│ ├── search.js # Smart search autocomplete
│ ├── server.js # Server-side pagination
│ ├── tooltips.js # Info (i) notes, in the dialog shell
│ ├── image-modal.js # Photo lightbox, in the dialog shell
│ ├── dialog.js # The dialog shell every dialog is built on
│ ├── whats-new.js # Changelog link + dialog
│ └── advisor.js # Help me choose dialog
├── tests/
│ ├── bootstrap.php # PHPUnit WordPress test bootstrap
│ ├── test-*.php # PHPUnit suites (database, activator, admin, ajax, fitment, advisor, discovery, sync, ...)
│ ├── test-validation.js # Node: input validation
│ ├── test-*.mjs # Node: dropdown options, domain sync, fitment, pricing, efficiency
│ └── contract/ # Plain-PHP contract checks (advisor, CJ lookup, health, what's new)
├── .phpcs.xml # PHP CodeSniffer config (WordPress standards)
└── .github/
└── workflows/ci.yml # CI: JS tests + build check, PHPUnit, PHP lint + contracts, PHPCS
The plugin creates 6 tables (all prefixed with wp_rtg_):
| Table | Purpose |
|---|---|
rtg_tires | Main tire catalog (38 columns) |
rtg_ratings | User and guest reviews with moderation and optional detail ratings |
rtg_wheels | Wheel guide: factory wheels and third-party setups (source, fitment_note), the source of every vehicle-to-size rule |
rtg_click_events | Affiliate link click tracking |
rtg_search_events | Search, filter and advisor analytics |
rtg_tire_candidates | Tire Discovery review queue |
Schema changes are managed via a numbered migration system (rtg_db_version option, currently v27).
npm install
npm run build # One-time production build (minified JS/CSS, console stripped)
npm run build:watch # Watch mode for development
npm test # Six Node suites: validation, dropdown options, domain sync, fitment, pricing, efficiency
php tests/contract/*.php # Plain-PHP contract checks (no WordPress needed)
PHP tests require a WordPress test environment:
phpunit # PHPUnit suites (350+ tests across 23 files)
PHP coding standards:
phpcs --standard=.phpcs.xml # Run WordPress Coding Standards checks
GitHub Actions runs on every push and PR:
This plugin follows WordPress security best practices:
$wpdb->prepare() with parameterized placeholderssanitize_text_field, sanitize_email, sanitize_textarea_field, esc_url_raw, intval, etc.)esc_html, esc_url, esc_attr)manage_options) on all admin actionsfinfortg-shared.js) as single source of truthFor security concerns, see SECURITY.md.
Proprietary. All rights reserved by RivianTrackr.
For issues, feature requests, or questions, please open an issue on this repository.