| 开发者 | zain111 |
|---|---|
| 更新时间 | 2026年8月22日 23:12 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 7.0 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
[addoshvi_feed], a native Elementor widget, and a native Gutenberg block/wp-content/plugins/addonn-shoppable-video, or install directly through the WordPress Plugins screen.[addoshvi_feed layout="carousel"]Yes, WooCommerce must be installed and active.
No — the Elementor widget only registers if Elementor is active. The shortcode and Gutenberg block work without it.
No. This is fully self-hosted — videos are stored in your own WordPress Media Library.
Yes — this is built specifically to support combo/bundle-style selling.
Yes — every visual element the plugin renders (cards, arrows, dots, play/shop buttons, modal) carries its own styling independent of the active theme, so it looks the same on Astra, Storefront, OceanWP, WoodMart, and other popular themes.
Yes — turn on WhatsApp Share-to-Buy (globally in Settings, or per-video) and an "Order on WhatsApp" button appears next to Add to Cart, prefilled with the product name, price, and page link.
$video loop variable used inside templates/carousel.php, templates/inline.php, and templates/video-card.php wasn't prefixed — WordPress's naming convention flags any variable defined in the global/template scope the same way it flags functions and constants. Renamed to $addoshvi_video.svp_video) and the shortcode tag (svp_feed) still weren't prefixed with 4+ characters, since WordPress.org requires this even for CPT/shortcode identifiers (they're stored in a shared registry that other plugins could collide with). These are now addoshvi_video and addoshvi_feed. The Elementor widget name and the Gutenberg block name were renamed the same way for consistency (addoshvi_shoppable_video, addoshvi/feed).[svp_feed] shortcodes, svp_video posts, and Elementor/Gutenberg blocks using the old names will need to be updated after upgrading. Not an issue for this WordPress.org listing (no installs yet), but worth knowing before deploying this version over an existing install elsewhere.<style> block (responsive column counts) to being set via JS instead so all CSS is properly enqueued, and renamed every internal-only PHP/JS identifier (functions, classes, constants, meta keys, option keys, nonces, AJAX actions, script/style handles) from the too-short svp_ prefix (3 characters) to addoshvi_ (WordPress.org requires 4+). The [svp_feed] shortcode tag, the svp_video post type, and the svp_shoppable_video Elementor widget name are unchanged so pages already built with this plugin keep working. A one-time migration copies any already-saved settings and per-video view/add-to-cart counts to the new keys.Plugin URI and Author URI were both set to the same address. Removed Plugin URI (optional, and AddOnn doesn't have a page dedicated to this specific plugin yet) and kept Author URI pointing to https://addonn.in/.slow_db_query_meta_query on the 3 lookups that match a video to its Elementor source item/page) are a known, unavoidable trade-off — WordPress has no core API to look up a post by a custom meta value other than meta_query, and each lookup is scoped to this plugin's own svp_video post type, not an unbounded table. Documented with a phpcs:ignore + rationale on each.IntersectionObserver was watching cards before the infinite-loop carousel's clone padding had settled into its final scroll position, so the settle jump plus normal above-the-fold layout shift (banner images, price badges finishing load) repeatedly toggled cards in and out of "intersecting" — each toggle called play()/pause() again before the video had buffered its first frame, restarting playback from the beginning each time. The clone padding now settles into position before the observer starts watching, and rapid intersection flips within ~150ms are now debounced to the last state instead of each being acted on.scroll-behavior: smooth on .svp-carousel-track !important, which beat the JS's inline override and made that reset jump animate — visible as the carousel appearing to reverse and scroll backward to slide 1, on both arrow-click and swipe/touch. scroll-behavior on the track is no longer !important; every other property on it still is.!important to .svp-modal-overlay's display: flex, but the product modal and the front-end "Add Video" editor modal are both opened/closed by toggling that same element's inline display style (jQuery fadeIn()/fadeOut()) -- a stylesheet !important beats a non-!important inline style, so both modals ignored fadeOut() and rendered open on every page load instead of staying hidden until a video/trigger was clicked. display on .svp-modal-overlay is no longer !important; every other property on it (position, background, z-index, alignment) still is.!important, so the plugin's own look no longer depends on which theme or page builder is active. The feed heading/subheading text is intentionally left alone so it continues to inherit the site's own heading typography by default (use the Heading/Subheading Style controls in Elementor to customize it) — everything else is now the plugin's own, by default, on any theme.position: relative and a min-height: 42px on every <button> element site-wide, which was quietly overriding this plugin's position: absolute on the play button, hotspot button, and carousel arrows — knocking them out of their floating position and adding up to 42px of stray empty space under each video and inside the carousel viewport. Pagination dots were also rendering oversized (up to 42px instead of 8px) for the same reason. All affected elements now force position and min-height the same way color/border-radius already were.<button> elements globally with higher CSS specificity than the plugin's own rules — most visible as flat blue squares instead of white circular arrows. Same underlying cause as the 1.3.9 hotspot-button fix, now applied to the carousel arrows and dots too.element.scrollLeft = 0 assignment also honors the CSS scroll-behavior: smooth on the carousel track (this is a common misconception; only scrollTo()/scrollBy() calls with an explicit behavior option are guaranteed to override it). The jump back to card 1 now temporarily forces scroll-behavior: auto via an inline style right before the jump (and restores it a frame later), which is the only way to force a truly instant scroll regardless of CSS. Verified with an instrumented before/after test measuring actual scroll position frame-by-frame, not just visually.scrollTo({behavior:'auto'}) defers to the carousel track's CSS scroll-behavior: smooth, so the jump back to card 1 was still animating through every card in between. Now uses a direct scrollLeft assignment, which is always instant regardless of CSS, so the loop actually cuts straight to card 1 as intended.[svp_feed] shortcode's ids filter no longer silently ignores an explicit "match nothing" value due to a PHP empty-string quirk.display: inline-flex !important, added back in 1.0.5 for cross-theme consistency) silently overriding the show/hide logic. Both buttons now hide correctly, and the WhatsApp link is cleared whenever it's hidden so it can never carry over stale product info.[svp_feed] shortcode is for, since that's a wp-admin-driven workflow to begin with. Widgets already saved with the old dropdown's selection keep working exactly as before — nothing changes for pages that were already using it.heading / subheading attributes), the Elementor widget (Content tab fields + a new Style tab "Heading" section for color, font size, and alignment), and the Gutenberg block. Leaves everything unchanged if left blank.scroll events on document, but scroll events don't bubble, so it silently never fired. Dot clicks still scrolled the carousel correctly; only the visual "active dot" indicator was stuck. Now bound directly on each carousel's track.dots), Elementor widget control, and Gutenberg block toggle.autoplay_speed, ms between slides), "Continue Scrolling" loop (jumps back to the first video instead of stopping at the end), and pause-on-hover. Available in the shortcode, Elementor widget, and Gutenberg block.frontend.js.manage_woocommerce capability) can now upload a video, choose an optional cover image, tag one or more products, and set WhatsApp share-to-buy — all from a "+ Add Video" button that appears right in the feed (shortcode, Elementor widget, or Gutenberg block), no wp-admin trip needed. Regular shoppers never see this button. The new video appears in the feed instantly on save, no page reload.!important, consistent with the other button/icon fixes on this theme.columns, columns_tablet, columns_mobile, scroll_by, arrows), Elementor widget controls, and Gutenberg block settings.wp_head has already printed, so the late-enqueued stylesheet never made it onto the page. CSS/JS are now enqueued unconditionally on every frontend load, so they're always present regardless of which context (shortcode, block, Elementor widget, or the Elementor editor canvas) renders the feed.all: unset + explicit !important values) so they're visually identical regardless of theme.