{"id":300610,"date":"2026-05-18T18:33:44","date_gmt":"2026-05-18T18:33:44","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/myfeeds\/"},"modified":"2026-10-13T08:08:32","modified_gmt":"2026-10-13T08:08:32","slug":"myfeeds-affiliate-feed-manager","status":"publish","type":"plugin","link":"https:\/\/kea.wordpress.org\/plugins\/myfeeds-affiliate-feed-manager\/","author":23480479,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.48","stable_tag":"1.0.48","tested":"7.1.3","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"MyFeeds \u2014 Shoppable Affiliate Product Cards","header_author":"MyFeeds","header_description":"Import and manage affiliate product feeds from any network. Smart search, auto-mapping, and a Gutenberg Product Picker for bloggers.","assets_banners_color":"c4c4ec","last_updated":"2026-10-13 08:08:32","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/myfeeds.site","header_author_uri":"https:\/\/myfeeds.site","rating":5,"author_block_rating":0,"active_installs":0,"downloads":1768,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"myfeeds","date":"2026-05-18 18:32:43","revision":3536179},"1.0.10":{"tag":"1.0.10","author":"myfeeds","date":"2026-05-21 21:09:45","revision":3542790},"1.0.12":{"tag":"1.0.12","author":"myfeeds","date":"2026-05-21 21:34:41","revision":3542805},"1.0.13":{"tag":"1.0.13","author":"myfeeds","date":"2026-05-23 13:27:29","revision":3545172},"1.0.14":{"tag":"1.0.14","author":"myfeeds","date":"2026-05-23 14:24:13","revision":3545218},"1.0.15":{"tag":"1.0.15","author":"myfeeds","date":"2026-05-23 14:34:45","revision":3545225},"1.0.16":{"tag":"1.0.16","author":"myfeeds","date":"2026-05-25 14:06:43","revision":3547707},"1.0.17":{"tag":"1.0.17","author":"myfeeds","date":"2026-05-28 22:08:03","revision":3552814},"1.0.18":{"tag":"1.0.18","author":"myfeeds","date":"2026-06-04 14:41:58","revision":3561152},"1.0.19":{"tag":"1.0.19","author":"myfeeds","date":"2026-08-14 22:16:55","revision":3648001},"1.0.2":{"tag":"1.0.2","author":"myfeeds","date":"2026-05-18 22:22:09","revision":3536370},"1.0.20":{"tag":"1.0.20","author":"myfeeds","date":"2026-08-14 22:27:21","revision":3648015},"1.0.21":{"tag":"1.0.21","author":"myfeeds","date":"2026-08-21 12:05:42","revision":3658947},"1.0.22":{"tag":"1.0.22","author":"myfeeds","date":"2026-08-22 16:54:20","revision":3660923},"1.0.23":{"tag":"1.0.23","author":"myfeeds","date":"2026-08-23 23:21:03","revision":3662423},"1.0.24":{"tag":"1.0.24","author":"myfeeds","date":"2026-08-28 17:21:08","revision":3670724},"1.0.25":{"tag":"1.0.25","author":"myfeeds","date":"2026-09-03 19:02:18","revision":3680259},"1.0.26":{"tag":"1.0.26","author":"myfeeds","date":"2026-09-03 21:41:38","revision":3680437},"1.0.27":{"tag":"1.0.27","author":"myfeeds","date":"2026-09-05 20:51:40","revision":3682805},"1.0.28":{"tag":"1.0.28","author":"myfeeds","date":"2026-09-05 21:26:18","revision":3682818},"1.0.29":{"tag":"1.0.29","author":"myfeeds","date":"2026-09-05 23:37:05","revision":3682867},"1.0.3":{"tag":"1.0.3","author":"myfeeds","date":"2026-05-19 19:42:17","revision":3537885},"1.0.30":{"tag":"1.0.30","author":"myfeeds","date":"2026-09-06 13:32:01","revision":3683485},"1.0.31":{"tag":"1.0.31","author":"myfeeds","date":"2026-09-07 13:06:44","revision":3684975},"1.0.32":{"tag":"1.0.32","author":"myfeeds","date":"2026-09-08 14:53:37","revision":3686870},"1.0.33":{"tag":"1.0.33","author":"myfeeds","date":"2026-09-09 11:06:43","revision":3688170},"1.0.34":{"tag":"1.0.34","author":"myfeeds","date":"2026-09-10 11:15:55","revision":3689801},"1.0.35":{"tag":"1.0.35","author":"myfeeds","date":"2026-09-10 13:52:44","revision":3690001},"1.0.36":{"tag":"1.0.36","author":"myfeeds","date":"2026-09-23 13:15:56","revision":3709389},"1.0.37":{"tag":"1.0.37","author":"myfeeds","date":"2026-09-23 14:51:33","revision":3709538},"1.0.38":{"tag":"1.0.38","author":"myfeeds","date":"2026-09-24 19:05:29","revision":3711904},"1.0.39":{"tag":"1.0.39","author":"myfeeds","date":"2026-09-27 14:12:21","revision":3715596},"1.0.4":{"tag":"1.0.4","author":"myfeeds","date":"2026-05-19 20:19:57","revision":3537907},"1.0.40":{"tag":"1.0.40","author":"myfeeds","date":"2026-09-27 14:46:03","revision":3715625},"1.0.41":{"tag":"1.0.41","author":"myfeeds","date":"2026-09-27 14:57:21","revision":3715635},"1.0.42":{"tag":"1.0.42","author":"myfeeds","date":"2026-09-27 15:37:11","revision":3715673},"1.0.43":{"tag":"1.0.43","author":"myfeeds","date":"2026-10-02 20:33:49","revision":3725470},"1.0.44":{"tag":"1.0.44","author":"myfeeds","date":"2026-10-03 15:00:52","revision":3726392},"1.0.45":{"tag":"1.0.45","author":"myfeeds","date":"2026-10-03 16:04:47","revision":3726480},"1.0.46":{"tag":"1.0.46","author":"myfeeds","date":"2026-10-08 16:55:11","revision":3735189},"1.0.47":{"tag":"1.0.47","author":"myfeeds","date":"2026-10-08 17:49:11","revision":3735274},"1.0.48":{"tag":"1.0.48","author":"myfeeds","date":"2026-10-13 08:08:32","revision":3743229},"1.0.5":{"tag":"1.0.5","author":"myfeeds","date":"2026-05-19 21:44:34","revision":3537986},"1.0.6":{"tag":"1.0.6","author":"myfeeds","date":"2026-05-19 22:12:35","revision":3537994},"1.0.7":{"tag":"1.0.7","author":"myfeeds","date":"2026-05-19 22:44:34","revision":3538015},"1.0.8":{"tag":"1.0.8","author":"myfeeds","date":"2026-05-21 09:52:35","revision":3541466},"1.0.9":{"tag":"1.0.9","author":"myfeeds","date":"2026-05-21 19:34:12","revision":3542685}},"upgrade_notice":{"1.0.36":"<p>Product images are now requested at the size they are shown. On pages where a merchant ships very large images this is the difference between tens of megabytes and a few. Sizes of the same product are grouped into one card, and re-importing your feed marks the products your merchant has withdrawn.<\/p>","1.0.21":"<p>Six more affiliate networks are recognised automatically: Tradedoubler, Commission Junction, Impact, Rakuten, Pepperjam and FlexOffers. Feeds from those no longer need their columns mapped by hand.<\/p>","1.0.8":"<p>WordPress 7.0 compatibility confirmed. No code changes, just a tested-up-to bump so the plugin keeps its clean WordPress.org listing.<\/p>","1.0.7":"<p>Honest counts: the result total and facet pills in the product picker now match the grid below them. Size variants are no longer double-counted in the header.<\/p>","1.0.6":"<p>Recall fix: queries with a short token like &quot;air force 1&quot; or &quot;nike 1&quot; now return matches instead of an empty list. Recommended for anyone running MySQL 8 (most modern hosts).<\/p>","1.0.5":"<p>The product picker grew a real search surface: filters for brand, colour, category and price, a sort dropdown, did-you-mean recovery, phrase matching and a visual colour swatch picker. Type-and-search-live; the results refetch as you change your mind.<\/p>","1.0.4":"<p>The Smart Mapper now double-checks its picks against a real sample row and swaps in the next-best column when its first choice is empty - so a merchant dropping a column after the feed was first added stops silently writing default values into your DB.<\/p>","1.0.3":"<p>A new Content Health card on the MyFeeds page tells you when a post still links to products that have dropped out of your feed. Quick Sync now self-heals from a crashed background worker, and a Cancel mid-batch is finally respected.<\/p>","1.0.2":"<p>Mapping Editor overhaul: redesigned with the plugin&#039;s brand, a new pill-style quality bar that opens a detail modal showing the actual source column for every field, plus fixes for stale dropdown entries and select-overflow with long column names.<\/p>","1.0.1":"<p>Bug-fix release. Importer reliability for large AWIN datafeeds, faithful currency handling (no more silent EUR default), better category mapping for merchants that use breadcrumb paths, and card-display fixes against sticky theme headers and mobile typography overrides.<\/p>","1.0.0":"<p>Welcome to MyFeeds. Import your first affiliate product feed and start showcasing products in your posts.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3536180,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3536180,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3657952,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3657952,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3743231,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/?p=100\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"features\":{\"networking\":false},\"login\":true,\"steps\":[{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"MyFeeds live preview\"}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"myfeeds-affiliate-feed-manager\"},\"options\":{\"activate\":true}},{\"step\":\"mkdir\",\"path\":\"\\\/wordpress\\\/wp-content\\\/mu-plugins\"},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/mu-plugins\\\/myfeeds-preview-fulltext.php\",\"data\":\"<?php\\n\\\/**\\n * Plugin Name: MyFeeds live preview: full-text search on SQLite\\n * Description: WordPress Playground only. Playground stores WordPress in SQLite, which has no MySQL full-text search, so the Product Picker would fall back to its substring search. This answers the picker's one MATCH ... AGAINST query the way MySQL would. It changes no data.\\n *\\\/\\n\\nif (!defined('ABSPATH')) {\\n    exit;\\n}\\n\\n\\\/*\\n * The plugin's only full-text clause is MATCH(search_text) AGAINST('<boolean query>'\\n * IN BOOLEAN MODE) with +required groups, (alternatives) and word*\\n * prefixes. It becomes the equivalent word-start LIKE test. Anything it\\n * does not fully understand is left alone, and the plugin's own fallback\\n * still applies.\\n *\\\/\\nadd_filter('query', function ($query) {\\n    if (stripos($query, 'AGAINST') === false) {\\n        return $query;\\n    }\\n    return preg_replace_callback(\\n        \\\"\\\/MATCH\\\\\\\\s*\\\\\\\\(\\\\\\\\s*`?search_text`?\\\\\\\\s*\\\\\\\\)\\\\\\\\s*AGAINST\\\\\\\\s*\\\\\\\\(\\\\\\\\s*'((?:[^'\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*)'\\\\\\\\s+IN\\\\\\\\s+BOOLEAN\\\\\\\\s+MODE\\\\\\\\s*\\\\\\\\)\\\/i\\\",\\n        'myfeeds_preview_boolean_match_to_like',\\n        $query\\n    );\\n});\\n\\nfunction myfeeds_preview_boolean_match_to_like($m) {\\n    $expr = stripslashes($m[1]);\\n    if (preg_match('\\\/[^\\\\p{L}\\\\p{N}\\\\s+\\\\-*()]\\\/u', $expr)) {\\n        return $m[0];\\n    }\\n    preg_match_all('\\\/([+\\\\-]?)(?:\\\\(([^()]*)\\\\)|([\\\\p{L}\\\\p{N}]+\\\\*?))\\\/u', $expr, $items, PREG_SET_ORDER);\\n    $required = $excluded = $optional = array();\\n    foreach ($items as $it) {\\n        $terms = (isset($it[2]) && $it[2] !== '') ? preg_split('\\\/\\\\s+\\\/', trim($it[2])) : array($it[3] ?? '');\\n        $alts = array();\\n        foreach ($terms as $t) {\\n            $t = ltrim($t, '+-');\\n            if ($t === '' || !preg_match('\\\/^[\\\\p{L}\\\\p{N}]+\\\\*?$\\\/u', $t)) {\\n                continue;\\n            }\\n            $alts[] = myfeeds_preview_word_like($t);\\n        }\\n        if (!$alts) {\\n            continue;\\n        }\\n        $sql = '(' . implode(' OR ', $alts) . ')';\\n        if ($it[1] === '+') {\\n            $required[] = $sql;\\n        } elseif ($it[1] === '-') {\\n            $excluded[] = 'NOT ' . $sql;\\n        } else {\\n            $optional[] = $sql;\\n        }\\n    }\\n    if ($required) {\\n        $parts = array_merge($required, $excluded);\\n    } elseif ($optional) {\\n        $parts = array_merge(array('(' . implode(' OR ', $optional) . ')'), $excluded);\\n    } else {\\n        return $m[0];\\n    }\\n    return '(' . implode(' AND ', $parts) . ')';\\n}\\n\\n\\\/\\\/ A word starts the column or follows a delimiter InnoDB also splits on.\\nfunction myfeeds_preview_word_like($term) {\\n    $prefix = substr($term, -1) === '*';\\n    $word   = rtrim($term, '*');\\n    $alts   = array();\\n    foreach (array(' ', '-', '(', '\\\/') as $before) {\\n        $alts[] = $prefix\\n            ? \\\"CONCAT(' ', search_text) LIKE '%{$before}{$word}%'\\\"\\n            : \\\"CONCAT(' ', search_text, ' ') LIKE '%{$before}{$word} %'\\\";\\n    }\\n    return '(' . implode(' OR ', $alts) . ')';\\n}\\n\"},{\"step\":\"runPHP\",\"progress\":{\"caption\":\"Loading the sample products\"},\"code\":\"<?php\\n\\\/*\\n * MyFeeds live preview: runs once inside WordPress Playground, after the\\n * plugin was installed from wordpress.org and activated.\\n *\\n * Writes nothing the plugin would not write itself. Three things:\\n *   1. the products table, through the plugin's own create_table()\\n *   2. the plugin's built-in sample products, through the same function\\n *      the \\\"Load sample products\\\" button calls\\n *   3. one post with two Product Picker blocks holding those products,\\n *      the way the block editor saves it, and a few lines of text that\\n *      say what the visitor is looking at\\n *\\\/\\n\\n\\\/\\\/ runPHP is not a web request: $_SERVER['HTTPS'] is \\\"off\\\" even when the\\n\\\/\\\/ preview runs on https:\\\/\\\/playground.wordpress.net. The plugin builds the\\n\\\/\\\/ sample image URLs from its plugin URL, so they would be stored as\\n\\\/\\\/ http:\\\/\\\/ and the browser would flag every card image as mixed content.\\n\\\/\\\/ Playground defines WP_SITEURL before WordPress loads; take the scheme\\n\\\/\\\/ from there, as the \\\"Load sample products\\\" button on an https site would.\\nif (defined('WP_SITEURL') && strpos(WP_SITEURL, 'https:\\\/\\\/') === 0) {\\n    $_SERVER['HTTPS'] = 'on';\\n}\\n\\nrequire_once '\\\/wordpress\\\/wp-load.php';\\n\\n$myfeeds_ok = class_exists('MyFeeds_DB_Manager') && class_exists('MyFeeds_Demo_Content');\\nif (!$myfeeds_ok) {\\n    return;\\n}\\n\\n$admin = get_user_by('login', 'admin');\\n$admin_id = $admin ? (int) $admin->ID : 1;\\nwp_set_current_user($admin_id);\\n\\n\\\/\\\/ 1. On a real site the table appears with the first wp-admin page after\\n\\\/\\\/    activation (the schema step on admin_init). Blueprint steps run\\n\\\/\\\/    before any wp-admin page exists, so the same function is called here.\\n\\\/\\\/    dbDelta: safe to call again, the admin_init step later is a no-op.\\nif (!MyFeeds_DB_Manager::table_exists()) {\\n    MyFeeds_DB_Manager::create_table();\\n}\\n\\n\\\/\\\/ 2. MyFeeds -> Feeds -> \\\"Load sample products\\\" posts to\\n\\\/\\\/    admin-post.php?action=myfeeds_load_demo, which ends in exactly this\\n\\\/\\\/    call. Seven invented products, images shipped inside the plugin,\\n\\\/\\\/    every link goes to https:\\\/\\\/myfeeds.site\\\/demo-product\\\/.\\nif (MyFeeds_Demo_Content::can_offer()) {\\n    MyFeeds_Demo_Content::load();\\n}\\n\\n\\\/\\\/ 3. Two Product Picker blocks with text around them, so the post reads\\n\\\/\\\/    like an article and says what the visitor is looking at: one row of\\n\\\/\\\/    four, a few lines, then the other three. Each block stores what the\\n\\\/\\\/    editor's picker stores when a product is clicked (toggleProduct() in\\n\\\/\\\/    src\\\/index.js). The card on the page reads the product fresh from the\\n\\\/\\\/    table; this copy is what the editor tiles show before they refresh.\\n$ids = array();\\nforeach (MyFeeds_Demo_Content::products() as $p) {\\n    $ids[] = $p['id'];\\n}\\n$rows = MyFeeds_DB_Manager::get_products($ids);\\n\\n\\\/\\\/ One product on sale in each row. A sample the plugin adds later is not\\n\\\/\\\/ dropped: whatever is not named here joins the second block.\\n$order = array(\\n    'demo-sneaker-white-lowtop', 'demo-hoodie-heather-grey', 'demo-tote-canvas-natural', 'demo-beanie-knit-navy',\\n    'demo-sneaker-black-hightop', 'demo-backpack-trail', 'demo-tee-boxy-offwhite',\\n);\\n$ids = array_merge(array_values(array_intersect($order, $ids)), array_values(array_diff($ids, $order)));\\n\\n$selected = array();\\nforeach ($ids as $id) {\\n    if (!isset($rows[$id])) {\\n        continue;\\n    }\\n    $r = $rows[$id];\\n    $selected[] = array(\\n        'id'             => (string) $r['id'],\\n        'title'          => $r['title'],\\n        'image_url'      => $r['image_url'],\\n        'affiliate_link' => $r['affiliate_link'],\\n        'brand'          => $r['brand'],\\n        'merchant'       => $r['merchant'],\\n        'price'          => $r['price'],\\n        'original_price' => $r['original_price'],\\n        'currency'       => $r['currency'],\\n        'color'          => $r['colour'],\\n        'size'           => '',\\n    );\\n}\\nif (!$selected) {\\n    return;\\n}\\n\\n\\\/\\\/ serialize_block() escapes the attributes the way the editor does\\n\\\/\\\/ (& becomes & and so on); wp_slash() below keeps those backslashes.\\n$picker = function (array $products) {\\n    return serialize_block(array(\\n        'blockName'    => 'myfeeds\\\/product-picker',\\n        'attrs'        => array('selectedProducts' => array_values($products)),\\n        'innerBlocks'  => array(),\\n        'innerHTML'    => '',\\n        'innerContent' => array(),\\n    ));\\n};\\n$paragraph = function ($html) {\\n    return '<!-- wp:paragraph -->' . '<p>' . $html . '<\\\/p>' . '<!-- \\\/wp:paragraph -->';\\n};\\n$heading = function ($text) {\\n    return '<!-- wp:heading -->' . '<h2 class=\\\"wp-block-heading\\\">' . $text . '<\\\/h2>' . '<!-- \\\/wp:heading -->';\\n};\\n\\n\\\/\\\/ Four cards are one row on a desktop; the grid centres what is left.\\n$first  = array_slice($selected, 0, 4);\\n$second = array_slice($selected, 4);\\n\\n$parts = array(\\n    $paragraph('This is what MyFeeds product cards look like in a post. You write about the products you recommend, as you always do. Where you would paste a link, you show the products of the shops you are an affiliate for, like these four:'),\\n    $picker($first),\\n    $heading('A click takes your reader to the shop'),\\n    $paragraph('Each card leads to the product in the shop, through your affiliate link. In this preview, every card opens a demo page instead.'),\\n);\\nif ($second) {\\n    $parts[] = $paragraph('The prices come from the shop\\u2019s product feed, so you never type them in, and they change when the shop changes them. Products fit wherever a post needs them. Write a few more lines, then show the next ones:');\\n    $parts[] = $picker($second);\\n}\\n$parts[] = $heading('Try it in this preview');\\n\\\/\\\/ The wordpress.org link opens a new tab: inside the Playground frame the\\n\\\/\\\/ plugin page would refuse to load.\\n$parts[] = $paragraph('Click <strong>Edit Post<\\\/strong> (the pencil in the top bar). In one of the product blocks, search for \\u201csneaker\\u201d and add a product. If you like what you see, <a href=\\\"https:\\\/\\\/wordpress.org\\\/plugins\\\/myfeeds-affiliate-feed-manager\\\/\\\" target=\\\"_blank\\\" rel=\\\"noreferrer noopener\\\">MyFeeds is free on WordPress.org<\\\/a>.');\\n$parts[] = '<!-- wp:separator -->'\\n    . '<hr class=\\\"wp-block-separator has-alpha-channel-opacity\\\"\\\/>'\\n    . '<!-- \\\/wp:separator -->';\\n$parts[] = '<!-- wp:paragraph {\\\"fontSize\\\":\\\"small\\\"} -->'\\n    . '<p class=\\\"has-small-font-size\\\"><em>This is a live preview. It runs in your browser with MyFeeds and the sample products that come with the plugin. The brands, products and prices are invented.<\\\/em><\\\/p>'\\n    . '<!-- \\\/wp:paragraph -->';\\n\\n$post_id = wp_insert_post(wp_slash(array(\\n    'import_id'      => 100,\\n    'post_title'     => 'Your post, with product cards instead of links',\\n    'post_name'      => 'myfeeds-live-preview',\\n    'post_content'   => implode(\\\"\\\\n\\\\n\\\", $parts),\\n    'post_status'    => 'publish',\\n    'post_type'      => 'post',\\n    'comment_status' => 'closed',\\n    'ping_status'    => 'closed',\\n    'post_author'    => $admin_id,\\n)), true);\\n\\n\\\/\\\/ The editor's first-run guide would cover the post. Same switch the\\n\\\/\\\/ editor flips when it is closed by hand.\\nglobal $wpdb;\\nupdate_user_meta($admin_id, $wpdb->get_blog_prefix() . 'persisted_preferences', array(\\n    'core\\\/edit-post' => array('welcomeGuide' => false),\\n    'core'           => array('enableChoosePatternModal' => false),\\n    '_modified'      => gmdate('c'),\\n));\\n\"}]}"}},"all_blocks":{"myfeeds\/product-picker":{"name":"myfeeds\/product-picker","title":"MyFeeds u2013 Product Picker"}},"tagged_versions":["1.0.1","1.0.10","1.0.12","1.0.13","1.0.14","1.0.15","1.0.16","1.0.17","1.0.18","1.0.19","1.0.2","1.0.20","1.0.21","1.0.22","1.0.23","1.0.24","1.0.25","1.0.26","1.0.27","1.0.28","1.0.29","1.0.3","1.0.30","1.0.31","1.0.32","1.0.33","1.0.34","1.0.35","1.0.36","1.0.37","1.0.38","1.0.39","1.0.4","1.0.40","1.0.41","1.0.42","1.0.43","1.0.44","1.0.45","1.0.46","1.0.47","1.0.48","1.0.5","1.0.6","1.0.7","1.0.8","1.0.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3655474,"resolution":"1","location":"assets","locale":"","width":1800,"height":913},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3655474,"resolution":"2","location":"assets","locale":"","width":1754,"height":1396},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3655474,"resolution":"3","location":"assets","locale":"","width":1708,"height":738},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3655474,"resolution":"4","location":"assets","locale":"","width":1760,"height":866},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3655474,"resolution":"5","location":"assets","locale":"","width":1800,"height":1230},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3711895,"resolution":"6","location":"assets","locale":"","width":1800,"height":889},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3655474,"resolution":"7","location":"assets","locale":"","width":1800,"height":1059},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3655474,"resolution":"8","location":"assets","locale":"","width":1800,"height":1050}},"screenshots":{"1":"The product picker inside the block editor. Search your whole feed, narrow it with filters, click what you want. Here: 120 results for \"shoes\", filtered down to one brand, four products picked.","2":"Your picked products, saved in the block. They stay together until you place them, each with its own price and discount. The shop buttons on the cards belong to MyFeeds E-commerce.","3":"Those four products published as a live product grid in a real blog post. Your readers see what the merchant is actually selling today, for as long as the post exists.","4":"The same four products as a swipeable carousel (MyFeeds Starter). A second way to present what you've curated, for image-heavy posts and roundups.","5":"Card design editor (MyFeeds Starter). Cards that look like your blog wrote them. One save, every card across every post catches up. The live editor opens more than this screen lets on.","6":"Full storefront on your own domain (MyFeeds E-commerce). Visitors see your real online shop with categories, filters and sorting. The controls they already know from any modern shop, all on your domain. Every checkout goes through your affiliate link.","7":"Category manager (MyFeeds E-commerce). A shop organised the way your readers shop. Build the tree once, then curate products into each category by hand. Smart keyword search behind the scenes; you stay the editor.","8":"Shop design editor (MyFeeds E-commerce). Your storefront tracks your taste. A phone, tablet and laptop preview moves with you, so what you ship is exactly what your reader meets. The live editor carries plenty more."}},"plugin_section":[],"plugin_tags":[369,370,5410,5418,21735],"plugin_category":[35],"plugin_contributors":[263419],"plugin_business_model":[],"class_list":["post-300610","plugin","type-plugin","status-publish","hentry","plugin_tags-affiliate","plugin_tags-affiliate-marketing","plugin_tags-datafeed","plugin_tags-product-feed","plugin_tags-product-import","plugin_category-advertising","plugin_contributors-myfeeds","plugin_committers-myfeeds"],"banners":{"banner":"https:\/\/ps.w.org\/myfeeds-affiliate-feed-manager\/assets\/banner-772x250.png?rev=3657952","banner_2x":"https:\/\/ps.w.org\/myfeeds-affiliate-feed-manager\/assets\/banner-1544x500.png?rev=3657952","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/myfeeds-affiliate-feed-manager\/assets\/icon-128x128.png?rev=3536180","icon_2x":"https:\/\/ps.w.org\/myfeeds-affiliate-feed-manager\/assets\/icon-256x256.png?rev=3536180","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/myfeeds-affiliate-feed-manager\/assets\/screenshot-1.png?rev=3655474","caption":"The product picker inside the block editor. Search your whole feed, narrow it with filters, click what you want. Here: 120 results for \"shoes\", filtered down to one brand, four products picked."},{"src":"https:\/\/ps.w.org\/myfeeds-affiliate-feed-manager\/assets\/screenshot-2.png?rev=3655474","caption":"Your picked products, saved in the block. They stay together until you place them, each with its own price and discount. The shop buttons on the cards belong to MyFeeds E-commerce."},{"src":"https:\/\/ps.w.org\/myfeeds-affiliate-feed-manager\/assets\/screenshot-3.png?rev=3655474","caption":"Those four products published as a live product grid in a real blog post. Your readers see what the merchant is actually selling today, for as long as the post exists."},{"src":"https:\/\/ps.w.org\/myfeeds-affiliate-feed-manager\/assets\/screenshot-4.png?rev=3655474","caption":"The same four products as a swipeable carousel (MyFeeds Starter). A second way to present what you've curated, for image-heavy posts and roundups."},{"src":"https:\/\/ps.w.org\/myfeeds-affiliate-feed-manager\/assets\/screenshot-5.png?rev=3655474","caption":"Card design editor (MyFeeds Starter). Cards that look like your blog wrote them. One save, every card across every post catches up. The live editor opens more than this screen lets on."},{"src":"https:\/\/ps.w.org\/myfeeds-affiliate-feed-manager\/assets\/screenshot-6.png?rev=3711895","caption":"Full storefront on your own domain (MyFeeds E-commerce). Visitors see your real online shop with categories, filters and sorting. The controls they already know from any modern shop, all on your domain. Every checkout goes through your affiliate link."},{"src":"https:\/\/ps.w.org\/myfeeds-affiliate-feed-manager\/assets\/screenshot-7.png?rev=3655474","caption":"Category manager (MyFeeds E-commerce). A shop organised the way your readers shop. Build the tree once, then curate products into each category by hand. Smart keyword search behind the scenes; you stay the editor."},{"src":"https:\/\/ps.w.org\/myfeeds-affiliate-feed-manager\/assets\/screenshot-8.png?rev=3655474","caption":"Shop design editor (MyFeeds E-commerce). Your storefront tracks your taste. A phone, tablet and laptop preview moves with you, so what you ship is exactly what your reader meets. The live editor carries plenty more."}],"raw_content":"<!--section=description-->\n<p><strong>Tired of hunting for products, pasting affiliate links, fixing the ones that quietly stopped working, and earning from ads alone? Make your blog shoppable!<\/strong><\/p>\n\n<p>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?<\/p>\n\n<p>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.<\/p>\n\n<p>All you do is copy the product feed link from your affiliate network and paste it into MyFeeds. Once the feed is imported, the <strong>Product Picker<\/strong> block lets you search it right inside the block editor, by keyword, with filters when you need them.<\/p>\n\n<p>You get to stay where the value is. Writing. Instead of pasting URLs at midnight.<\/p>\n\n<h4>Who is this for<\/h4>\n\n<p>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.<\/p>\n\n<p>The block editor stays your block editor. The plugin works in the background.<\/p>\n\n<h4>What changes for you<\/h4>\n\n<ul>\n<li><strong>Your posts become shoppable.<\/strong> A grid your readers can scan: image, brand, price, discount, shipping, and your link. You compose it in seconds inside the block editor.<\/li>\n<li><strong>Your prices stop lying.<\/strong> The price your reader sees today is the price on the merchant's checkout right now.<\/li>\n<li><strong>Your posts stay current.<\/strong> Discontinued products surface so you can replace them. Stock that comes back lights up again. Nothing changes behind your back.<\/li>\n<li><strong>You publish faster.<\/strong> Two letters in the editor, the product appears, you click, the card is in. You never leave the post you're writing.<\/li>\n<li><strong>Your site stays yours.<\/strong> 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.<\/li>\n<li><strong>You never learn a file format.<\/strong> Whatever your network sends, MyFeeds reads it and works out which column is the price, which is the image, which is the link.<\/li>\n<\/ul>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li>Paste in the <strong>affiliate product feed URL<\/strong> from your network.<\/li>\n<li>Every product is imported and stored locally in your WordPress database. The plugin figures out the column structure on its own.<\/li>\n<li>In any post or page, add the <strong>MyFeeds Product Picker<\/strong> block. Search by name, brand, or category. Click to insert.<\/li>\n<li>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.<\/li>\n<\/ol>\n\n<p>The next day the nightly sync refreshes what changed. The week after, a full import catches everything else. You don't think about it.<\/p>\n\n<h4>What's in the box<\/h4>\n\n<ul>\n<li>Universal feed import. Almost any format your program hands you, detected automatically.<\/li>\n<li>Smart Mapping. Automatic recognition of common feed structures, with a manual editor for anything custom.<\/li>\n<li>Smart Search inside the block editor with synonym handling and multi-language support.<\/li>\n<li>Native Gutenberg <strong>Product Picker<\/strong> block with live in-editor search.<\/li>\n<li>Responsive grid of product tiles with prices, brands, shipping, and your affiliate links.<\/li>\n<li>Background imports. Large feeds process without locking your admin.<\/li>\n<li>Nightly auto-sync and weekly full re-import, scheduled and quiet.<\/li>\n<li>The price and the currency come straight from the feed. Nothing is converted behind your back.<\/li>\n<li>Works with any WordPress theme that supports the block editor.<\/li>\n<\/ul>\n\n<h4>Good to know<\/h4>\n\n<ul>\n<li>Everything happens inside WordPress, from the feed URL to the published card. There is nothing to download, upload or update by hand.<\/li>\n<li>Self-hosted. Your server contacts no external service to render a product; the pictures come from the merchant's image server.<\/li>\n<li>If your program publishes a feed file you can download, MyFeeds will almost certainly import it.<\/li>\n<\/ul>\n\n<h4>Get started<\/h4>\n\n<p>Install MyFeeds, paste one feed URL, and make your next post shoppable.<\/p>\n\n<h4>Related paid plugins<\/h4>\n\n<p>This plugin is fully functional on its own. Separate, independent paid plugins called <strong>MyFeeds Starter<\/strong>, <strong>MyFeeds Pro<\/strong> and <strong>MyFeeds E-commerce<\/strong> are available at <a href=\"https:\/\/myfeeds.site\/?utm_source=wporg&amp;utm_medium=readme&amp;utm_campaign=paid-plugins\">myfeeds.site<\/a>. 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.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>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.<\/p>\n\n<h4>Configured product feed URL (your affiliate network)<\/h4>\n\n<p>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.<\/p>\n\n<ul>\n<li><strong>What is sent:<\/strong> an HTTP GET request to the feed URL. It carries WordPress's standard <code>User-Agent<\/code> header, 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.<\/li>\n<li><strong>When it is sent:<\/strong> 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.<\/li>\n<li><strong>Where it is sent:<\/strong> 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.<\/li>\n<\/ul>\n\n<p>The feed is provided by your affiliate network, so that network's terms of service and privacy policy apply to the download.<\/p>\n\n<h4>Product pictures (the merchant's image server)<\/h4>\n\n<p>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.<\/p>\n\n<ul>\n<li><strong>In your readers' browsers:<\/strong> 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.<\/li>\n<li><strong>From your server:<\/strong> 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 <code>User-Agent<\/code> header 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.<\/li>\n<li><strong>Where it is sent:<\/strong> to the hosts named in the picture addresses of your feed.<\/li>\n<\/ul>\n\n<p>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.<\/p>\n\n<h4>Links on a product card<\/h4>\n\n<p>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.<\/p>\n\n<p>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.<\/p>\n\n<h3>Source Code<\/h3>\n\n<p>The full source for this plugin is open-source. See <a href=\"https:\/\/myfeeds.site\/?utm_source=wporg&amp;utm_medium=readme&amp;utm_campaign=source\">myfeeds.site<\/a> for the project homepage and links to the public repository.<\/p>\n\n<ul>\n<li>Block editor source: <code>src\/index.js<\/code><\/li>\n<li>Build tool: terser via <code>npm run build<\/code> (configuration in <code>package.json<\/code>)<\/li>\n<\/ul>\n\n<p>To rebuild the editor bundle from source, run <code>npm install &amp;&amp; npm run build<\/code> inside the plugin folder.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>myfeeds-affiliate-feed-manager<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory, or install the plugin directly from the WordPress plugin screen.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Go to <strong>MyFeeds<\/strong> in your admin sidebar and click <strong>Add your first feed<\/strong>.<\/li>\n<li>Paste a product feed URL from your affiliate network and click <strong>Import<\/strong>.<\/li>\n<li>In the block editor, add the <strong>MyFeeds \u2013 Product Picker<\/strong> block to any post or page.<\/li>\n<li>Search for products, select them, and publish.<\/li>\n<\/ol>\n\n<h4>Where do I get a product feed URL?<\/h4>\n\n<p>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.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20upload%20a%20merchant%20product%20feed%20to%20wordpress%3F\"><h3>How do I upload a merchant product feed to WordPress?<\/h3><\/dt>\n<dd><p>Install MyFeeds, open <strong>MyFeeds \u2192 Feeds<\/strong>, 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.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20affiliate%20products%20to%20a%20blog%20post%3F\"><h3>How do I add affiliate products to a blog post?<\/h3><\/dt>\n<dd><p>Open any post in the block editor and add the <strong>MyFeeds \u2013 Product Picker<\/strong> 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.<\/p><\/dd>\n<dt id=\"how%20do%20i%20keep%20affiliate%20prices%20up%20to%20date%20on%20my%20site%3F\"><h3>How do I keep affiliate prices up to date on my site?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"which%20affiliate%20networks%20provide%20a%20product%20feed%3F\"><h3>Which affiliate networks provide a product feed?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20build%20an%20affiliate%20store%20or%20shop%20page%20with%20this%3F\"><h3>Can I build an affiliate store or shop page with this?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"how%20long%20does%20an%20import%20take%3F\"><h3>How long does an import take?<\/h3><\/dt>\n<dd><p>It depends on the feed size. A feed with 10,000 products typically takes 2\u20135 minutes. Imports run in the background via Action Scheduler, so you can keep working while they process.<\/p><\/dd>\n<dt id=\"why%20are%20some%20products%20missing%20after%20import%3F\"><h3>Why are some products missing after import?<\/h3><\/dt>\n<dd><p>Only products with valid data (title, price, image, and affiliate link) are imported. Check your feed source for incomplete entries.<\/p><\/dd>\n<dt id=\"does%20myfeeds%20slow%20down%20my%20site%3F\"><h3>Does MyFeeds slow down my site?<\/h3><\/dt>\n<dd><p>No. All product data is stored locally in your WordPress database. The frontend makes no external API calls, so your site stays fast.<\/p><\/dd>\n<dt id=\"does%20myfeeds%20work%20with%20any%20theme%3F\"><h3>Does MyFeeds work with any theme?<\/h3><\/dt>\n<dd><p>Yes, it works with any WordPress theme that supports the Gutenberg block editor (WordPress 5.8+).<\/p><\/dd>\n<dt id=\"can%20i%20use%20myfeeds%20with%20the%20classic%20editor%3F\"><h3>Can I use MyFeeds with the Classic Editor?<\/h3><\/dt>\n<dd><p>No. MyFeeds requires the block editor.<\/p><\/dd>\n<dt id=\"which%20affiliate%20networks%20are%20supported%3F\"><h3>Which affiliate networks are supported?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20my%20network%27s%20feed%3A%20awin%2C%20cj%2C%20impact%2C%20tradedoubler%2C%20rakuten%3F\"><h3>Does it work with my network's feed: Awin, CJ, Impact, Tradedoubler, Rakuten?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20make%20any%20external%20requests%3F\"><h3>Does the plugin make any external requests?<\/h3><\/dt>\n<dd><p>Yes. See <strong>External Services<\/strong> 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.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.48<\/h4>\n\n<ul>\n<li>Fixed: the mapping editor shows a feed's fields again. Loading them ended in a PHP error.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.47<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.46<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.45<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.44<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>Fixed: products of a removed feed that no post uses any more are now cleared out of the database instead of staying there forever.<\/li>\n<\/ul>\n\n<h4>1.0.43<\/h4>\n\n<ul>\n<li>Improved: prices are written the way their currency is normally written: \"\u00a3150.00\", \"$150.00\", \"150,00 \u20ac\". 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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>Fixed: a product without a price says \"Price on request\" in the product picker too, the same as on the card.<\/li>\n<li>Fixed: one selected product reads \"Use 1 Product\".<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.42<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.41<\/h4>\n\n<ul>\n<li>Improved: the Analytics preview's insight cards show every card the dashboard has today, including top earning posts and risers and fallers (example data).<\/li>\n<\/ul>\n\n<h4>1.0.40<\/h4>\n\n<ul>\n<li>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).<\/li>\n<\/ul>\n\n<h4>1.0.39<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.38<\/h4>\n\n<ul>\n<li>Improved: the storefront picture on the E-commerce page shows the shop as it looks now.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.37<\/h4>\n\n<ul>\n<li>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 \u2014 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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.36<\/h4>\n\n<ul>\n<li>Improved: product images are asked for at the size they are shown. Some merchants ship the print master \u2014 one feed averaged 2 MB per product image, with individual files past 25 MB \u2014 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.<\/li>\n<li>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.<\/li>\n<li>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 \u2014 \"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.<\/li>\n<li>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.<\/li>\n<li>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 \u2014 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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.35<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>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\".<\/li>\n<li>Fixed: when a search found nothing and the plugin fell back to a looser match, it did not say so. It does now.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.34<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.33<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.32<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.31<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>Every sort order gives one answer: two products that tie on price, discount or date come back in the same order every time.<\/li>\n<li>\"Back to search\" and \"Add to selection\" return you to where you were in the results, not to the top.<\/li>\n<li>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.<\/li>\n<li>Feeds are listed alphabetically in the mapping editor.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.30<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.29<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<p>Older entries (1.0.28 and earlier) are in changelog.txt, which ships with the plugin.<\/p>","raw_excerpt":"Make your blog shoppable. Import your merchants' affiliate product feed and place searchable product cards in any post. Prices and links stay current.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/300610","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=300610"}],"author":[{"embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/myfeeds"}],"wp:attachment":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=300610"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=300610"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=300610"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=300610"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=300610"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=300610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}