| 开发者 | seresa8 |
|---|---|
| 更新时间 | 2026年8月9日 15:52 |
| PHP版本: | 8.3 及以上 |
| WordPress版本: | 7.0.1 |
| 版权: | GPL-2.0+ |
| 版权网址: | 版权信息 |
wp-content/plugins/).= Can I use this plugin just to generate UTM parameter query strings? =\ Yes! The plugin allows you to easily generate UTM parameter query strings for your marketing campaigns. You can create both plain and coded UTM query strings with simple click options. If you only need to generate and use UTM parameters without decoding, you can do so without enabling the decoding feature. = Can I use plain UTM parameters instead of coded ones? =\ Yes! The plugin supports both plain and coded UTM parameters. If you don’t enable decoding, your standard UTM parameters will work as usual. If you want extra protection against ad blockers, you can enable decoding in the plugin settings. = How do I enable coded UTM decoding? =\ Go to Settings > WP inPIPE and turn on the option for Coded UTM Processing. When enabled, the plugin will detect and decode coded UTM query strings, replacing them with the full UTM parameters in the URL bar and pushing them to the dataLayer. By pushing decoded UTM parameters directly into the dataLayer, Web GTM can receive the data without requiring extra configurations to extract and manage UTM values. This simplifies tracking setup and ensures cleaner data in your analytics.
UTM API Access is a secure, key-protected REST API that lets external tools, scripts, and AI automations create, list, update, and delete your UTM links without using the dashboard. It exposes four server-to-server endpoints under /wp-json/inpipe/v1/ext/ — utm-generate, utm-list, utm-delete, and status. Full details, authentication, and code examples are in the inPIPE UTM API Documentation.
First make sure UTM Processing is enabled, then open the UTM API Access panel in the inPIPE settings. Turn on the master toggle to provision your two scoped keys — a read-only key (for utm-list and status) and a read-write key (also required for utm-generate and utm-delete). You can copy or regenerate the keys at any time from the panel.
Yes. Every request is served over HTTPS only and must carry a valid API key. The two keys are scoped (read-only vs. read-write) and stored encrypted at rest using libsodium, with the encryption key derived from your wp-config salts and never written to the database. The layer also applies per-operation rate limiting, per-site IP throttling, a same-site domain guard, and a storage cap. The endpoints are server-to-server only (browser CORS is suppressed).
Complete documentation — endpoint reference, request/response formats, authentication, rate limits, and examples — is available here: inPIPE UTM API Documentation
sodium_memzero) is memory hygiene, not part of the encrypt/decrypt result; a failure there is now caught and no longer breaks encryption or decryptionInPipe_Encryption::safe_memzero() — wraps sodium_memzero() and falls back to overwriting the key variable when the polyfill cannot securely wipe memory, so encrypt()/decrypt() succeed regardless of the libsodium implementationinPipeAdmin.css) that only did @import './inPipeMain.css';. WordPress applied the cache-busting version to the stub, but the imported inPipeMain.css — which actually contains the styles — was requested with no version query, so browsers and CDNs kept serving the old cached bundle after the upgradeinPipeMain.css directly, so the inpipe_assets_version cache-buster applies to the file that holds the CSSenqueue_admin_assets() in class-inpipe-vue-admin.php now registers dist/css/inPipeMain.css instead of the dist/css/inPipeAdmin.css redirect stub, keyed to inpipe_assets_versiondata_access_key column to the wp_inpipe_pluginsettings table to store the read-only data key issued to premium Harvest Lite trial siteshandleEdit() in inPipeUTMCoderComponent.vue now awaits fetchUtmOptions() before populating the formnocache_headers() to the inpipe-utm-options-fetch REST handler — the GET endpoint previously sent no cache directives, so on servers without a FastCGI/CDN bypass rule the options list could be served stalesave_utm_url() in class-inpipe-utm-decoder.php now blanks unused utm_customN_* column pairs on update — $wpdb->update() only touched the columns it was handed, so a reduced/removed custom param previously left stale pairs that the fetch endpoint rebuilt into the edit formset_custom_params() in class-inpipe-external-record-store.php and its call in the write adapter) — the fix at the save layer covers every write pathtests/unit/UTMCoderComponent.test.ts)created_by / updated_by fields — collapsed to "user" or "API" so internal WordPress user IDs are never exposed to third-party integrationscreated_by / updated_by columns on the inpipe_utm_codes table; existing sites migrate automatically on upgrade with no data loss/wp-json/inpipe/v1/ext/: utm-generate (create/update), utm-list, utm-delete, and statusInPipe_Encryption), with the encryption key derived from the wp-config auth salts (never written to the database); only a masked display string is shown after first revealRetry-After headerbase_url must resolve to this site's own host before a write is acceptedcontent and term fields now accept spaces; apostrophes are normalized rather than rejected/wp-json/inpipe/v1/visitor-ip endpoint resolves the visitor IP from server headers (Cloudflare / X-Forwarded-For / X-Real-IP / REMOTE_ADDR)inPipeConfig.visitorIp from wp_localize_script is staleinpipe_anonymize_ip setting via wp_privacy_anonymize_ip()update parameter on premium install API endpoint allows re-installation when already activeunified-premium package type for updates vs plugin for first-time upgradesInPipe_Premium_Updater (premium class) for full plugin replacementgorilla_food visitor cookie now uses a sliding 400-day expiry instead of a fixed expiry from first visit/wp-json/inpipe/v1/gorilla-food REST endpointinpipe_get_gorilla_food() — function returning the current visitor UID (or null)inpipe_gorilla_food — filter for overriding/extending the UID before it reaches consumersinpipe_user_identified — action fired on init (priority 5) when a UID is present, primary integration point for consumer pluginssessionStorage synchronously before navigation, so the destination page can emit utm_decoded / inPIPE_utm_decoded reliably (previously beforeunload fetches were cancelled by the browser on hard navigations)502/503/504 responses caused by PHP-FPM overload or brief restartsinpipe_maybe_upgrade_db() bails early when inpipe_db_version already matches, avoiding a DB query on every requestsubscription_creation extracted from current_subscription_start (fixes "Activated On: Unknown" in subscription panel)subscription_name extracted from plan_brand_name (e.g., "Cerise")events_allowance seeded into usage data immediately on upgrade (no longer waits for first webhook)harvest and entry, removed businessinpipe_get_premium_version() now prefers INPIPE_PREMIUM_VERSION constant (set at load time) over database option for accuracypremiumVersion now exposed to Vue admin settings for dashboard displayvoid instead of WP_Error — callers can now properly detect and handle failuresinpipe_premium_version in the database — fixes version staying at default 1.0.0 or 2.0.0get_subscription_data() now exposes additional fields to the Vue admin dashboardplanBrandName and billingPeriod merged from inpipe_subscription option (set by Seresa webhook)outpipesLimit, outpipesAddonCount, outpipesAddonLimit, outpipesAddonAvailable from inpipe_outpipe_data optionoutpipesActive — live count of active outPIPEs via InPipe_Premium_Connections_Manager (premium only)429 responses with a clear "too many attempts" message instead of falling through to a generic errorincludes/core/api/external/ — UTM API Access layer (24 files): external endpoints (class-inpipe-api-endpoints-external.php), admin controller, settings, request logger, plus adapter/, storage/, ratelimit/, handlers/, validation/, and flow/ subsystemsincludes/core/class-inpipe-encryption.php — libsodium encryption util promoted to core (from premium) for API-key storage at restsrc/shared/ExternalApiPanel.vue — "UTM API Access" settings panelincludes/free/premium-upgrade/class-inpipe-premium-update-checker.php — Premium update checker with jitter-based caching/inpipe/v1/ext/* external routes plus admin routes (/inpipe-ext-settings, /inpipe-ext-regenerate-key) gated by manage_options + noncegenerate_unique_code() public wrapper on InPipe_UTM_Decoder so the external write adapter can mint collision-checked short codes without a browserinpipe_setting_updated-driven external config refresh and ExternalApiPanel.vue injection via the new settings after-header slotsrc/utils/inPipeApiEndpoints.jshandle_visitor_ip() and registered the /visitor-ip route in InPipe_API_Endpoints_Freeinpipe_utm_decoded_{key}) in the UTM decode handler and a cache short-circuit in validate_public_utm_request()case 429 handling to InPipe_Subscription_Manager verification response mappinginpipe_setting_updated action hook (fired after a setting is saved) in InPipe_Settings_Managerafter-header slot to inPipeSettingsComponent.vue for premium content injectionfetchWithRetry() and synchronous sessionStorage writes in inPipeUtmDecoder.jshandleRenameOption() and per-field space/apostrophe handling in inPipeUTMCoderComponent.vueisEditingPath state and confirmPathEdit() to inPipeUTMCoderComponent.vue so a locked landing-page path can be re-opened for editing (click-to-unlock); .landing-path-input cursor reflects clickable/editable states$is_update property and parameter to InPipe_Package_Installer::install_premium_package()update parameter handling in handle_premium_install() API endpointadd_row_meta() and modify_plugin_description() methods to InPipe_PluginInPipe_Premium_Update_Checker in plugin bootstrap (only when premium is active)InPipe_Premium_Update_Checker::cleanup() to uninstall routineinstall_premium_package() to return true on success, WP_Error on failure (was void)sync_premium_version() to InPipe_Package_Installer — queries update-check API post-install to set correct premium versionInPipe_Gorilla_Food_Manager::renew_cookie() — re-emits existing cookie with fresh expiry; validates input, no-ops for bots / sent headers / missing or invalid cookieInPipe_Gorilla_Food_Integration::renew_cookie() static facade — lazily instantiates manager when called from REST contextInPipe_Gorilla_Food_Integration::broadcast_user_identified() — fires inpipe_user_identified action on init priority 5 when a UID is presentinpipe_get_gorilla_food() function with inpipe_gorilla_food filter in inpipe-gorilla-food-functions.phphandle_gorilla_food() REST handler to call renew_cookie() for returning visitors (rolling renewal)httponly inline comment in InPipe_Gorilla_Food_Manager::set_cookie() — JS reads value via REST endpoint, not the cookie