{"id":368581,"date":"2026-10-12T15:09:49","date_gmt":"2026-10-12T15:09:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/shopipress\/"},"modified":"2026-10-15T23:10:27","modified_gmt":"2026-10-15T23:10:27","slug":"fy2press","status":"publish","type":"plugin","link":"https:\/\/ssw.wordpress.org\/plugins\/fy2press\/","author":16149021,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.3","requires":"6.5","requires_php":"8.1","requires_plugins":null,"header_name":"Fy2Press Catalog for Shopify","header_author":"Pagup","header_description":"Publish a Shopify catalog as native WordPress catalog content while checkout remains on Shopify.","assets_banners_color":"1b1422","last_updated":"2026-10-15 23:10:27","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":113,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"pagup","date":"2026-10-15 23:10:27","revision":3749440}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3741940,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3741940,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3741940,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3741940,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3741940,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3749440,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/morrowfield-catalog\\\/\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"features\":{\"networking\":false},\"steps\":[{\"step\":\"login\",\"username\":\"admin\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"fy2press\"},\"options\":{\"activate\":true}},{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"Morrowfield demo (fictional)\",\"permalink_structure\":\"\\\/%postname%\\\/\",\"show_avatars\":false}},{\"step\":\"mkdir\",\"path\":\"\\\/wordpress\\\/wp-content\\\/uploads\\\/fy2press-demo\"},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/uploads\\\/fy2press-demo\\\/transit-24-backpack.jpg\",\"data\":{\"resource\":\"url\",\"url\":\"https:\\\/\\\/fy2press.com\\\/media\\\/demo\\\/playground\\\/transit-24-backpack.jpg\",\"caption\":\"Loading the fictional demo images\"}},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/uploads\\\/fy2press-demo\\\/transit-24-travel-kit.jpg\",\"data\":{\"resource\":\"url\",\"url\":\"https:\\\/\\\/fy2press.com\\\/media\\\/demo\\\/playground\\\/transit-24-travel-kit.jpg\",\"caption\":\"Loading the fictional demo images\"}},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/uploads\\\/fy2press-demo\\\/commuter-studio-set.jpg\",\"data\":{\"resource\":\"url\",\"url\":\"https:\\\/\\\/fy2press.com\\\/media\\\/demo\\\/playground\\\/commuter-studio-set.jpg\",\"caption\":\"Loading the fictional demo images\"}},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/uploads\\\/fy2press-demo\\\/field-bottle.jpg\",\"data\":{\"resource\":\"url\",\"url\":\"https:\\\/\\\/fy2press.com\\\/media\\\/demo\\\/playground\\\/field-bottle.jpg\",\"caption\":\"Loading the fictional demo images\"}},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/uploads\\\/fy2press-demo\\\/organizer-pouch.jpg\",\"data\":{\"resource\":\"url\",\"url\":\"https:\\\/\\\/fy2press.com\\\/media\\\/demo\\\/playground\\\/organizer-pouch.jpg\",\"caption\":\"Loading the fictional demo images\"}},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/uploads\\\/fy2press-demo\\\/packable-sling.jpg\",\"data\":{\"resource\":\"url\",\"url\":\"https:\\\/\\\/fy2press.com\\\/media\\\/demo\\\/playground\\\/packable-sling.jpg\",\"caption\":\"Loading the fictional demo images\"}},{\"step\":\"runPHP\",\"progress\":{\"caption\":\"Creating the fictional Morrowfield catalog\"},\"code\":\"<?php\\n\\\/**\\n * Fy2Press FREE live preview: idempotent fictional Morrowfield demo catalog.\\n * Runs as the blueprint runPHP step inside WordPress Playground only. No Shopify\\n * transport, licence, order or secret. Every object carries the marker, so a rerun\\n * removes only what this script created before it recreates the catalog.\\n * The six product images are written to uploads\\\/fy2press-demo by the blueprint\\n * writeFile steps; this script requires them and never downloads anything.\\n *\\\/\\nrequire_once '\\\/wordpress\\\/wp-load.php';\\n\\nuse Pagup\\\\ShopiPress\\\\Services\\\\{CacheService, ProductSyncSnapshot};\\n\\nif (php_uname('s') !== 'Emscripten' || ABSPATH !== '\\\/wordpress\\\/' || !class_exists(ProductSyncSnapshot::class)) {\\n    throw new RuntimeException('WordPress Playground with Fy2Press active required');\\n}\\n\\nconst FY2PRESS_DEMO_MARKER = 'MORROWFIELD_DEMO_20261012';\\ndefine('FY2PRESS_DEMO_DIR', WP_CONTENT_DIR . '\\\/uploads\\\/fy2press-demo');\\nwp_set_current_user(1);\\n\\n$copy = json_decode(<<<'JSON'\\n{\\\"collections\\\":[{\\\"slug\\\":\\\"carry\\\",\\\"name\\\":\\\"Carry\\\",\\\"description\\\":\\\"Backpacks and sets for everyday commuting.\\\"},{\\\"slug\\\":\\\"travel-essentials\\\",\\\"name\\\":\\\"Travel essentials\\\",\\\"description\\\":\\\"Small pieces that keep a trip organized.\\\"}],\\\"products\\\":[{\\\"slug\\\":\\\"transit-24-backpack\\\",\\\"image\\\":\\\"transit-24-backpack.jpg\\\",\\\"title\\\":\\\"Transit 24 backpack\\\",\\\"type\\\":\\\"Backpack\\\",\\\"description\\\":\\\"A 24-litre commuter backpack with a front organizer pocket and a quiet canvas finish.\\\",\\\"alt\\\":\\\"Fictional Morrowfield Transit 24 backpack worn on a station platform\\\",\\\"option\\\":\\\"Colour\\\",\\\"variants\\\":[{\\\"label\\\":\\\"Olive\\\",\\\"price\\\":\\\"148.00\\\",\\\"available\\\":true},{\\\"label\\\":\\\"Charcoal\\\",\\\"price\\\":\\\"148.00\\\",\\\"available\\\":true}],\\\"collections\\\":[\\\"carry\\\"],\\\"tags\\\":[{\\\"name\\\":\\\"Everyday\\\",\\\"slug\\\":\\\"everyday\\\"},{\\\"name\\\":\\\"Commute\\\",\\\"slug\\\":\\\"commute\\\"}]},{\\\"slug\\\":\\\"transit-24-travel-kit\\\",\\\"image\\\":\\\"transit-24-travel-kit.jpg\\\",\\\"title\\\":\\\"Transit 24 travel kit\\\",\\\"type\\\":\\\"Set\\\",\\\"description\\\":\\\"The Transit 24 backpack with a steel bottle, an organizer pouch and a packable sling.\\\",\\\"alt\\\":\\\"Fictional Morrowfield backpack, bottle and pouches on a dark table\\\",\\\"option\\\":\\\"Colour\\\",\\\"variants\\\":[{\\\"label\\\":\\\"Olive\\\",\\\"price\\\":\\\"196.00\\\",\\\"available\\\":true},{\\\"label\\\":\\\"Charcoal\\\",\\\"price\\\":\\\"196.00\\\",\\\"available\\\":false}],\\\"collections\\\":[\\\"carry\\\",\\\"travel-essentials\\\"],\\\"tags\\\":[{\\\"name\\\":\\\"Travel\\\",\\\"slug\\\":\\\"travel\\\"},{\\\"name\\\":\\\"Gift idea\\\",\\\"slug\\\":\\\"gift-idea\\\"}]},{\\\"slug\\\":\\\"commuter-studio-set\\\",\\\"image\\\":\\\"commuter-studio-set.jpg\\\",\\\"title\\\":\\\"Commuter studio set\\\",\\\"type\\\":\\\"Set\\\",\\\"description\\\":\\\"A lighter take on the commuter kit, photographed in daylight for editorial pages.\\\",\\\"alt\\\":\\\"Fictional Morrowfield backpack, pouch and bottle on a light stone set\\\",\\\"option\\\":\\\"Size\\\",\\\"variants\\\":[{\\\"label\\\":\\\"Standard\\\",\\\"price\\\":\\\"210.00\\\",\\\"available\\\":true}],\\\"collections\\\":[\\\"carry\\\"],\\\"tags\\\":[{\\\"name\\\":\\\"Everyday\\\",\\\"slug\\\":\\\"everyday\\\"},{\\\"name\\\":\\\"Gift idea\\\",\\\"slug\\\":\\\"gift-idea\\\"}]},{\\\"slug\\\":\\\"field-bottle\\\",\\\"image\\\":\\\"field-bottle.jpg\\\",\\\"title\\\":\\\"Field bottle\\\",\\\"type\\\":\\\"Bottle\\\",\\\"description\\\":\\\"A brushed steel bottle sized for a bag side pocket.\\\",\\\"alt\\\":\\\"Fictional Morrowfield brushed steel bottle\\\",\\\"option\\\":\\\"Capacity\\\",\\\"variants\\\":[{\\\"label\\\":\\\"500 ml\\\",\\\"price\\\":\\\"32.00\\\",\\\"available\\\":true},{\\\"label\\\":\\\"750 ml\\\",\\\"price\\\":\\\"38.00\\\",\\\"available\\\":true}],\\\"collections\\\":[\\\"travel-essentials\\\"],\\\"tags\\\":[{\\\"name\\\":\\\"Travel\\\",\\\"slug\\\":\\\"travel\\\"}]},{\\\"slug\\\":\\\"organizer-pouch\\\",\\\"image\\\":\\\"organizer-pouch.jpg\\\",\\\"title\\\":\\\"Organizer pouch\\\",\\\"type\\\":\\\"Pouch\\\",\\\"description\\\":\\\"A padded pouch with a strap for cables, chargers and small tools.\\\",\\\"alt\\\":\\\"Fictional Morrowfield rust organizer pouch\\\",\\\"option\\\":\\\"Colour\\\",\\\"variants\\\":[{\\\"label\\\":\\\"Rust\\\",\\\"price\\\":\\\"38.00\\\",\\\"available\\\":true},{\\\"label\\\":\\\"Sand\\\",\\\"price\\\":\\\"38.00\\\",\\\"available\\\":true}],\\\"collections\\\":[\\\"travel-essentials\\\"],\\\"tags\\\":[{\\\"name\\\":\\\"Travel\\\",\\\"slug\\\":\\\"travel\\\"},{\\\"name\\\":\\\"Everyday\\\",\\\"slug\\\":\\\"everyday\\\"}]},{\\\"slug\\\":\\\"packable-sling\\\",\\\"image\\\":\\\"packable-sling.jpg\\\",\\\"title\\\":\\\"Packable sling\\\",\\\"type\\\":\\\"Bag\\\",\\\"description\\\":\\\"A light sling that folds into its own zipped pocket.\\\",\\\"alt\\\":\\\"Fictional Morrowfield sand packable sling, folded\\\",\\\"option\\\":\\\"Colour\\\",\\\"variants\\\":[{\\\"label\\\":\\\"Sand\\\",\\\"price\\\":\\\"44.00\\\",\\\"available\\\":true}],\\\"collections\\\":[\\\"travel-essentials\\\"],\\\"tags\\\":[{\\\"name\\\":\\\"Travel\\\",\\\"slug\\\":\\\"travel\\\"}]}],\\\"pages\\\":[{\\\"slug\\\":\\\"morrowfield-catalog\\\",\\\"title\\\":\\\"Morrowfield catalog\\\",\\\"content\\\":\\\"<!-- wp:group {\\\\\\\"align\\\\\\\":\\\\\\\"wide\\\\\\\",\\\\\\\"layout\\\\\\\":{\\\\\\\"type\\\\\\\":\\\\\\\"default\\\\\\\"}} --><div class=\\\\\\\"wp-block-group alignwide\\\\\\\"><!-- wp:paragraph --><p>Demonstration catalog with fictional Morrowfield products. No Shopify connection or payment is shown.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:shortcode -->[fy2press_product_search]<!-- \\\/wp:shortcode --><!-- wp:shortcode -->[fy2press_collection_filter behavior=\\\\\\\"query\\\\\\\"]<!-- \\\/wp:shortcode --><!-- wp:shortcode -->[fy2press_collection_sort]<!-- \\\/wp:shortcode --><!-- wp:shortcode -->[fy2press_products_loop limit=\\\\\\\"12\\\\\\\" columns=\\\\\\\"3\\\\\\\"]<!-- \\\/wp:shortcode --><\\\/div><!-- \\\/wp:group -->\\\"},{\\\"slug\\\":\\\"commuter-buying-guide\\\",\\\"title\\\":\\\"How to pack for a work week on the move\\\",\\\"content\\\":\\\"<!-- wp:group {\\\\\\\"align\\\\\\\":\\\\\\\"wide\\\\\\\",\\\\\\\"layout\\\\\\\":{\\\\\\\"type\\\\\\\":\\\\\\\"default\\\\\\\"}} --><div class=\\\\\\\"wp-block-group alignwide\\\\\\\"><!-- wp:paragraph --><p>A short buying guide written in WordPress. The products below come from the fictional Morrowfield demo catalog; no Shopify connection or payment is shown.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:heading --><h2 class=\\\\\\\"wp-block-heading\\\\\\\">Start with one bag<\\\/h2><!-- \\\/wp:heading --><!-- wp:paragraph --><p>A 24-litre backpack holds a laptop, a change of clothes and lunch without looking like luggage.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:heading --><h2 class=\\\\\\\"wp-block-heading\\\\\\\">Then keep small things together<\\\/h2><!-- \\\/wp:heading --><!-- wp:paragraph --><p>A pouch for cables and a bottle for the side pocket make the difference on long days.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:shortcode -->[fy2press_products_loop collection=\\\\\\\"travel-essentials\\\\\\\" limit=\\\\\\\"3\\\\\\\" columns=\\\\\\\"3\\\\\\\"]<!-- \\\/wp:shortcode --><\\\/div><!-- \\\/wp:group -->\\\"}]}\\nJSON, true, 512, JSON_THROW_ON_ERROR);\\n\\nfunction fy2press_demo_reset(): array\\n{\\n    $removed = ['posts' => 0, 'terms' => 0];\\n    foreach (get_posts(['post_type' => ['shopipress_product', 'page'], 'post_status' => 'any', 'numberposts' => -1, 'fields' => 'ids', 'meta_key' => '_fy2press_demo_marker', 'meta_value' => FY2PRESS_DEMO_MARKER]) as $id) {\\n        wp_delete_post((int) $id, true);\\n        $removed['posts']++;\\n    }\\n    foreach (['shopipress_collections', 'shopipress_tags'] as $taxonomy) {\\n        $terms = get_terms(['taxonomy' => $taxonomy, 'hide_empty' => false, 'meta_key' => '_fy2press_demo_marker', 'meta_value' => FY2PRESS_DEMO_MARKER]);\\n        foreach (is_wp_error($terms) ? [] : $terms as $term) {\\n            wp_delete_term((int) $term->term_id, $taxonomy);\\n            $removed['terms']++;\\n        }\\n    }\\n    return $removed;\\n}\\n\\nfunction fy2press_demo_term(string $taxonomy, string $name, string $slug, string $description = ''): int\\n{\\n    $existing = term_exists($slug, $taxonomy);\\n    $term = $existing ?: wp_insert_term($name, $taxonomy, ['slug' => $slug, 'description' => $description]);\\n    if (is_wp_error($term)) {\\n        throw new RuntimeException($term->get_error_code());\\n    }\\n    $id = (int) $term['term_id'];\\n    wp_update_term($id, $taxonomy, ['name' => $name, 'description' => $description]);\\n    update_term_meta($id, '_fy2press_demo_marker', FY2PRESS_DEMO_MARKER);\\n    return $id;\\n}\\n\\nforeach ($copy['products'] as $product) {\\n    $file = FY2PRESS_DEMO_DIR . '\\\/' . $product['image'];\\n    if (!is_file($file) || !is_array(@getimagesize($file))) {\\n        throw new RuntimeException('Missing demo image ' . $product['image']);\\n    }\\n}\\n\\n$removed = fy2press_demo_reset();\\n\\nupdate_option('shopipress_country_code', 'CA');\\nupdate_option('shopipress_shop_currency', 'CAD');\\nupdate_option('shopipress_cache_enabled', true);\\nupdate_option('shopipress_cache_duration', 86400);\\n\\n$collections = [];\\nforeach ($copy['collections'] as $collection) {\\n    $collections[$collection['slug']] = fy2press_demo_term('shopipress_collections', $collection['name'], $collection['slug'], $collection['description']);\\n}\\n\\n$created = [];\\nforeach ($copy['products'] as $index => $product) {\\n    $id = wp_insert_post([\\n        'post_type' => 'shopipress_product',\\n        'post_status' => 'publish',\\n        'post_name' => $product['slug'],\\n        'post_title' => $product['title'],\\n        'post_content' => '<p>' . esc_html($product['description']) . '<\\\/p>',\\n        'post_date' => gmdate('Y-m-d H:i:s', strtotime('2026-10-12 12:00:00') + $index * 60),\\n    ], true);\\n    if (is_wp_error($id)) {\\n        throw new RuntimeException($id->get_error_code());\\n    }\\n    $sid = (string) (9500000000 + $index + 1);\\n    $image = ['url' => content_url('uploads\\\/fy2press-demo\\\/' . $product['image']), 'alt' => $product['alt']];\\n    $variants = [];\\n    foreach ($product['variants'] as $offset => $variant) {\\n        $variants[] = [\\n            'id' => 'gid:\\\/\\\/shopify\\\/ProductVariant\\\/' . ($sid . sprintf('%02d', $offset)),\\n            'title' => $variant['label'],\\n            'price' => ['amount' => $variant['price'], 'currency' => 'CAD', 'currencyCode' => 'CAD'],\\n            'available_for_sale' => $variant['available'],\\n            'availableForSale' => $variant['available'],\\n            'selectedOptions' => [['name' => $product['option'], 'value' => $variant['label']]],\\n        ];\\n    }\\n    $prices = array_map(static fn(array $variant): float => (float) $variant['price'], $product['variants']);\\n    $min = number_format(min($prices), 2, '.', '');\\n    $max = number_format(max($prices), 2, '.', '');\\n    $data = [\\n        'id' => 'gid:\\\/\\\/shopify\\\/Product\\\/' . $sid,\\n        'title' => $product['title'],\\n        'handle' => $product['slug'],\\n        'vendor' => 'Morrowfield',\\n        'productType' => $product['type'],\\n        'tags' => array_column($product['tags'], 'name'),\\n        'updated_at' => '2026-10-12T12:00:00Z',\\n        'descriptionHtml' => '<p>' . esc_html($product['description']) . '<\\\/p>',\\n        'images' => [$image],\\n        'featured_image' => $image,\\n        'market_context' => 'primary',\\n        'available_for_sale' => in_array(true, array_column($product['variants'], 'available'), true),\\n        'variants_complete' => true,\\n        'variants_has_next_page' => false,\\n        'variants' => $variants,\\n        'price_range' => ['min' => ['amount' => $min, 'currency' => 'CAD'], 'max' => ['amount' => $max, 'currency' => 'CAD']],\\n    ];\\n    update_post_meta($id, '_fy2press_demo_marker', FY2PRESS_DEMO_MARKER);\\n    update_post_meta($id, '_shopipress_shopify_featured_image', $image['url']);\\n    update_post_meta($id, '_shopipress_shopify_featured_image_alt', $image['alt']);\\n    update_post_meta($id, '_shopipress_shopify_id', $sid);\\n    update_post_meta($id, '_shopipress_shopify_handle', $product['slug']);\\n    update_post_meta($id, ProductSyncSnapshot::META_SNAPSHOT, wp_slash(wp_json_encode($data)));\\n    update_post_meta($id, ProductSyncSnapshot::META_PRICE, $min);\\n    update_post_meta($id, ProductSyncSnapshot::META_AVAILABLE_FOR_SALE, $data['available_for_sale'] ? '1' : '0');\\n    wp_set_object_terms($id, array_map(static fn(string $slug): int => $collections[$slug], $product['collections']), 'shopipress_collections');\\n    $tagIds = [];\\n    foreach ($product['tags'] as $tag) {\\n        $tagIds[] = fy2press_demo_term('shopipress_tags', $tag['name'], $tag['slug']);\\n    }\\n    wp_set_object_terms($id, $tagIds, 'shopipress_tags');\\n    (new CacheService())->cache_product($sid, 'CA', $data, 'full', $id);\\n    $created[$product['slug']] = (int) $id;\\n}\\n\\n$pages = [];\\nforeach ($copy['pages'] as $page) {\\n    $content = str_replace(array_map(static fn(string $slug): string => '{id:' . $slug . '}', array_keys($created)), array_values($created), $page['content']);\\n    $pageId = wp_insert_post(['post_type' => 'page', 'post_status' => 'publish', 'post_name' => $page['slug'], 'post_title' => $page['title'], 'post_content' => $content], true);\\n    if (is_wp_error($pageId)) {\\n        throw new RuntimeException($pageId->get_error_code());\\n    }\\n    update_post_meta($pageId, '_fy2press_demo_marker', FY2PRESS_DEMO_MARKER);\\n    $pages[$page['slug']] = get_permalink($pageId);\\n}\\nflush_rewrite_rules(true);\\n\\necho wp_json_encode([\\n    'marker' => FY2PRESS_DEMO_MARKER,\\n    'removed_before' => $removed,\\n    'products' => $created,\\n    'collections' => $collections,\\n    'pages' => $pages,\\n    'wp' => get_bloginfo('version'),\\n    'php' => PHP_VERSION,\\n    'scope' => 'Fictional catalog stored in WordPress records and rendered by Fy2Press FREE; no Shopify transport, licence or order',\\n], JSON_UNESCAPED_SLASHES);\\n\"}]}"}},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3742640,"resolution":"1","location":"assets","locale":"","width":1440,"height":1543},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3742640,"resolution":"2","location":"assets","locale":"","width":1200,"height":640},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3742640,"resolution":"3","location":"assets","locale":"","width":1440,"height":1146},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3742640,"resolution":"4","location":"assets","locale":"","width":1440,"height":1000},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3742640,"resolution":"5","location":"assets","locale":"","width":1440,"height":1000},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3742640,"resolution":"6","location":"assets","locale":"","width":1440,"height":1000}},"screenshots":{"1":"Browse a WordPress catalog page with search, collection filter and sorting. Fictional Morrowfield demo products; no live Shopify sync shown.","2":"Select a product variant in your WordPress theme. Fictional demo product; checkout is not shown.","3":"Show catalog products inside a WordPress buying guide. Fictional demo data.","4":"Adjust the catalog design with the FREE Design controls and live preview.","5":"Add catalog components with the block editor or shortcodes.","6":"Choose the main product page and which catalog pages may be indexed. No ranking is claimed."}},"plugin_section":[],"plugin_tags":[282,11751,186,23548,11577],"plugin_category":[45,55],"plugin_contributors":[176401],"plugin_business_model":[],"class_list":["post-368581","plugin","type-plugin","status-publish","hentry","plugin_tags-ecommerce","plugin_tags-product-catalog","plugin_tags-seo","plugin_tags-shopify","plugin_tags-storefront","plugin_category-ecommerce","plugin_category-seo-and-marketing","plugin_contributors-pagup","plugin_committers-pagup"],"banners":{"banner":"https:\/\/ps.w.org\/fy2press\/assets\/banner-772x250.png?rev=3741940","banner_2x":"https:\/\/ps.w.org\/fy2press\/assets\/banner-1544x500.png?rev=3741940","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/fy2press\/assets\/icon.svg?rev=3741940","icon":"https:\/\/ps.w.org\/fy2press\/assets\/icon.svg?rev=3741940","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/fy2press\/assets\/screenshot-1.png?rev=3742640","caption":"Browse a WordPress catalog page with search, collection filter and sorting. Fictional Morrowfield demo products; no live Shopify sync shown."},{"src":"https:\/\/ps.w.org\/fy2press\/assets\/screenshot-2.png?rev=3742640","caption":"Select a product variant in your WordPress theme. Fictional demo product; checkout is not shown."},{"src":"https:\/\/ps.w.org\/fy2press\/assets\/screenshot-3.png?rev=3742640","caption":"Show catalog products inside a WordPress buying guide. Fictional demo data."},{"src":"https:\/\/ps.w.org\/fy2press\/assets\/screenshot-4.png?rev=3742640","caption":"Adjust the catalog design with the FREE Design controls and live preview."},{"src":"https:\/\/ps.w.org\/fy2press\/assets\/screenshot-5.png?rev=3742640","caption":"Add catalog components with the block editor or shortcodes."},{"src":"https:\/\/ps.w.org\/fy2press\/assets\/screenshot-6.png?rev=3742640","caption":"Choose the main product page and which catalog pages may be indexed. No ranking is claimed."}],"raw_content":"<!--section=description-->\n<p><strong>Your Shopify products, in the WordPress content your visitors already read.<\/strong><\/p>\n\n<p>Fy2Press brings your Shopify catalog into WordPress product pages, collections and buying guides. Keep product management and checkout in Shopify, without installing WooCommerce.<\/p>\n\n<h4>What you can do with FREE<\/h4>\n\n<ul>\n<li>Publish products, collections and tags as WordPress catalog content.<\/li>\n<li>Place catalog components with 17 Gutenberg blocks and 27 shortcodes.<\/li>\n<li>Customize one product design and one collection design with the included Design controls.<\/li>\n<li>Help visitors browse with search, filters, sorting and pagination.<\/li>\n<li>Display cart components in WordPress and continue to Shopify for payment.<\/li>\n<li>Choose catalog indexing settings and a preferred product URL on WordPress or Shopify, with structured product information from the available data.<\/li>\n<\/ul>\n\n<p>FREE works without a paid Fy2Press license. You need an existing Shopify store, its subscription and a WordPress site. <strong>Synchronization is manual:<\/strong> run it when you want to refresh saved catalog records. Cached prices or availability may be outdated. SEO controls do not guarantee indexing, rankings or rich results.<\/p>\n\n<h4>Is this the right approach for you?<\/h4>\n\n<p>Use Fy2Press when you want a WordPress catalog alongside articles, guides and business pages. If you only need a purchase button for one product, a simple embedded Shopify option may be enough. Fy2Press does not replace Shopify or migrate your orders into WordPress.<\/p>\n\n<h4>About PRO<\/h4>\n\n<p>PRO is a separate paid edition. Schedule catalog updates hourly, twice daily or daily through WordPress cron with an active license. Build pages with native Elementor and WPBakery components, use multiple templates, and adapt presentation with device-specific settings and custom CSS. WordPress must execute scheduled events; scheduling is not a real-time webhook service. This download contains FREE only.<\/p>\n\n<p><a href=\"https:\/\/fy2press.com\/product\/#pricing\">Compare PRO features and prices<\/a> or <a href=\"https:\/\/fy2press.com\/support\/\">ask a question<\/a>.<\/p>\n\n<h4>Plan your WordPress and Shopify project<\/h4>\n\n<p>Agencies and developers can use the <a href=\"https:\/\/github.com\/GautierDorval\/fy2press\">public Fy2Press reference<\/a> to plan a catalog, check SEO decisions and adapt reusable client handover templates. Available in English and Canadian French.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/GautierDorval\/fy2press\/blob\/main\/docs\/seo-decision-matrix.md\">Choose which URLs should appear in search<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/GautierDorval\/fy2press\/blob\/main\/docs\/data-ownership-and-freshness.md\">Understand how catalog data, prices and caches are refreshed<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/GautierDorval\/fy2press\/blob\/main\/developer\/README.md\">Build pages with blocks and shortcodes<\/a>.<\/li>\n<\/ul>\n\n<p>This GitHub repository contains documentation. Install the plugin from this WordPress.org page.<\/p>\n\n<h4>Start with one useful page<\/h4>\n\n<p>Install Fy2Press, connect the store using a public Storefront API token, discover the catalog and start manual synchronization. New product pages are published directly: prepare their visibility first. Then check a product and use the included tools to present it in WordPress.<\/p>\n\n<p><a href=\"https:\/\/fy2press.com\/docs\/installation\/\">Installation guide<\/a> | <a href=\"https:\/\/fy2press.com\/docs\/connect-shopify\/\">Connect Shopify<\/a> | <a href=\"https:\/\/fy2press.com\/support\/\">Support<\/a><\/p>\n\n<p>Fy2Press support is provided by PAGUP through <a href=\"https:\/\/fy2press.com\/support\/\">the support channel<\/a> and support@better-robots.com. Send product questions and bugs there; use the public repository for documentation corrections. For a confidential security report, include the affected version and a general description without posting exploit instructions or secrets publicly.<\/p>\n\n<p>Made by <a href=\"https:\/\/pagup.com\/\">Pagup<\/a>. Fy2Press is independent and is not affiliated with, endorsed by or sponsored by Shopify or WordPress.<\/p>\n\n<h3>External services<\/h3>\n\n<p>After configuration, Fy2Press sends HTTPS catalog\/cart requests to the store's <code>*.myshopify.com<\/code> Storefront API with its public Storefront API token, product\/variant IDs, quantities and storefront context. Shopify handles checkout.<\/p>\n\n<p>Product images keep the URLs returned by Shopify; visitors' browsers load them from those locations on catalog pages.<\/p>\n\n<p>Standard cart buttons collect no buyer email or phone; an integration may supply them to the cart-creation endpoint, and Fy2Press forwards them to Shopify as buyer identity only, never as telemetry or browser storage.<\/p>\n\n<p>Cookies: <code>fy2press_cart_<\/code> encrypts cart references (HttpOnly); script-readable <code>fy2press_has_cart_<\/code> holds <code>1<\/code> to skip idle requests, with no ID, secret or authority. Both last seven days (SameSite=Lax, Secure on HTTPS). Shopify stores carts. Legacy <code>shopipress_cart_id<\/code> localStorage is migrated and removed. Checkout URLs require a checkout request. Prices use the primary Shopify market and returned currency.<\/p>\n\n<p>Cart and design assets load with rendered Fy2Press content, including blocks and templates. The <code>shopipress_global_cart<\/code> filter enables site-wide cart access and assets.<\/p>\n\n<p>Shopify handles this data under its <a href=\"https:\/\/www.shopify.com\/legal\/terms\">Terms of Service<\/a> and <a href=\"https:\/\/www.shopify.com\/legal\/privacy\">Privacy Policy<\/a>. Fy2Press does not send usage telemetry or licensing requests to Pagup.<\/p>\n\n<p>The Freemius WordPress SDK provides optional usage opt-in and PRO licensing, trials, secure downloads and updates. Opt-in or commercial flows send the site URL, WordPress\/PHP\/plugin versions, administrator account information and necessary licence\/diagnostic data. The FREE functionality remains available when opt-in is skipped. See Freemius <a href=\"https:\/\/freemius.com\/terms\/\">Terms<\/a> and <a href=\"https:\/\/freemius.com\/privacy\/\">Privacy Policy<\/a>.<\/p>\n\n<p>Links to documentation and support at <code>https:\/\/fy2press.com<\/code> are ordinary external navigations initiated by the administrator. Fy2Press does not fetch documentation, fonts, scripts or styles there, or ping links. See <a href=\"https:\/\/fy2press.com\/privacy\/\">privacy<\/a> and <a href=\"https:\/\/fy2press.com\/security\/\">security<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In WordPress, open <strong>Plugins &gt; Add New Plugin<\/strong>, search for <strong>Fy2Press<\/strong>, then install and activate <strong>Fy2Press Catalog for Shopify<\/strong> by Pagup. Alternatively, upload the ZIP from this page.<\/li>\n<li>Open Fy2Press and enter the store subdomain and <strong>public Storefront API token<\/strong>. Do not use an Admin API token or a private Storefront token.<\/li>\n<li>Select <strong>Test Connection<\/strong>. Confirm the intended store, then save.<\/li>\n<li>Open <strong>Products<\/strong>, discover the catalog and review the result before synchronization. Prepare visibility first: new product pages are published directly.<\/li>\n<li>Open <strong>Design<\/strong> to adjust the included presentation. Use <strong>Add to my pages<\/strong> or <strong>Help<\/strong> for actual block and shortcode examples.<\/li>\n<li>Check a product page, its variants and the Shopify path before sharing the catalog.<\/li>\n<\/ol>\n\n<p>Use a staging site when changing an existing catalog. Follow the <a href=\"https:\/\/fy2press.com\/docs\/\">setup guides<\/a> for current steps and troubleshooting.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20fy2press%20free%3F\"><h3>Is Fy2Press free?<\/h3><\/dt>\n<dd><p>Yes. FREE is available without a paid Fy2Press license, including when optional Freemius usage opt-in is skipped. Shopify and WordPress hosting are separate services.<\/p><\/dd>\n<dt id=\"do%20i%20need%20woocommerce%20or%20a%20developer%3F\"><h3>Do I need WooCommerce or a developer?<\/h3><\/dt>\n<dd><p>WooCommerce is not required. Use the included blocks and Design controls for a basic catalog without writing code. The Shopify connection must still be configured, and theme-specific adjustments may need technical help.<\/p><\/dd>\n<dt id=\"has%20fy2press%20been%20tested%20with%20shopify%3F\"><h3>Has Fy2Press been tested with Shopify?<\/h3><\/dt>\n<dd><p>Yes. Fy2Press has been tested with a real Shopify store. The guides explain the configuration and settings to adapt to your WordPress site and catalog.<\/p><\/dd>\n<dt id=\"is%20synchronization%20automatic%3F\"><h3>Is synchronization automatic?<\/h3><\/dt>\n<dd><p>In FREE, you start synchronization manually. PRO adds scheduled synchronization at the intervals described above. Stored catalog records, component requests and page caches have separate refresh paths. After editing Shopify data, synchronize the saved records and refresh the relevant page cache when needed. <a href=\"https:\/\/github.com\/GautierDorval\/fy2press\/blob\/main\/docs\/data-ownership-and-freshness.md\">Understand how the data is refreshed<\/a>.<\/p><\/dd>\n<dt id=\"can%20synchronization%20overwrite%20my%20changes%3F\"><h3>Can synchronization overwrite my changes?<\/h3><\/dt>\n<dd><p>Shopify remains the source of synchronized fields, and later synchronization can reapply titles and slugs. Existing WordPress post content is preserved by the documented behavior, but check that your template displays it. New product pages are published directly rather than saved automatically as drafts.<\/p><\/dd>\n<dt id=\"what%20do%20the%20seo%20controls%20do%3F\"><h3>What do the SEO controls do?<\/h3><\/dt>\n<dd><p>Choose indexing settings for products, collections and tags and a preferred product URL on WordPress or Shopify. Structured data describes available product information. These are publishing controls, not guarantees of rankings, traffic or rich results. Use the <a href=\"https:\/\/github.com\/GautierDorval\/fy2press\/blob\/main\/docs\/seo-decision-matrix.md\">SEO decision matrix<\/a> to choose the right approach for each page.<\/p><\/dd>\n<dt id=\"can%20i%20use%20elementor%20or%20wpbakery%3F\"><h3>Can I use Elementor or WPBakery?<\/h3><\/dt>\n<dd><p>FREE provides WordPress blocks and shortcodes. Native Elementor and WPBakery components belong to the separate paid PRO edition. The builders themselves are separate products. Check your specific theme and layout.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20my%20pro%20license%20is%20no%20longer%20active%3F\"><h3>What happens if my PRO license is no longer active?<\/h3><\/dt>\n<dd><p>Scheduled synchronization returns to manual and FREE features remain available. Check the documentation first if your pages use premium templates or builders.<\/p><\/dd>\n<dt id=\"is%20there%20a%20catalog-size%20limit%3F\"><h3>Is there a catalog-size limit?<\/h3><\/dt>\n<dd><p>No universal capacity is guaranteed. Hosting memory and cache limits can constrain large catalogs. Test a representative catalog on staging before a large rollout; incomplete discovery does not replace the last accepted snapshot.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20use%20cookies%20or%20external%20services%3F\"><h3>Does the plugin use cookies or external services?<\/h3><\/dt>\n<dd><p>Yes. Cart cookies and the Shopify and Freemius services are described below. Include the relevant information in your privacy notice. Behind a proxy or CDN, list trusted addresses with the <code>shopipress_rate_limit_trusted_proxies<\/code> filter; only they may supply <code>CF-Connecting-IP<\/code> or <code>X-Real-IP<\/code>.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20delete%20the%20plugin%3F\"><h3>What happens when I delete the plugin?<\/h3><\/dt>\n<dd><p>With <strong>Delete Settings on Uninstall<\/strong> enabled, administrator deactivation and deletion remove settings and caches, not synchronized content. The documented WP-CLI command is <code>wp plugin uninstall fy2press --deactivate --user=&lt;administrator&gt;<\/code>.<\/p><\/dd>\n<dt id=\"where%20are%20the%20build%20instructions%3F\"><h3>Where are the build instructions?<\/h3><\/dt>\n<dd><p>Source code and build tools remain in the plugin download. Developers can read <a href=\"https:\/\/plugins.svn.wordpress.org\/fy2press\/trunk\/BUILDING.md\">BUILDING.md<\/a>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Connect a Shopify store with a public Storefront token and manually synchronize products, collections and tags. Catalog discovery resumes in batches; interrupted writes do not resume automatically.<\/li>\n<li>Publish using 17 blocks, 27 shortcodes, included designs and catalog SEO controls.<\/li>\n<li>Present the cart in WordPress with Shopify cart services and checkout; administration available in nine locales.<\/li>\n<\/ul>","raw_excerpt":"Display your Shopify products on WordPress with catalog pages, blocks and SEO controls. Keep checkout on Shopify. No WooCommerce required.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/368581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=368581"}],"author":[{"embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/pagup"}],"wp:attachment":[{"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=368581"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=368581"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=368581"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=368581"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=368581"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=368581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}