Description
Tired of hunting for products, pasting affiliate links, fixing the ones that quietly stopped working, and earning from ads alone? Make your blog shoppable!
Embedding affiliate links by hand costs you valuable time. Time you should spend writing new posts, researching, and running your business. Instead, looking after your links eats it up: links that lead nowhere to replace, new products to find, prices to check. Most affiliates lose sales because a link went out of date without telling them, or because a plain text link just doesn’t invite a click. So how do you show your products in a way readers actually want to explore?
MyFeeds does that for you. Instead of text links that quietly go out of date inside your posts, your readers see product cards that show the merchant, the brand, the title and the price. The cards refresh every day, so the price your reader sees is the price your merchant is charging.
All you do is copy the product feed link from your affiliate network and paste it into MyFeeds. Once the feed is imported, the Product Picker block lets you search it right inside the block editor, by keyword, with filters when you need them.
You get to stay where the value is. Writing. Instead of pasting URLs at midnight.
Who is this for
Anyone earning a cut when readers click and buy. Whatever you cover, from clothing and gear to books, beauty, supplements, tools, baby, garden, hobbies, niche electronics, or deals: if there’s an affiliate program for it, there’s a product feed somewhere, and MyFeeds can read it.
The block editor stays your block editor. The plugin works in the background.
What changes for you
- Your posts become shoppable. A grid your readers can scan: image, brand, price, discount, shipping, and your link. You compose it in seconds inside the block editor.
- Your prices stop lying. The price your reader sees today is the price on the merchant’s checkout right now.
- Your posts stay current. Discontinued products surface so you can replace them. Stock that comes back lights up again. Nothing changes behind your back.
- You publish faster. Two letters in the editor, the product appears, you click, the card is in. You never leave the post you’re writing.
- Your site stays yours. Products live in your own WordPress database. Visitors don’t wait on a third-party server, and nothing about them is sent off-site when a page loads.
- You never learn a file format. Whatever your network sends, MyFeeds reads it and works out which column is the price, which is the image, which is the link.
How it works
- Paste in the affiliate product feed URL from your network.
- Every product is imported and stored locally in your WordPress database. The plugin figures out the column structure on its own.
- In any post or page, add the MyFeeds Product Picker block. Search by name, brand, or category. Click to insert.
- The published page renders a responsive product card with the current price, image, brand, shipping, and your affiliate link. The card is built from your own database, and your server contacts no external service to render it. The pictures load from the merchant.
The next day the nightly sync refreshes what changed. The week after, a full import catches everything else. You don’t think about it.
What’s in the box
- Universal feed import. Almost any format your program hands you, detected automatically.
- Smart Mapping. Automatic recognition of common feed structures, with a manual editor for anything custom.
- Smart Search inside the block editor with synonym handling and multi-language support.
- Native Gutenberg Product Picker block with live in-editor search.
- Responsive grid of product tiles with prices, brands, shipping, and your affiliate links.
- Background imports. Large feeds process without locking your admin.
- Nightly auto-sync and weekly full re-import, scheduled and quiet.
- The price and the currency come straight from the feed. Nothing is converted behind your back.
- Works with any WordPress theme that supports the block editor.
Good to know
- Everything happens inside WordPress, from the feed URL to the published card. There is nothing to download, upload or update by hand.
- Self-hosted. Your server contacts no external service to render a product; the pictures come from the merchant’s image server.
- If your program publishes a feed file you can download, MyFeeds will almost certainly import it.
Get started
Install MyFeeds, paste one feed URL, and make your next post shoppable.
Related paid plugins
This plugin is fully functional on its own. Separate, independent paid plugins called MyFeeds Starter, MyFeeds Pro and MyFeeds E-commerce are available at myfeeds.site. They add things like a carousel block, a visual card designer with Google Fonts, Amazon products through Amazon’s Creators API, click and conversion analytics, and a full multi-feed shop system. They are not required to use this plugin.
External Services
MyFeeds keeps your products in your own WordPress database. It contacts other servers in two cases: your site fetches the product feed you configured, and it measures the file size of a few product pictures. The pictures themselves are not copied to your site, so your readers’ browsers load them from the merchant. Each case is described below.
Configured product feed URL (your affiliate network)
To import products, your site downloads the feed file from the URL you save in the Feed Manager. The URL points to your affiliate network’s product feed export, in CSV, TSV, XML, or JSON format.
- What is sent: an HTTP GET request to the feed URL. It carries WordPress’s standard
User-Agentheader, which names your WordPress version and your site address. Anything your network put into the feed URL itself (for example a publisher ID or a key) travels with it. No visitor data is sent. - When it is sent: when you add, edit, test or reimport a feed in the WordPress admin, and on the plugin’s schedule (a daily sync and a weekly full import). Showing a product card to a reader never calls the feed URL.
- Where it is sent: to the host in the feed URL you saved. If that address redirects, the plugin follows the redirect. The plugin does not pass the URL on to anyone else.
The feed is provided by your affiliate network, so that network’s terms of service and privacy policy apply to the download.
Product pictures (the merchant’s image server)
A feed lists the web address of every product picture, on the merchant’s own server or image CDN. MyFeeds shows the picture from that address and does not copy it to your site.
- In your readers’ browsers: when a reader opens a post with product cards, their browser requests each picture from the merchant’s image server, as it does for any picture embedded from another website. That server receives what a browser always sends: the reader’s IP address, browser details and, usually, the address of your site. The same happens in your own browser when you search and pick products in the block editor.
- From your server: to keep your pages light, the plugin finds out whether a merchant’s image server can deliver a smaller version of a picture. For this, your server asks for the first byte of a few sample pictures per image host and reads the file size from the reply. These requests carry WordPress’s standard
User-Agentheader and no visitor data. The check starts after you have opened the WordPress admin, runs in the background, and does not ask a host again for at least a month once that host has answered. - Where it is sent: to the hosts named in the picture addresses of your feed.
Which hosts these are depends on the feeds you import, and their terms and privacy policies apply. If your site uses an image optimisation or CDN plugin that rewrites picture addresses, pictures may be loaded through that service instead.
Links on a product card
Every product card links to the affiliate link from your feed. A request to your affiliate network or the merchant happens only when a reader clicks a card. Sample products, if you use them, link to a page on myfeeds.site.
Apart from the above, the plugin sends nothing anywhere: it has no analytics, no tracking and no usage reporting. Links in the plugin’s admin screens (to myfeeds.site, to the review page on WordPress.org, to the checkout of the paid plugins) open only when you click them.
Source Code
The full source for this plugin is open-source. See myfeeds.site for the project homepage and links to the public repository.
- Block editor source:
src/index.js - Build tool: terser via
npm run build(configuration inpackage.json)
To rebuild the editor bundle from source, run npm install && npm run build inside the plugin folder.
Screenshots








