| 开发者 |
ethereumicoio
freemius |
|---|---|
| 更新时间 | 2026年11月7日 18:52 |
| 捐献地址: | 去捐款 |
| PHP版本: | 8.1 及以上 |
| WordPress版本: | 7.1 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
It can be a valuable addition to your NFT selling store with the NFT WordPress Plugin Kit!
Yes. Since 4.0.0 the plugin shows the download list on Easy Digital Downloads' own download pages as well as on WooCommerce product pages, and the Professional previews (thumbnails, archive contents, audio/video/document samples) work on both. What changed is the activation rule: the plugin no longer declares a hard WooCommerce dependency and no longer refuses to activate without it, because the platform is now picked at runtime — WooCommerce when it is active, Easy Digital Downloads when it is the one that is active.
Please don't: the plugin works with one shop platform per site. On a site where both are active it uses WooCommerce and leaves Easy Digital Downloads alone, which means EDD downloads get no file list, no previews, no per-product settings and no release schedule. The plugin does not break anything in that state — it prints one admin notice naming the platform it is using and what the other one loses, so the situation is visible instead of silent. Deactivate the platform you are not selling with.
The plugin activates, does nothing on the front end, and prints one admin notice in the dashboard naming the platforms it can work with and linking to the plugins screen. The settings and diagnostics screens keep working, so the notice is not the only place to read the state: wp udp status says Platform: none.
Because that is how Easy Digital Downloads stores files. A download with variable prices has files attached to a price option, and a file whose condition is all belongs to every option — so EDD itself considers it part of each price, and the plugin prints it under each one, exactly as EDD would hand it out. WooCommerce variable products behave the same way: one list per variation.
Yes. On Easy Digital Downloads a file has no id of its own, so a per-file setting is attached to the file's condition plus the file itself, never to its row number. Adding, removing or reordering files in the EDD download keeps every setting with the file it was made for.
[ultimate-downloadable-list] prints the download list of the product being displayed. The Downloads tab renders the same list, so the tab and the shortcode never disagree.
Yes, in the PRO version: each downloadable variation is listed under its own name.
Yes, both. The block needs no shortcode at all in a single-product template and is the expected way in the site editor; the shortcode still works inside a block template, and outside the loop with product_id. Both render the same list.
Yes: GET /wp-json/wc/v3/products/{id}/downloads returns the five public fields of each file. See the REST section above — a scheduled file comes back without its download_url, exactly as it would be hidden on the product page.
In the PRO version every preview opened and every sample played is counted per product. WooCommerce → Download analytics lists them with the last 30 days per product, wp udp stats (with the product id) prints one product's counters, and wp udp status prints one summary line. The counts are a plain product meta row, so they survive an update of the plugin, and a preview being opened is never a download: the counters say what was looked at, not what was bought.
Yes, for the shop's own download link. Until the unlock instant WooCommerce's download URL answers 403 with a page that says when the file opens and links back to My Account, and the My Account list shows "Available in N days" as text instead of a link. A refused attempt costs the customer nothing: it does not consume a download, does not appear in the download log, does not change the remaining count, and a media or range request (Range: bytes=...) is refused the same way instead of being served in slices. What the plugin controls is the link WooCommerce hands out — the file itself is the next question.
Not through the shop; and on a protected server, not by copying the file URL either. The plugin writes a rule that blocks direct requests to wp-content/uploads/woocommerce_uploads/, checks once a day that the rule really works, and shows the result on its settings screen. On servers that ignore .htaccess (nginx, most CDNs) the plugin cannot write the rule: it shows you the exact snippet to paste and keeps a warning in your dashboard until the check passes. Use "Force downloads" rather than "Redirect only" — the redirect method hands the file URL to the browser by design, so no rule can protect it. This is not encryption: a file that was already downloaded stays downloaded.
The unlock email is a WP-Cron event scheduled for the unlock instant, and WP-Cron runs when somebody visits the site. If DISABLE_WP_CRON is set in wp-config.php and no system cron calls wp-cron.php, the event stays pending in the cron option — it is late, never lost, and it goes out with the next cron run whenever that happens. So that a waiting customer is not made to wait for a cron run, the same check also runs on the My Account downloads page: the mail leaves the first time the customer looks there, at most once an hour per site. Two switches have to be on: "Email the customer when a download unlocks" in the plugin settings, and the "Download ready" email in WooCommerce → Settings → Emails. Turn either off and the schedule still works, silently.
Only for the subscription-aware lock, which is a Professional feature. Without WooCommerce Subscriptions the plugin never looks at subscriptions and a schedule counts from the order. With it, a file stays locked while the subscription is on hold, cancelled or expired, and a renewal does not restart the schedule: the delay counts from the subscription's start, not from the last payment. Verified against WooCommerce Subscriptions 7.6.0.
The GD PHP module is required to generate them. The settings screen ends with a Server capabilities report, and wp udp status prints the same matrix from WP-CLI — both are the first thing to check.
Audio samples need both the ffmpeg and the ffprobe commands, and video samples need them too; without both, audio and video downloads keep the file type icon, the file size and the file count. Document page images need poppler-utils (the pdftoppm command) or the Imagick PHP extension built with its PDF delegate; when only pdftotext is available the download shows a text excerpt instead of an image. Documents are PDF only — DOCX, ODT and other office formats keep the file type icon row, because rendering them would need a separate office suite on the server.
The samples are also bounded on purpose: the file must be stored under wp-content (a remote download is never sampled), and a source shorter than the sample length plus ten seconds is never sampled, because the sample would be the product. Generation runs in the background, so a freshly saved product may show icons until WP-Cron catches up; wp udp previews media generates the samples from WP-CLI, and the product panel's readiness line says how many are still pending. The settings screen and wp udp status report which of these tools this server actually has.
PHP 8.1 or newer, WordPress 6.0 or newer, and either WooCommerce 7.0 or newer or Easy Digital Downloads 3.7.2 or newer (the version this release was tested against; 3.6 and earlier are not verified). Thumbnails need the GD module, the RAR and ISO formats need the matching PHP modules (see below). Audio, video and document previews need extra command line tools — see the preview question above.
Because the link is not the only way to a file. WooCommerce keeps downloads in wp-content/uploads/woocommerce_uploads/, which your web server serves without PHP — no plugin hook is in that path, so a copied URL would work no matter what the schedule says. On an Apache-compatible server (Apache, LiteSpeed) the plugin therefore adds its own marked block to the .htaccess in that folder, adds an index.php there when the folder has none, and on uninstall removes exactly its own block. Lines it did not write are never touched: a php_value directive or a hotlink rule your host put there survives verbatim. Files stored on a remote host or a CDN are not in that folder and are not covered.
nginx ignores .htaccess, and the plugin does not write server configuration it does not own. The settings screen shows the exact snippet for nginx — location ^~ /wp-content/uploads/woocommerce_uploads/ { deny all; }, or internal; when you use X-Sendfile / X-Accel-Redirect — plus the Caddy and the IIS web.config versions, and it keeps a warning in your dashboard until the check passes. That warning is printed by Ultimate Downloadable Products for WooCommerce itself, because it is this plugin's own daily check that produced it — it is not a WordPress or WooCommerce notice. After saving the snippet, reload the web server and press "Check again".
Because the plugin believes a measurement, not the file it wrote. Once a day — and every time you press "Check again" — it puts a small temporary .txt file into the downloads folder and requests it over HTTP. 403 or 404 means protected; a 200 or a redirect means a browser can still fetch the file; a timeout, a 401 or a server error means it could not verify, and "could not verify" is never shown as protected. So if the warning survives, one of three things is true: the web server was not reloaded, it is not reading that file, or the site cannot reach itself over HTTP. The same state is written to the WooCommerce log and printed by wp udp status.
Partly, and the plugin says so where it matters. The rule protects the origin folder. A copy a CDN has already cached keeps being served from the CDN's own URL until that cache is purged — the rule cannot purge it. A file stored on a remote host (a CDN URL in the product's download row) was never in the uploads folder, so no rule on your server applies to it at all; the settings screen names such a file when your shop has one.
Follow recommendations from this guide please. Contact the PRO version support for help.
Available in 5 days / Available from 12 March — because EDD prints those links itself and offers no way to replace them. A click still explains itself: the file is refused with a 403 naming the exact date, and the refusal does not use up the buyer's download countwp udp schedule unlock <order> <product> <file> <date>) works on both platforms, so support can open or hold one file of one order without touching the product schedulewp udp schedule (which called a WooCommerce function to load the order) is gone tooedd_after_download_content hook and through the shortcodecondition is all appears under every option, because that is EDD's own rulecondition plus the file, not to its row number, so your existing per-file settings are untouched and a reordered file keeps its settingsRequires Plugins: woocommerce. A runtime check now picks the platform after all plugins have loaded (WooCommerce first, Easy Digital Downloads when WooCommerce is absent), and with neither active the plugin activates, does nothing on the front end and prints one admin notice naming what to install — the settings and diagnostics screens stay usablewp udp status prints the selected platform as a Platform: line, so support can see which one a site is running without guessingudp_platform_notice_dismissed, udp_protection_dismissed), so a site that deletes the plugin keeps no residueDownloadable files (UDP) block (ultimate-downloadable-products/downloadable-list) for block themes and the site editor — it renders the download list of the product being viewed, with the same markup as the shortcode, so a single-product template needs no shortcode. It is in both the Free and the PRO build[ultimate-downloadable-list] takes attributes — product_id, show_size, columns, types and layout. columns="3" is a real CSS grid built from a custom property rather than a table, types="audio,video" filters before the summary counts, and the attribute-less shortcode prints byte-for-byte what it printed in 3.2.1GET /wp-json/wc/v3/products/{id}/downloads for headless storefronts — id, name, type, mime and size per file, and nothing that is not already public. It withholds two things: download_url is null, with locked: true, until a release schedule unlocks the file, and unlock_at is published to the shop owner only. The route reads no order, no user and no download key, and answers 404 for a product that does not exist or is not downloadableDownload analytics screen under WooCommerce (capability manage_woocommerce), in wp udp stats (with the product id) and as one line of wp udp status. The Free build has no counter, no route and no screendocs/work/rest-downloads.mdDownloads preview block fits the product form a marketplace vendor edits - the per-file columns no longer push the grid past the panel border, file names wrap at their spaces instead of breaking mid-word, and the block is capped at a readable width so a wide form does not stretch the labels away from their fieldsSettings -> Appearance -> Vendor Product Editor), which is the form that carries the downloadable files; Dokan's new React editor does not render a file list at all, so there is nothing there for a per-file setting to sit onDownloads preview fields in the front-end product form and can set them for their own product: thumbnail width, blur and blur strength, the media preview, the Downloads tab, and a column per downloadwp udp status output and the log name the marketplace a save came fromDownloads block on the productwp udp schedule unlock|statuswp udp status prints the protection state, and the product panel warns the merchant when a file unlocks after its downloads expireMedia preview choice and a per file Preview column in the Downloads preview panel, with a Samples ready line for the samples still being generatedwp udp status tell you whether this server can make the samples, and wp udp previews media generates them from WP-CLIffmpeg and ffprobe (audio and video) or poppler / Imagick with the PDF delegate (documents); without them every download keeps its icon, size and countDownloads tab can be shown or hidden per productDownloads preview tab with all of the abovewp udp previews regenerate fills the previews of an existing cataloguewp udp status prints the plugin version, the settings and the server capabilities