If you manage dozens of feeds, run a headless or staging site, or need feed refreshes to fire from a server-level cron job instead of a page visit, clicking through the admin screen for every feed gets slow fast. Product Feed Pro includes a full set of WP-CLI commands so you can list, create, update, and refresh feeds straight from the terminal. That means you can script feed management, wire it into a deployment pipeline, or trigger a refresh from a system cron job without touching the WordPress dashboard.
Prerequisites
| Requirement | Details |
|---|---|
| Product Feed Pro version | 13.5.4 or later |
| WP-CLI | Installed and working on your server. Product Feed Pro’s commands register with your existing WP-CLI install. They don’t install it for you |
| Plugin status | Product Feed Pro active on the site. No Elite license or paid plan is required; these commands are part of the free/Pro tier |
| Access | Shell or SSH access to the server, or a hosting panel that provides a WP-CLI terminal |
Command reference
Every command sits under the adt-feed namespace. Run wp adt-feed <command> for feed management, wp adt-feed channel list to see available channels, and wp adt-feed format list to see supported file formats.
List feeds
Shows the feeds already on your site. Use it to check status, find a feed’s ID, or export the full list.
| Flag | Default | Notes |
|---|---|---|
--status=<status> | any | publish, draft, or any |
--channel=<channel> | none | Filter by channel name or hash, case-insensitive |
--per-page=<n> | 100 | Maximum feeds to return |
--page=<n> | 1 | Page number for pagination |
--format=<format> | table | table, csv, json, yaml, ids, or count |
--fields=<fields> | id,title,post_status,status,channel,file_format,products_count,last_updated | Comma-separated list of columns to display |
wp adt-feed list
wp adt-feed list --status=publish --format=json
wp adt-feed list --channel="Google Shopping"
wp adt-feed list --format=ids
The last example prints just the numeric feed IDs, which is handy when you want to pipe them into another command, like refreshing every published feed in one line.
Get a feed’s details
Shows one feed’s full configuration, including its attribute mappings, filters, and rules.
wp adt-feed get 4945
wp adt-feed get 4945 --format=yaml
Replace 4945 with the feed’s numeric ID, or its legacy project hash if you don’t know the ID. --format accepts json (default), yaml, or table. In table format, nested data like mappings and rules is flattened to a JSON string in each row so it stays readable in a terminal.
Create a feed
Creates a new feed. At minimum, you need a title, channel, country, and file format.
A feed created with flags alone has no attribute mapping. The admin UI fills in the channel’s required attributes when you create a feed there. The CLI does not. A feed created from flags still reports ready after it generates, and its product count is non-zero, but the file it writes contains no products at all. Nothing warns you. Verified on Product Feed Pro 13.5.7: a bare-flags feed finished with status ready and a product count of 18, while the generated XML held only the channel header and zero item nodes.
To create a usable feed, pass the full configuration in --from-file. The quickest way to build that JSON is to configure one feed in the admin UI, run wp adt-feed get <id> --format=json, then edit the result. Note that channel definitions store a {{CURRENCY}} suffix on price attributes, and only the admin field-mapping screen replaces that placeholder with your store currency. If you hand-write the JSON, substitute the currency code yourself or the feed emits the literal {{CURRENCY}} text.
| Flag | Notes |
|---|---|
--title=<title> | Feed title |
--channel=<channel> | Channel name or hash. Run wp adt-feed channel list to see valid values. Passing --country restricts name matching to the generic channels, because the channel list is keyed by full country name while create takes a two-letter code, and supplying a country also skips the all-countries fallback scan. Leave --country off and name matching scans every country. A channel hash always resolves, whatever you pass, so if create reports “Unknown channel” for a channel you can see in the list, pass the hash instead. |
--country=<country> | Two-letter country code, for example AU or US |
--file-format=<format> | One of the formats from wp adt-feed format list |
--refresh-interval=<interval> | hourly, twicedaily, or daily. Omit the flag to leave the feed unscheduled. The value is not validated. Any other string is stored as-is: passing empty stores the literal word and, once the feed is published, registers a one-off action dated 1970-01-01 instead of a recurring refresh, so the feed never refreshes on a schedule. |
--post-status=<status> | draft (default) or publish |
--from-file=<path> | Path to a JSON file with feed properties. Any flags you also pass override the matching value in the file |
--porcelain | Print only the new feed’s ID, useful for scripting |
wp adt-feed create --title="My Feed" --channel="Google Shopping" --country=AU --file-format=xml
wp adt-feed create --from-file=./feed.json --post-status=publish
If you don’t specify a refresh interval, the feed won’t refresh automatically until you set one. Setting --post-status=publish also registers the feed’s refresh schedule immediately, the same as clicking Activate in the admin UI.
For detailed instructions on excluding or including products by condition, see How to create filters for your product feed. For detailed instructions on modifying attribute values before they reach the feed, see How to create rules.
Update a feed
Changes one or more properties on an existing feed. Accepts the same property flags as create, plus --from-file.
wp adt-feed update 4945 --title="Renamed feed"
wp adt-feed update 4945 --refresh-interval=hourly
wp adt-feed update 4945 --from-file=./partial.json
You need to pass at least one flag or --from-file, otherwise the command exits with an error. If you change --refresh-interval or --post-status, Product Feed Pro re-registers or cancels the refresh schedule automatically to match.
Delete feeds
Permanently removes one or more feeds.
wp adt-feed delete 4945
wp adt-feed delete 4945 4955 --yes
You can pass multiple IDs at once. By default WP-CLI asks Delete 1 feed(s)? [y/n] before deleting. Add --yes to skip the prompt, which is useful in scripts.
Duplicate a feed
Clones an existing feed, including its channel, mappings, filters, and rules. The new copy is created as a draft, but it inherits the source feed’s refresh interval and its schedule is registered straight away. Run wp adt-feed deactivate <new-id> if you do not want the copy refreshing yet.
wp adt-feed duplicate 4945
The copy is named Copy of <original title>. Add --porcelain to print only the new feed’s ID instead of a confirmation message.
Refresh feeds
Regenerates one or more feeds. This is the CLI equivalent of clicking Refresh on the Manage Feeds screen.
wp adt-feed refresh 4945
wp adt-feed refresh 4945 4955 --async
refresh does not build the feed in your terminal. It starts a run and queues the first batch on Action Scheduler, then returns. Adding --async queues the whole run instead, so the feed does not start until an Action Scheduler worker picks it up. Either way the work happens on the Action Scheduler queue, so that queue has to run for the feed to finish. In a server cron job, follow the refresh with wp action-scheduler run to drain the queue in the same session. The feeds generate in the background.
Cancel a feed generation
Stops a feed that’s currently generating.
wp adt-feed cancel 4945
Use this if a refresh is stuck or you started a generation by mistake. The feed’s status changes to stopped right away and the pending batches are unscheduled. The product recount is queued on Action Scheduler, so the numbers update once the queue runs, not the moment the command returns. cancel does not remove a refresh you queued with refresh --async if it has not started yet.
Activate and deactivate feeds
Publishes or drafts one or more feeds, which also turns their refresh schedule on or off.
wp adt-feed activate 4945 4955
wp adt-feed deactivate 4945
activate sets the feed to publish and registers its refresh schedule. deactivate sets it to draft and cancels the schedule, so the feed stops refreshing until you activate it again.
Update feed stats
Recounts the products in a feed’s generated file without regenerating it.
wp adt-feed update-stats 4945
This is useful if the stats shown in the admin UI look out of sync with the actual file, for example after a manual file edit or a server issue during generation.
List channels
Shows the channels Product Feed Pro supports, with each one’s name, hash, taxonomy, and type. Use --fields= to pick other columns. The available columns are name, channel_hash, fields, taxonomy, type, and utm_source.
wp adt-feed channel list
wp adt-feed channel list --country=Australia
wp adt-feed channel list --format=json --fields=name,channel_hash
Leaving --country out shows the generic channels only, which are Custom Feed plus the channels available in all countries. Adding --country appends the channels specific to that country. Use the full country name here, not a two-letter code: --country=Australia, not --country=AU. The two-letter code is correct on create and update, where it is stored on the feed.
List supported file formats
Shows every file format you can pass to --file-format when creating or updating a feed.
wp adt-feed format list
When to use the CLI instead of the admin UI
Server-level cron jobs. If your host throttles WordPress’s built-in scheduler, you can trigger wp adt-feed refresh directly from a system cron job instead. For a full setup guide, see How to refresh product feeds using cron jobs.
Large catalogs. Refreshing several large feeds through the admin UI means keeping a browser tab open and waiting. wp adt-feed refresh hands the work to Action Scheduler and returns your terminal immediately.
Headless or staging sites. If you’re managing a site without regular admin access, or scripting a staging environment build, the CLI lets you create and configure feeds without opening a browser at all.
Bulk or repeatable setup. Combining --from-file with a saved JSON template lets you recreate the same feed configuration across multiple sites or environments consistently.
For a one-off feed, occasional edits, or if you’re not comfortable with a terminal, the admin UI is still the simpler choice.
Troubleshooting
wp adt-feed list --format=ids to get a confirmed list of valid IDs.--channel value has to match a channel name or hash exactly, and matching is case-insensitive but not fuzzy. Run wp adt-feed channel list first to copy the exact name or hash you need.create needs title, channel_hash (resolved from --channel), country, and file-format at minimum. With --from-file, the file is read first and then any flags you pass are applied on top, so a flag can supply a key the file omits. If the error persists, the value is missing from both the file and the flags.wp adt-feed get <id> and read the status field. If the status is error, open WooCommerce > Status > Logs and read the entries with source Product Feed Pro by AdTribes.io. If the status stays processing and the file does not grow, the Action Scheduler queue is not running, so drain it with wp action-scheduler run. The terminal never reports the outcome of a refresh, only that one started, so give it a few moments and check the status again.FAQ
wp isn’t set up on your server, install it first.wp adt-feed refresh <id> --async for whichever feeds you want to control outside the plugin’s own hourly, twice-daily, or daily options. See How to refresh product feeds using cron jobs for the full setup.Need more help?
If you’re on a premium plan and run into trouble with the CLI commands, open a support ticket, and our team will help you troubleshoot.
If you’re using the free version of Product Feed Pro, post your question on the WordPress.org support forum, and our team will get back to you there.

