{"id":351770,"date":"2026-08-23T01:08:47","date_gmt":"2026-08-23T01:08:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/fangtao-md-io\/"},"modified":"2026-08-23T01:08:22","modified_gmt":"2026-08-23T01:08:22","slug":"fangtao-md-io","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/fangtao-md-io\/","author":23545644,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.9.20","stable_tag":"1.9.20","tested":"7.0.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Fangtao MD IO","header_author":"Fangtao","header_description":"Import and export Markdown documents, ZIP archives, and local media assets.","assets_banners_color":"589ce0","last_updated":"2026-08-23 01:08:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":47,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.9.20":{"tag":"1.9.20","author":"fxy5750","date":"2026-08-23 01:08:22"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-256x256.jpg":{"filename":"icon-256x256.jpg","revision":3661289,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3661295,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3661299,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.9.20"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3661289,"resolution":"1","location":"assets","locale":"","width":1787,"height":937},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3661289,"resolution":"2","location":"assets","locale":"","width":1787,"height":937},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3661289,"resolution":"3","location":"assets","locale":"","width":1787,"height":937}},"screenshots":[]},"plugin_section":[],"plugin_tags":[1859,87,4608,84,4155],"plugin_category":[50,59],"plugin_contributors":[277030],"plugin_business_model":[],"class_list":["post-351770","plugin","type-plugin","status-publish","hentry","plugin_tags-export","plugin_tags-import","plugin_tags-markdown","plugin_tags-media","plugin_tags-migration","plugin_category-media","plugin_category-utilities-and-tools","plugin_contributors-fxy5750","plugin_committers-fxy5750"],"banners":{"banner":"https:\/\/ps.w.org\/fangtao-md-io\/assets\/banner-772x250.jpg?rev=3661299","banner_2x":"https:\/\/ps.w.org\/fangtao-md-io\/assets\/banner-1544x500.jpg?rev=3661295","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/fangtao-md-io\/assets\/icon-256x256.jpg?rev=3661289","icon_2x":"https:\/\/ps.w.org\/fangtao-md-io\/assets\/icon-256x256.jpg?rev=3661289","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/fangtao-md-io\/assets\/screenshot-1.png?rev=3661289","caption":""},{"src":"https:\/\/ps.w.org\/fangtao-md-io\/assets\/screenshot-2.png?rev=3661289","caption":""},{"src":"https:\/\/ps.w.org\/fangtao-md-io\/assets\/screenshot-3.png?rev=3661289","caption":""}],"raw_content":"<!--section=description-->\n<p>Fangtao MD IO provides a focused workflow for moving content between Markdown files and WordPress.<\/p>\n\n<h4>Import<\/h4>\n\n<ul>\n<li>Supported Markdown file extensions (case-insensitive): .md, .markdown, .mdown, .mkdn, .mkd, .mdwn, .mdtxt, .mdtext, .\u6587\u672c, and .txt.<\/li>\n<li>Select multiple Markdown files and ZIP archives in one import batch.<\/li>\n<li>Queue multiple selected files in the browser and import them one at a time, with per-file status feedback.<\/li>\n<li>ZIP archives without a supported Markdown document are skipped without importing their assets.<\/li>\n<li>Select safe image, video, audio, and PDF extensions allowed inside ZIP imports.<\/li>\n<li>Add referenced local assets to the WordPress Media Library.<\/li>\n<li>Configure ZIP, extracted-content, Markdown, asset, and entry-count limits, following PHP limits by default.<\/li>\n<li>Use each Markdown file's ZIP modification time by default, or set an exact manual publication date and time.<\/li>\n<li>When importing multiple ZIP files without a manual publication date, preserve each Markdown document's own ZIP modification time.<\/li>\n<li>Select the destination post type, post status, private visibility, or an optional password.<\/li>\n<li>Assign imported standard posts to an optional category.<\/li>\n<li>Configure the default post status used by the import form.<\/li>\n<li>Choose from five Markdown parsers covering Traditional, GitHub, and Extra syntax flavors.<\/li>\n<li>Configure the default parser while retaining a per-import override.<\/li>\n<li>Optionally import remote HTTP(S) images through WordPress safe HTTP handling.<\/li>\n<li>Optionally remove JPEG XMP metadata from temporary import copies while preserving EXIF and source ZIP files.<\/li>\n<li>Import Front Matter titles, slugs, permalinks, excerpts, dates, statuses, passwords, categories, tags, and featured images.<\/li>\n<li>Export an administrator-only JSON diagnostic report from Advanced after a failed import. The report excludes passwords, credentials, content, site URLs, and absolute paths.<\/li>\n<\/ul>\n\n<h4>Export<\/h4>\n\n<ul>\n<li>Export an individual post from its row action.<\/li>\n<li>Export selected posts with WordPress bulk actions.<\/li>\n<li>Export all matching content by post type, category, and tag.<\/li>\n<li>Select any supported Markdown text extension for exported documents.<\/li>\n<li>Convert common WordPress HTML and block content to GitHub Flavored Markdown.<\/li>\n<li>Package local Media Library images inside <code>images<\/code> and linked media assets inside <code>media<\/code>.<\/li>\n<li>Use relative asset references in exported Markdown.<\/li>\n<li>Include title, slug, permalink, excerpt, date, post type, status, categories, tags, and featured image Front Matter.<\/li>\n<\/ul>\n\n<h4>ZIP Structure<\/h4>\n\n<p>Single export:<\/p>\n\n<pre><code>article.md\nimages\/\n  article-image.jpg\nmedia\/\n  room-tour.mp4\n  catalog.pdf\n<\/code><\/pre>\n\n<p>Bulk exports place every item in a separate directory with the same internal structure.<\/p>\n\n<p>For complete English documentation, see <code>README.md<\/code>.\nFor Simplified Chinese documentation, see <code>docs\/README.zh-CN.md<\/code>.<\/p>\n\n<p>Parsedown, Parsedown Extra, and cebe\/markdown are bundled under the MIT License.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>fangtao-md-io<\/code> directory to <code>\/wp-content\/plugins\/<\/code>, or install the plugin ZIP from the WordPress Dashboard.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Open the <strong>Markdown<\/strong> menu in the WordPress Dashboard.<\/li>\n<li>Use <strong>Markdown Import<\/strong> or <strong>Markdown Export<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20are%20the%20server%20requirements%3F\"><h3>What are the server requirements?<\/h3><\/dt>\n<dd><p>The plugin requires WordPress 6.0 or later and PHP 7.4 or later. ZIP import and export fall back to the PclZip library bundled with WordPress when the PHP ZIP extension is unavailable. The PclZip fallback requires PHP zlib. Markdown conversion uses a bundled compatibility layer when native PHP mbstring is unavailable. HTML-to-Markdown export requires the PHP DOM extension.<\/p><\/dd>\n<dt id=\"how%20should%20i%20package%20local%20assets%3F\"><h3>How should I package local assets?<\/h3><\/dt>\n<dd><p>Place Markdown and asset files in the same ZIP while preserving their relative paths:<\/p>\n\n<pre><code>articles\/\n  living-room.md\n  images\/\n    living-room.jpg\n  media\/\n    room-tour.mp4\n    catalog.pdf\n<\/code><\/pre>\n\n<p>Reference the assets in Markdown as:<\/p>\n\n<pre><code>![Living room](images\/living-room.jpg)\n[video src=\"media\/room-tour.mp4\"]\n[Download catalog](media\/catalog.pdf)\n<\/code><\/pre>\n\n<p>Only referenced assets are imported. Administrators can choose the allowed safe image, video, audio, and PDF extensions under <strong>Import Settings<\/strong>.<\/p><\/dd>\n<dt id=\"which%20front%20matter%20fields%20are%20supported%20during%20import%3F\"><h3>Which Front Matter fields are supported during import?<\/h3><\/dt>\n<dd><p>The importer supports single-line <code>title<\/code>, <code>slug<\/code>, <code>permalink<\/code>, <code>excerpt<\/code>, <code>date<\/code>, <code>status<\/code>, <code>password<\/code>, <code>categories<\/code>, <code>tags<\/code>, <code>featured_image<\/code>, and <code>featured_image_id<\/code> values. <code>description<\/code>, <code>category<\/code>, <code>tag<\/code>, <code>cover<\/code>, and <code>image<\/code> are accepted aliases. Complex or nested YAML values are not supported.<\/p>\n\n<p>Private posts and password-protected posts are separate WordPress visibility modes and cannot be combined.<\/p><\/dd>\n<dt id=\"are%20remote%20images%20downloaded%3F\"><h3>Are remote images downloaded?<\/h3><\/dt>\n<dd><p>Not by default. Administrators can enable remote image importing under <strong>Import Settings<\/strong>. Downloads use WordPress safe HTTP handling and the Media Library pipeline.<\/p><\/dd>\n<dt id=\"why%20was%20an%20imported%20image%20stored%20locally%20instead%20of%20oss%3F\"><h3>Why was an imported image stored locally instead of OSS?<\/h3><\/dt>\n<dd><p>When a detected OSS integration is enabled but has incomplete bucket and credential or role settings, the importer uses normal WordPress local media storage to prevent fatal upload failures. Complete the OSS configuration to restore its normal processing.<\/p><\/dd>\n<dt id=\"does%20import%20overwrite%20existing%20posts%3F\"><h3>Does import overwrite existing posts?<\/h3><\/dt>\n<dd><p>No. Every Markdown document creates a new WordPress content item.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.9.20<\/h4>\n\n<ul>\n<li>Added an optional JPEG XMP compatibility setting for servers without the PHP DOM extension.<\/li>\n<\/ul>\n\n<h4>1.9.19<\/h4>\n\n<ul>\n<li>Added an administrator-only JSON diagnostic export with privacy redaction and richer import failure context.<\/li>\n<\/ul>\n\n<h4>1.9.18<\/h4>\n\n<ul>\n<li>Preserve sanitized HTML tables while Markdown parsers remain in safe mode.<\/li>\n<li>Stop and roll back a document import when a referenced image cannot be added to the Media Library.<\/li>\n<\/ul>\n\n<h4>1.9.17<\/h4>\n\n<ul>\n<li>Clear the selected Markdown and ZIP files after a queued batch finishes, preventing accidental duplicate imports while preserving task results and logs.<\/li>\n<\/ul>\n\n<h4>1.9.16<\/h4>\n\n<ul>\n<li>Updated Parsedown Extra to 0.9.0.<\/li>\n<li>Removed an unused WordPress core include from ZIP extraction.<\/li>\n<li>Switched translatable source strings to English for WordPress.org language packs.<\/li>\n<li>Corrected the WordPress.org contributor username.<\/li>\n<\/ul>\n\n<h4>1.9.15<\/h4>\n\n<ul>\n<li>Centered the Current time and Clear action icons in the publication date picker.<\/li>\n<\/ul>\n\n<h4>1.9.14<\/h4>\n\n<ul>\n<li>Fixed the publication date popover position and combined date and time in one precise control.<\/li>\n<\/ul>\n\n<h4>1.9.13<\/h4>\n\n<ul>\n<li>Made the publication date popup open reliably above or below its input, with aligned action icons.<\/li>\n<\/ul>\n\n<h4>1.9.12<\/h4>\n\n<ul>\n<li>Added a compact publication date field with a popup for typing or selecting date and time, plus Current time and Clear controls.<\/li>\n<\/ul>\n\n<h4>1.9.11<\/h4>\n\n<ul>\n<li>Made the Markdown import and export pages use the available WordPress admin content width.<\/li>\n<\/ul>\n\n<h4>1.9.10<\/h4>\n\n<ul>\n<li>Added persistent import statistics and recent import logs.<\/li>\n<li>Added a confirmed Advanced action that clears only import statistics and logs.<\/li>\n<\/ul>\n\n<h4>1.9.9<\/h4>\n\n<ul>\n<li>Added a clear selected files button to the Markdown and ZIP upload field.<\/li>\n<\/ul>\n\n<h4>1.9.8<\/h4>\n\n<ul>\n<li>Refined the import donut chart with percentage callouts, a horizontal legend, and segment highlighting on hover or keyboard focus.<\/li>\n<\/ul>\n\n<h4>1.9.7<\/h4>\n\n<ul>\n<li>Replaced the import statistics bar with a live color-coded donut chart and processed total.<\/li>\n<\/ul>\n\n<h4>1.9.6<\/h4>\n\n<ul>\n<li>Restored visible dropdown arrows for plugin select fields in light and dark admin themes.<\/li>\n<\/ul>\n\n<h4>1.9.5<\/h4>\n\n<ul>\n<li>Refined the Markdown import and export interfaces with a shared full-width workspace, clearer form sections, improved controls, and responsive export cards.<\/li>\n<\/ul>\n\n<h4>1.9.4<\/h4>\n\n<ul>\n<li>Reworked the batch import sidebar with a visible import statistics dashboard, color-coded result bar, per-file task progress, and reset control.<\/li>\n<\/ul>\n\n<h4>1.9.3<\/h4>\n\n<ul>\n<li>Kept the import queue visible, expanded the desktop layout, and protected the import form from being compressed on narrower admin screens.<\/li>\n<\/ul>\n\n<h4>1.9.2<\/h4>\n\n<ul>\n<li>Added a sequential browser upload queue for multiple Markdown and ZIP files, with per-file progress, success, skip, and failure feedback.<\/li>\n<\/ul>\n\n<h4>1.9.1<\/h4>\n\n<ul>\n<li>Fixed imported Media Library images being left with an empty attachment title and appearing as unfinished uploads.<\/li>\n<li>Use each Markdown file's ZIP modification time when no manual publication date is set.<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>Added optional import date and time controls with second-level precision.<\/li>\n<li>Added private visibility and password-protected post controls.<\/li>\n<li>Added Front Matter password support.<\/li>\n<\/ul>\n\n<h4>1.8.1<\/h4>\n\n<ul>\n<li>Fixed the Markdown admin menu icon alignment and refreshed its stylesheet version.<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>Added WordPress locale-aware English translations and a translation template.<\/li>\n<li>Fixed Markdown menu icon centering in the WordPress admin sidebar.<\/li>\n<li>Validate imported image metadata before completion to avoid unfinished Media Library items.<\/li>\n<li>Moved GitHub documentation to the <code>docs\/<\/code> directory and excluded <code>.gitattributes<\/code> from archive exports.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Added configurable safe ZIP asset formats for images, video, audio, and PDF files.<\/li>\n<li>Added local linked-asset and WordPress video\/audio shortcode imports through the Media Library.<\/li>\n<li>Added configurable import limits that follow PHP\/WordPress upload limits by default.<\/li>\n<li>Added relative <code>media\/<\/code> packaging for supported local assets during export.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Hardened ZIP extraction, upload and download size enforcement, import capabilities, and local image export path validation.<\/li>\n<li>Updated Parsedown to 1.8.0 to address a reported regular-expression denial-of-service issue.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Renamed the plugin, directory, main plugin file, admin page slugs, text domain, and Composer package to Fangtao MD IO (<code>fangtao-md-io<\/code>).<\/li>\n<li>Preserved existing <code>ftmzi_*<\/code> settings and internal identifiers for upgrade compatibility.<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Added case-insensitive support for additional Markdown text file extensions in direct uploads, ZIP imports, and exports.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added five selectable Markdown parsers: Parsedown, Parsedown Extra, Cebe Markdown, Cebe Markdown GitHub, and Cebe Markdown Extra.<\/li>\n<li>Added Traditional, GitHub, and Extra syntax flavor labels.<\/li>\n<li>Added a persistent default parser and a per-import parser override.<\/li>\n<li>Bundled the parser dependencies for portable installation.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added extended Front Matter import and export metadata.<\/li>\n<li>Added optional safe remote image importing.<\/li>\n<li>Added filtered mass export and selectable Markdown file extensions.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Added an optional category selector when importing standard posts.<\/li>\n<li>Added a persistent Draft or Publish immediately default for the import form.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added a WordPress PclZip fallback for individual and bulk Markdown ZIP exports.<\/li>\n<li>Preserved the existing <code>article.md<\/code> and relative <code>images\/<\/code> package structure without requiring PHP ZIP.<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Added a bundled mbstring compatibility layer for Markdown conversion on servers without the PHP mbstring extension.<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Added a WordPress PclZip fallback for ZIP imports when the PHP ZIP extension is unavailable.<\/li>\n<li>Kept archive path, entry count, and extracted-size checks on the fallback path.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Prevented incomplete OSS configuration from causing fatal errors during image import.<\/li>\n<li>Added readable handling for media import exceptions.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added individual and bulk Markdown ZIP export.<\/li>\n<li>Added HTML-to-Markdown conversion and relative image packaging.<\/li>\n<li>Added exported Front Matter data.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial Markdown and ZIP import release.<\/li>\n<li>Added local image import and featured image handling.<\/li>\n<\/ul>","raw_excerpt":"Import Markdown and ZIP archives with local media assets, then export WordPress content as portable Markdown ZIP packages.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/351770","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=351770"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/fxy5750"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=351770"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=351770"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=351770"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=351770"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=351770"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=351770"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}