Blocks
This plugin provides 1 block.
- MyFeeds u2013 Product Picker
Installation
- Upload the
myfeeds-affiliate-feed-managerfolder to the/wp-content/plugins/directory, or install the plugin directly from the WordPress plugin screen. - Activate the plugin through the Plugins screen in WordPress.
- Go to MyFeeds in your admin sidebar and click Add your first feed.
- Paste a product feed URL from your affiliate network and click Import.
- In the block editor, add the MyFeeds – Product Picker block to any post or page.
- Search for products, select them, and publish.
Where do I get a product feed URL?
Sign up with an affiliate network (such as AWIN, CJ Affiliate, Rakuten, or Impact), navigate to the product feed section (usually labelled “Create a feed” or “Product feeds”), and copy the feed URL.
FAQ
-
How do I upload a merchant product feed to WordPress?
-
Install MyFeeds, open MyFeeds Feeds, and paste the feed URL your affiliate network gave you. MyFeeds downloads the file, works out which column is the title, the price, the image and the affiliate link, and imports every product into your own database. CSV, TSV, XML and JSON all work, compressed or not, and nothing has to be uploaded by hand.
-
How do I add affiliate products to a blog post?
-
Open any post in the block editor and add the MyFeeds – Product Picker block. Search your imported catalogue by name, brand, colour or category, tick the products you want, and they appear as product cards with image, price and a buy button. No copying links, no HTML.
-
How do I keep affiliate prices up to date on my site?
-
MyFeeds re-reads your feed every night and refreshes what is already in your posts, so the price a reader sees is the price the merchant is charging today. A weekly full import catches products that were added or withdrawn. You can also sync any feed by hand at any time.
-
Which affiliate networks provide a product feed?
-
Most of the large ones do: AWIN, Tradedoubler, CJ Affiliate, Impact, Rakuten Advertising, Pepperjam and FlexOffers all offer product feeds, and so do many merchants directly. Some hand you a link, some a file to download. Look in your network’s dashboard for a section called “Product feeds”, “Datafeeds” or “Create a feed”. MyFeeds takes either: paste the link or upload the file.
-
Can I build an affiliate store or shop page with this?
-
This plugin puts product cards inside your posts and pages. A full storefront with its own categories, filters and sorting is a paid feature and not part of this plugin.
-
How long does an import take?
-
It depends on the feed size. A feed with 10,000 products typically takes 2–5 minutes. Imports run in the background via Action Scheduler, so you can keep working while they process.
-
Why are some products missing after import?
-
Only products with valid data (title, price, image, and affiliate link) are imported. Check your feed source for incomplete entries.
-
Does MyFeeds slow down my site?
-
No. All product data is stored locally in your WordPress database. The frontend makes no external API calls, so your site stays fast.
-
Does MyFeeds work with any theme?
-
Yes, it works with any WordPress theme that supports the Gutenberg block editor (WordPress 5.8+).
-
Can I use MyFeeds with the Classic Editor?
-
No. MyFeeds requires the block editor.
-
Which affiliate networks are supported?
-
If your affiliate program hands you a product feed URL you can download, MyFeeds will almost certainly read it. The plugin handles the common feed formats automatically and recognises the field structure that most networks use. For everything custom there’s a manual mapping editor inside the plugin.
-
Does it work with my network’s feed: Awin, CJ, Impact, Tradedoubler, Rakuten?
-
The automatic mapping is written for the feed formats these networks document. The plugin isn’t built around any single network though: it reads the file your program hands you, whatever the network is called. CSV, TSV, XML and JSON all work, compressed or not. If a column is named something the plugin has never seen, the mapping editor lets you point it at the right field yourself.
-
Does the plugin make any external requests?
-
Yes. See External Services below. In short: your site downloads your product feed from the address you saved and measures the file size of a few product pictures. The pictures themselves stay with the merchant, and your readers’ browsers load them from there.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“MyFeeds — Affiliate Product Feed Importer & Shoppable Product Cards” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “MyFeeds — Affiliate Product Feed Importer & Shoppable Product Cards” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.0.48
- Fixed: the mapping editor shows a feed’s fields again. Loading them ended in a PHP error.
- Fixed: a feed in the format Tradedoubler documents for its Products API imported no products, and a Rakuten catalogue file opened as a feed without products.
- Fixed: an XML feed without line breaks between its products lost every second product, and a price with a thousands mark (“1,299.00”) was read wrong.
- Fixed: Ascend’s sale price and the column names of Impact’s catalogue format are read. In an AWIN feed, the link without tracking no longer replaces the link you mapped. The feed dialog no longer chooses AWIN for every feed.
- Improved: JSON feeds of any size are imported. A refused or timed-out download says what happened. After you change a feed’s address or upload a new file, the Feeds screen offers to import it right away.
- Improved: the folders for uploaded feed files and for the copy made during an import are closed to requests from the web. The check that refuses addresses inside your own server also recognises IPv6 notation.
- Improved: the background check of merchants’ image servers keeps one byte instead of a whole picture and no longer waits behind servers that cannot be measured. Grouping the sizes of a product after an update finishes by itself.
- Changed: the “External Services” section of this readme is corrected, and the note about Amazon on the Feeds screen describes the paid plans as they are now.
1.0.47
- Fixed: a product card could show its grey placeholder instead of the picture on sites where an image optimisation or CDN plugin rewrites the addresses of pictures. Some shops turn such services away, and the card then had no picture, although the same picture loads in any browser. A card now goes back to the picture’s own address at the shop, once, when the copy it was given does not load. Sites without such a plugin behave exactly as before, and Jetpack’s image CDN already left product cards alone.
1.0.46
- Fixed: activating the plugin skipped its own setup step. The product table, the default settings and the scheduled syncs only appeared with the first visit to the WordPress admin afterwards, so a site activated from the command line had no product table until then, and the daily housekeeping wrote “feed list unreadable” to the error log every day until the first feed was added. Activation now sets everything up right away, and running it again (deactivate, activate) keeps your feeds and products as they are.
1.0.45
- Improved: the product grid is as wide as your post’s text instead of a fixed 1,200 pixels, so cards line up with your writing in every theme. In the block toolbar you can now set it to Wide or Full width, like other blocks.
- Fixed: on narrow cards a sale price was cut off (“89,9…”) next to the struck-through old price. It now moves to its own line. Wider cards look exactly as before.
1.0.44
- Fixed: products of a feed you deleted came back into your posts. Deleting a feed takes the products your posts show off the page and keeps them in the database, but the clean-up that runs right after the delete marked them to stay visible again, with their last price and a link that may no longer lead anywhere. They now stay hidden, and products this already happened to are hidden again once, on the first page load after the update.
- Fixed: products of a removed feed that no post uses any more are now cleared out of the database instead of staying there forever.
1.0.43
- Improved: prices are written the way their currency is normally written: “£150.00”, “$150.00”, “150,00 €”. A site whose language uses that same currency keeps its own way of writing it. The card and the block editor always show the same price.
- Improved: the Feed Name field says what the name is for. Readers see it on your product cards, so the shop’s name works best.
- Fixed: the product picker no longer says “Free Shipping” when a feed has no shipping data. Only a real shipping cost of 0 counts as free shipping, and a delivery time is no longer shown as a shipping cost.
- Fixed: a product without a price says “Price on request” in the product picker too, the same as on the card.
- Fixed: one selected product reads “Use 1 Product”.
- Fixed: on the Feeds screen the feed dialogs no longer appear twice after a feed is added or removed, and a script error after an import is gone.
1.0.42
- Improved: product card images now come in the size the card is actually shown at. The browser measures the card and picks the smallest file that is still sharp on that screen, instead of one 800 px image for every device. Only for image hosts that can deliver smaller copies; cards set to fill their frame keep the one sharp image.
1.0.41
- Improved: the Analytics preview’s insight cards show every card the dashboard has today, including top earning posts and risers and fallers (example data).
1.0.40
- Improved: the Analytics preview shows the dashboard as it looks now, with unique visitors, earnings per click and the day-by-day comparison with the period before (example data).
1.0.39
- Fixed: undo and redo in the block editor now update a product block’s tiles. Before, the tiles kept showing the old selection, and the next change inside the block could save it back.
1.0.38
- Improved: the storefront picture on the E-commerce page shows the shop as it looks now.
- Improved: the changelog on WordPress.org was being cut off part way through. The recent releases are listed there in full again, and the complete history now ships with the plugin in changelog.txt.
1.0.37
- Fixed: a digit no longer starts a word in search. Looking for “tee” could match a sunglasses model number like 214050TEESPIBOR, and “slim” three eyeglass part numbers — the same kind of false match the whole-word rule exists to prevent. It also made search contradict itself: a long word was matched one way and a short one another.
- Improved: the size a merchant’s image CDN is asked for is now checked against that merchant instead of assumed. One widely documented parameter turned out to be ignored by a large retailer’s image server, and a wrong assumption could never correct itself before.
1.0.36
- Improved: product images are asked for at the size they are shown. Some merchants ship the print master — one feed averaged 2 MB per product image, with individual files past 25 MB — which makes a post crawl and can leave an image stuck on its alt text while the browser waits. MyFeeds now asks the merchant’s image CDN for a copy that fits the card. On a shop page with 72 product images that was 61.4 MB before and 5.8 MB after.
- Improved: for an image host MyFeeds has not seen before, it works out how to ask, once, in the background, and remembers the answer. Nothing is re-imported, no image is copied to your server, and a host that cannot make a smaller copy is left exactly as it was.
- Improved: one product, one card. Sizes of the same product are now grouped in the block picker and in the picker’s detail view, whichever way the feed writes the size — “Size 11.0 W”, “Size: Large”, “- S” or a separate size field. The card says how many sizes a product comes in, and the detail view lists each size and colour with its own link.
- Fixed: the detail view asked for a product’s sizes with an empty id and came back with nothing. The list of sizes stayed empty however the feed was written.
- Fixed: re-importing your feed now marks the products your merchant has withdrawn, instead of leaving them on sale with a link that goes nowhere. They are never deleted — a product already placed in a post turns into the “no longer available” card, so nothing disappears from your posts without warning. If more than half the feed would be marked at once, the import treats that as a truncated download and leaves everything alone.
- Fixed: “Showing whole-word matches only” no longer costs a row of empty space right above the products in the search window. It sits next to the result count.
- Improved: two redundant indexes have left the products table, making imports a little faster and the table a little smaller. Existing installations are cleaned up once, automatically.
1.0.35
- Improved: a search word of three letters or fewer now has to start a word, the way longer words always did. Searching “men” used to return every women’s product because the word sits inside “women”; on a real catalogue that was 58,176 matches where 27,358 were meant.
- Added: a line under the search toolbar says whether you are seeing whole-word matches, and offers the partial ones with one click. Nothing is dropped, so a Sweatshirt is still one click away from “shirt”.
- Fixed: when a search found nothing and the plugin fell back to a looser match, it did not say so. It does now.
- Fixed: a number in a search was silently ignored on MySQL 8 in that fallback, because it used a word-boundary syntax that only the older MySQL understands.
- Fixed: a search word of three letters or fewer also demanded every one of its synonyms. Searching “men” quietly meant “men and man” and found a fraction of what it should. A synonym is an alternative now, the way it always was for longer words.
1.0.34
- Fixed: product titles lost every dash, curly quote and ellipsis, and some accented letters, showing question marks instead. A pattern that strips trademark marks was matching single bytes rather than characters, so it deleted the first byte of those characters and left something that was no longer readable text. Titles now keep them, and a mis-declared encoding is repaired instead of being filled with question marks.
- Fixed: products from feeds that write a size as “Shirt – XL” with a long dash appeared once per size in the block picker. The rule that recognises a size suffix could not match that dash, so the sizes never collapsed into one product.
- Fixed: the mapping editor could sit on “Loading…” forever for a large feed. It pulled the whole file into memory to read a single row; it now streams from disk like the importer does, and unpacks gzip and zip on the way.
1.0.33
- Fixed: adding or re-importing one feed could turn into an update of every feed. The import of a single feed has no background worker to wait for, so ten seconds in it looked stuck, and the recovery step started a full update in its place. It now leaves single-feed imports alone.
1.0.32
- Fixed: on password-protected sites the import restarted itself from the status poll and marked real products unavailable. The fix applies to any site whose own server cannot reach it without a password, and to every feed on it.
1.0.31
- Filtering, sorting and paging inside a search are near-instant. The first search still asks the index once; from then on a filter chip reads from what that search found, instead of searching the whole catalogue again with the filter attached. A brand filter on a 90,000-row catalogue took 7.6 seconds and now takes a few hundredths.
- Every sort order gives one answer: two products that tie on price, discount or date come back in the same order every time.
- “Back to search” and “Add to selection” return you to where you were in the results, not to the top.
- The mapping editor reads XML and JSON feeds. It used to show an empty form for any feed that is not CSV, and no error.
- Feeds are listed alphabetically in the mapping editor.
- Card images are no longer routed through Jetpack’s image CDN. Shopify and other merchant CDNs need the exact address the feed delivered, and the CDN dropped part of it, so some cards showed no image while the editor showed the product.
- A feed without a currency column is priced in the currency of the market it names (a delivery-time column per country, or the country in the shop link). Partnerize feeds priced in pounds showed euros. A default currency set in the mapping editor still wins.
1.0.30
- A search that reports 245 results now shows all 245. Where a feed ships a row per size, a search matches many more rows than it has products – sixteen rows per product in one measured case – and the plugin only ever looked at the first few hundred rows. So a search could report hundreds of results and hand you twenty, with “Load more” unable to reach past them. It now looks far enough to fill the pages it promises, and it is about twice as fast at the same time.
- Product links saved in a post could lose the ampersands out of them, leaving an address that looks fine and leads nowhere: the affiliate id and the merchant id were swallowed into one long parameter. Existing cards repair themselves as they are read, so your links point where they should again.
1.0.29
- In the product detail view, clicking one of the smaller images now shows it in the large frame. They were there to look at and did nothing.
- Choosing a size now selects that size. Picking a colour already switched the product for real – link, price and all – but a size only changed what was highlighted, so adding the product to a post linked to whichever size the search had opened. Pick 42 and the card links to 42.
Older entries (1.0.28 and earlier) are in changelog.txt, which ships with the plugin.
