{"id":324683,"date":"2026-06-14T12:17:18","date_gmt":"2026-06-14T12:17:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/4wp-drive\/"},"modified":"2026-09-09T18:53:52","modified_gmt":"2026-09-09T18:53:52","slug":"4wp-drive","status":"publish","type":"plugin","link":"https:\/\/tt.wordpress.org\/plugins\/4wp-drive\/","author":17741300,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.0","stable_tag":"1.5.0","tested":"7.1","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"4WP Drive","header_author":"4wpdev","header_description":"Import Google Docs from Drive folders into WordPress drafts \u2014 lightweight editorial pipeline (incoming \u2192 inbox \u2192 publish).","assets_banners_color":"030611","last_updated":"2026-09-09 18:53:52","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/4wp.dev\/plugin\/4wp-drive\/","header_author_uri":"https:\/\/4wp.dev\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":446,"num_ratings":0,"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":"4wpdev","date":"2026-06-14 12:19:02","revision":3571876},"1.0.2":{"tag":"1.0.2","author":"4wpdev","date":"2026-06-17 20:42:27","revision":3576330},"1.1.0":{"tag":"1.1.0","author":"4wpdev","date":"2026-08-18 17:05:43","revision":3653311},"1.3.0":{"tag":"1.3.0","author":"4wpdev","date":"2026-08-28 20:48:06","revision":3670916},"1.4.0":{"tag":"1.4.0","author":"4wpdev","date":"2026-09-03 20:17:28","revision":3680350},"1.5.0":{"tag":"1.5.0","author":"4wpdev","date":"2026-09-09 18:53:52","revision":3688868}},"upgrade_notice":{"1.5.0":"<p>GitHub Markdown is live. Incoming accepts Markdown packages. Analytics records imports and can restore a package to incoming.<\/p>","1.4.0":"<p>Editorial Inbox: source tabs, status bar, queue + workspace preview. Tested up to WordPress 7.1.<\/p>","1.3.0":"<p>Map Google Doc FAQ \/ image sections from <strong>4WP Drive \u2192 Patterns<\/strong> (4WP FAQ, Core Accordion, Core Image).<\/p>","1.2.0":"<p>Polylang sites: pick content language in the Inbox before import; update mode respects the selected language. WPML is planned. See Settings \u2192 Multilingual integration.<\/p>","1.1.0":"<p>Update existing posts and pages from the Inbox\u2014pick a target post before import.<\/p>","1.0.2":"<p>Inbox sync UX and Google Drive connection health notices. Reconnect in Settings if sync stops working.<\/p>","1.0.1":"<p>Maintenance release addressing WordPress.org plugin review feedback on core file includes.<\/p>","1.0.0":"<p>First public release. Connect Google Drive, sync incoming docs, and import drafts from the admin Inbox.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3572015,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3572015,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3572015,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3572015,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1","1.0.2","1.1.0","1.3.0","1.4.0","1.5.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3576330,"resolution":"1","location":"assets","locale":"","width":3840,"height":2400},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3576330,"resolution":"2","location":"assets","locale":"","width":3840,"height":2400},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3576330,"resolution":"3","location":"assets","locale":"","width":3840,"height":2400},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3576330,"resolution":"4","location":"assets","locale":"","width":3840,"height":2400},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3576330,"resolution":"5","location":"assets","locale":"","width":3840,"height":2400},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3576330,"resolution":"6","location":"assets","locale":"","width":3840,"height":2400},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3576330,"resolution":"7","location":"assets","locale":"","width":3840,"height":2400},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3576330,"resolution":"8","location":"assets","locale":"","width":3840,"height":2400},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3576330,"resolution":"9","location":"assets","locale":"","width":3840,"height":2400}},"screenshots":{"1":"Storage sources \u2014 source registry (Google Drive and GitHub live; OneDrive, Dropbox planned).","2":"Google Drive \u2014 OAuth credentials, Connect, and folder mapping.","3":"Document template \u2014 map front-matter labels to post fields and taxonomies.","4":"Drive folders \u2014 WordPress settings alongside the matching <code>incoming<\/code> \/ <code>published<\/code> \/ <code>failed<\/code> folders in Drive.","5":"Incoming \u2014 synced articles from <code>incoming\/<\/code> with Preview, Import as Draft, and Reject.","6":"Document template \u2014 example header format next to a Google Doc with front-matter.","7":"Inbox preview \u2014 parsed metadata and featured image before import.","8":"Imported draft \u2014 post editor with content, featured image, categories, and Yoast SEO fields.","9":"Published post \u2014 front-end article after import from Drive."}},"plugin_section":[262246],"plugin_tags":[267084,2871,8485,17785,87],"plugin_category":[59],"plugin_contributors":[262731,262732],"plugin_business_model":[],"class_list":["post-324683","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-content-pipeline","plugin_tags-drafts","plugin_tags-editorial","plugin_tags-google-drive","plugin_tags-import","plugin_category-utilities-and-tools","plugin_contributors-4wpdev","plugin_contributors-anatolikkk","plugin_committers-4wpdev","plugin_committers-anatolikkk"],"banners":{"banner":"https:\/\/ps.w.org\/4wp-drive\/assets\/banner-772x250.png?rev=3572015","banner_2x":"https:\/\/ps.w.org\/4wp-drive\/assets\/banner-1544x500.png?rev=3572015","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/4wp-drive\/assets\/icon-128x128.png?rev=3572015","icon_2x":"https:\/\/ps.w.org\/4wp-drive\/assets\/icon-256x256.png?rev=3572015","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/4wp-drive\/assets\/screenshot-1.png?rev=3576330","caption":"Storage sources \u2014 source registry (Google Drive and GitHub live; OneDrive, Dropbox planned)."},{"src":"https:\/\/ps.w.org\/4wp-drive\/assets\/screenshot-2.png?rev=3576330","caption":"Google Drive \u2014 OAuth credentials, Connect, and folder mapping."},{"src":"https:\/\/ps.w.org\/4wp-drive\/assets\/screenshot-3.png?rev=3576330","caption":"Document template \u2014 map front-matter labels to post fields and taxonomies."},{"src":"https:\/\/ps.w.org\/4wp-drive\/assets\/screenshot-4.png?rev=3576330","caption":"Drive folders \u2014 WordPress settings alongside the matching <code>incoming<\/code> \/ <code>published<\/code> \/ <code>failed<\/code> folders in Drive."},{"src":"https:\/\/ps.w.org\/4wp-drive\/assets\/screenshot-5.png?rev=3576330","caption":"Incoming \u2014 synced articles from <code>incoming\/<\/code> with Preview, Import as Draft, and Reject."},{"src":"https:\/\/ps.w.org\/4wp-drive\/assets\/screenshot-6.png?rev=3576330","caption":"Document template \u2014 example header format next to a Google Doc with front-matter."},{"src":"https:\/\/ps.w.org\/4wp-drive\/assets\/screenshot-7.png?rev=3576330","caption":"Inbox preview \u2014 parsed metadata and featured image before import."},{"src":"https:\/\/ps.w.org\/4wp-drive\/assets\/screenshot-8.png?rev=3576330","caption":"Imported draft \u2014 post editor with content, featured image, categories, and Yoast SEO fields."},{"src":"https:\/\/ps.w.org\/4wp-drive\/assets\/screenshot-9.png?rev=3576330","caption":"Published post \u2014 front-end article after import from Drive."}],"raw_content":"<!--section=description-->\n<p><strong>4WP Drive<\/strong> connects Drive and GitHub folder workflows to WordPress: writers drop documents in <code>incoming\/<\/code>, editors review them on the admin <strong>Incoming<\/strong> screen, and approved content becomes <strong>draft posts<\/strong> or updates <strong>existing posts and pages<\/strong>\u2014without copy-paste. <strong>Analytics<\/strong> stores import history (folder alias, site slug, incoming \u2192 published) and can restore a package back to incoming.<\/p>\n\n<p>A plugin by <a href=\"https:\/\/4wp.dev\/\">4wp.dev<\/a>.<\/p>\n\n<p>Learn more, workflow details, and comparisons on the plugin page at <a href=\"https:\/\/4wp.dev\/plugin\/4wp-drive\/\">4wp.dev\/plugin\/4wp-drive\/<\/a>.<\/p>\n\n<h4>Perfect for<\/h4>\n\n<ul>\n<li><strong>Editorial teams<\/strong> that draft in Google Docs but publish in WordPress<\/li>\n<li><strong>Agencies<\/strong> with a shared Drive or GitHub <code>incoming\/<\/code> folder and a review step before publish<\/li>\n<li><strong>Content pipelines<\/strong> that need structured front-matter (title, slug, categories, SEO fields) parsed from the doc header<\/li>\n<li>Sites that want <strong>API credentials stored encrypted<\/strong> and <strong>OAuth handled server-side<\/strong><\/li>\n<\/ul>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li>Install and activate <strong>4WP Drive<\/strong>.<\/li>\n<li>Connect a storage source in <strong>Settings \u2192 Storage sources<\/strong>: Google Drive (OAuth) and\/or GitHub (PAT + owner\/repo).<\/li>\n<li>Drive: set the <strong>root folder ID<\/strong>; the plugin uses <code>incoming\/<\/code> and <code>published\/<\/code> subfolders. GitHub: set the repo and incoming path (default <code>incoming\/<\/code>).<\/li>\n<li>Drop a package into <code>incoming\/<\/code> (Google Doc, Markdown, or Word on Drive; Markdown on GitHub) or run <strong>Sync<\/strong>.<\/li>\n<li>Open <strong>Incoming<\/strong> \u2014 pick a source tab (Google Drive or GitHub live; OneDrive and Dropbox on the roadmap), sync, select a document, then preview and <strong>Create new draft<\/strong>, <strong>Update existing post<\/strong>, or Reject.<\/li>\n<li>On import, files move to <code>published\/<\/code>. Open <strong>Analytics<\/strong> to see history; <strong>Restore to incoming<\/strong> if you need the package back in the queue.<\/li>\n<\/ol>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Google Drive OAuth<\/strong> \u2014 connect an admin Google account; tokens stored encrypted<\/li>\n<li><strong>Folder sync<\/strong> \u2014 scan <code>incoming\/<\/code> for Google Docs, Markdown, Word, and images (Drive) or Markdown packages (GitHub)<\/li>\n<li><strong>GitHub<\/strong> \u2014 live Markdown source: PAT, owner\/repo, move to published\/failed after import<\/li>\n<li><strong>Editorial Incoming<\/strong> \u2014 status bar, source tabs, document queue + side workspace for preview and import<\/li>\n<li><strong>Analytics<\/strong> \u2014 import history (source, post, folder alias, site slug, incoming \u2192 published) and Restore to incoming<\/li>\n<li><strong>Document template<\/strong> \u2014 front-matter lines before a separator (<code>---<\/code> or <code>=====<\/code>) map to post fields; body becomes post content (headings, lists, bold preserved)<\/li>\n<li><strong>Body \u2192 block templates<\/strong> \u2014 map FAQ-style sections to <strong>4WP FAQ<\/strong> or core Accordion; <strong>Core Image<\/strong> (default on) replaces <code>[image:filename.jpeg]<\/code> with <code>core\/image<\/code> from the package folder<\/li>\n<li><strong>Configurable field map<\/strong> \u2014 title, slug, categories, tags, author, dates, SEO meta (when supported)<\/li>\n<li><strong>Featured image<\/strong> \u2014 import image from the same Drive subfolder<\/li>\n<li><strong>Update existing content<\/strong> \u2014 search and pick a post or page, then replace its content from the Drive document<\/li>\n<li><strong>Polylang multilingual import<\/strong> \u2014 pick content language in the Inbox when the site has multiple languages; assign language on create; filter update targets by language (WPML planned)<\/li>\n<li><strong>REST API<\/strong> + <strong>WP-CLI<\/strong> <code>wp forwp-drive sync<\/code> for manual sync<\/li>\n<li><strong>Roadmap sources<\/strong> \u2014 OneDrive and Dropbox<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>OAuth tokens and Google API credentials are stored in your WordPress database (encrypted). Document content is fetched from Google Drive only when an administrator runs sync or import. No visitor-facing tracking.<\/p>\n\n<p><strong>4WP<\/strong> is our project brand; the letters \"WP\" appear only as part of that brand name, not as a reference to WordPress. This plugin is not affiliated with, endorsed, or sponsored by WordPress.<\/p>\n\n<p>Source code: <a href=\"https:\/\/github.com\/4wpdev\/4wp-drive\">github.com\/4wpdev\/4wp-drive<\/a><\/p>\n\n<p>Plugin overview and FAQ: <a href=\"https:\/\/4wp.dev\/plugin\/4wp-drive\/\">4wp.dev\/plugin\/4wp-drive\/<\/a><\/p>\n\n<h4>Development<\/h4>\n\n<p>Human-readable PHP source is in the public GitHub repository above. The plugin ZIP includes <code>src\/<\/code> (PSR-4 autoload via <code>src\/Autoload.php<\/code> when <code>vendor\/<\/code> is absent). No npm build step \u2014 admin scripts ship as plain JS in <code>assets\/<\/code>.<\/p>\n\n<p>Run tests: <code>composer install &amp;&amp; composer test &amp;&amp; composer run lint<\/code><\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to <strong>Google<\/strong> services when an administrator configures OAuth and syncs or imports documents.<\/p>\n\n<h4>Google OAuth 2.0<\/h4>\n\n<p>Used to authorize access to the connected Google account's Drive files.<\/p>\n\n<ul>\n<li>Authorization URL: <code>https:\/\/accounts.google.com\/o\/oauth2\/v2\/auth<\/code><\/li>\n<li>Token URL: <code>https:\/\/oauth2.googleapis.com\/token<\/code><\/li>\n<li>Scope: <code>https:\/\/www.googleapis.com\/auth\/drive<\/code><\/li>\n<\/ul>\n\n<p>When an administrator clicks <strong>Connect Google Drive<\/strong>, the browser is redirected to Google to sign in and grant access. WordPress stores refresh and access tokens encrypted in the site database. Client ID and Client Secret are stored encrypted (or may be defined in <code>wp-config.php<\/code>).<\/p>\n\n<p>Google terms: https:\/\/policies.google.com\/terms<br \/>\nGoogle privacy: https:\/\/policies.google.com\/privacy<\/p>\n\n<h4>Google Drive API<\/h4>\n\n<p>Used to list folders, download Google Docs (export as HTML\/DOCX), and move files after import.<\/p>\n\n<ul>\n<li>API hostname: <code>https:\/\/www.googleapis.com\/drive\/v3\/<\/code> (and related export endpoints)<\/li>\n<\/ul>\n\n<p>Requests are made <strong>server-side<\/strong> only when an administrator runs sync, preview, or import. Document metadata and file content are processed on your server to create WordPress posts.<\/p>\n\n<p>Google Drive API terms follow Google Cloud \/ Google API Services terms linked from the Google Cloud Console.<\/p>\n\n<h4>GitHub REST API<\/h4>\n\n<p>Used when an administrator saves a personal access token and syncs or imports from a GitHub repository.<\/p>\n\n<ul>\n<li>API hostname: <code>https:\/\/api.github.com\/<\/code><\/li>\n<li>Typical calls: repository metadata, Contents API (list, read, create, delete) to move files after import or restore<\/li>\n<\/ul>\n\n<p>Requests are made <strong>server-side<\/strong> only. 4WP Drive uses the configured owner\/repository. A classic token with <code>repo<\/code> scope can access other repositories the GitHub account can reach; a fine-grained token can be limited to one repository (Contents: Read and write).<\/p>\n\n<p>GitHub terms: https:\/\/docs.github.com\/en\/site-policy\/github-terms\/github-terms-of-service<br \/>\nGitHub privacy: https:\/\/docs.github.com\/en\/site-policy\/privacy-policies\/github-general-privacy-statement<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/4wp-drive\/<\/code> or install from the Plugins screen.<\/li>\n<li>Activate <strong>4WP Drive<\/strong>.<\/li>\n<li>Open <strong>4WP Drive \u2192 Storage sources<\/strong> (or <strong>Documentation<\/strong> for the setup guide).<\/li>\n<li>Paste <strong>Client ID<\/strong> and <strong>Client Secret<\/strong> from Google Cloud Console \u2192 <strong>Save credentials<\/strong>.<\/li>\n<li>Click <strong>Connect Google Drive<\/strong>, then enter your Drive <strong>root folder ID<\/strong> and save subfolders.<\/li>\n<li>Use <strong>Inbox<\/strong> to preview and import documents.<\/li>\n<\/ol>\n\n<p>Optional: define <code>FORWP_DRIVE_GOOGLE_CLIENT_ID<\/code>, <code>FORWP_DRIVE_GOOGLE_CLIENT_SECRET<\/code>, or <code>FORWP_DRIVE_OAUTH_REDIRECT_URI<\/code> in <code>wp-config.php<\/code>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20google%20cloud%20project%3F\"><h3>Do I need a Google Cloud project?<\/h3><\/dt>\n<dd><p>Yes. Create OAuth 2.0 credentials (Web application), enable the Google Drive API, and register the redirect URI shown in the plugin Documentation tab.<\/p><\/dd>\n<dt id=\"what%20document%20format%20is%20supported%3F\"><h3>What document format is supported?<\/h3><\/dt>\n<dd><p>Google Docs in <code>incoming\/<\/code> (single doc or subfolder with doc + image). Front-matter uses <code>Label: value<\/code> lines before a separator paragraph (<code>---<\/code> or a row of <code>=<\/code> characters). The rest is post body.<\/p><\/dd>\n<dt id=\"are%20api%20keys%20exposed%20to%20visitors%3F\"><h3>Are API keys exposed to visitors?<\/h3><\/dt>\n<dd><p>No. OAuth and Drive requests run on the server. Only administrators with <code>manage_options<\/code> can connect Drive and import.<\/p><\/dd>\n<dt id=\"can%20i%20lock%20credentials%20in%20wp-config.php%3F\"><h3>Can I lock credentials in wp-config.php?<\/h3><\/dt>\n<dd><p>Yes. Use <code>FORWP_DRIVE_GOOGLE_CLIENT_ID<\/code> and <code>FORWP_DRIVE_GOOGLE_CLIENT_SECRET<\/code> constants.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20local%20dev%20%28.local%20%2F%20127.0.0.1%29%3F\"><h3>Does it work on local dev (.local \/ 127.0.0.1)?<\/h3><\/dt>\n<dd><p>Yes. Use the <strong>OAuth redirect (local)<\/strong> field when Google rejects your site hostname; register the same loopback URI in Google Cloud Console.<\/p><\/dd>\n<dt id=\"can%20i%20update%20an%20existing%20post%20or%20page%20instead%20of%20creating%20a%20draft%3F\"><h3>Can I update an existing post or page instead of creating a draft?<\/h3><\/dt>\n<dd><p>Yes. In <strong>Inbox \u2192 Preview<\/strong>, choose <strong>Update existing post<\/strong>, search or pick a target, and confirm. The document content is imported into that post. Use <strong>Import as Draft<\/strong> when you want a new post instead.<\/p><\/dd>\n<dt id=\"what%20changes%20when%20i%20update%20an%20existing%20post%3F\"><h3>What changes when I update an existing post?<\/h3><\/dt>\n<dd><p>The plugin updates <strong>title<\/strong>, <strong>content<\/strong>, mapped <strong>categories\/tags<\/strong>, <strong>SEO meta<\/strong> (when configured), and <strong>featured image<\/strong> (when the Drive folder includes an image). Optional front-matter <strong>date<\/strong> updates <code>post_date<\/code> when present. The post <strong>slug<\/strong> and <strong>status<\/strong> (published, draft, etc.) stay as they were unless your site or other plugins change them.<\/p><\/dd>\n<dt id=\"which%20posts%20can%20i%20select%20to%20update%3F\"><h3>Which posts can I select to update?<\/h3><\/dt>\n<dd><p>Only posts of the <strong>configured import post type<\/strong> (for example <strong>Posts<\/strong> or <strong>Pages<\/strong> under <strong>Document template<\/strong>). Targets must be posts you can edit (<code>edit_post<\/code>). Published, draft, pending, private, and scheduled posts are supported. The picker can suggest a match by document <strong>slug<\/strong> or <strong>title<\/strong> before you search.<\/p><\/dd>\n<dt id=\"is%20update%20mode%20safe%3F%20will%20it%20overwrite%20without%20asking%3F\"><h3>Is update mode safe? Will it overwrite without asking?<\/h3><\/dt>\n<dd><p>You must select a target and confirm before import. If the slug or title in the document matches an existing post, the plugin may <strong>suggest<\/strong> that post first\u2014you still choose explicitly. Always preview the document before updating production content.<\/p><\/dd>\n<dt id=\"does%20update%20mode%20work%20with%20pages%20and%20custom%20post%20types%3F\"><h3>Does update mode work with pages and custom post types?<\/h3><\/dt>\n<dd><p>It works with whichever post type you set as the import type in <strong>Document template<\/strong>. Switch the import type to <strong>Page<\/strong> (or another public type with editor support) to update pages instead of posts. The target must match that same type.<\/p><\/dd>\n<dt id=\"does%204wp%20drive%20work%20with%20multilingual%20sites%3F\"><h3>Does 4WP Drive work with multilingual sites?<\/h3><\/dt>\n<dd><p><strong>Polylang (1.2.0):<\/strong> When more than one language is configured, open <strong>Inbox \u2192 Preview &amp; import<\/strong> and select <strong>Content language<\/strong> before import (no default). New drafts receive that language; <strong>Update existing post<\/strong> lists and validates targets in the selected language only. Language is not read from Drive folder names.<\/p>\n\n<p><strong>WPML:<\/strong> Shown as <strong>Planned<\/strong> under <strong>Settings \u2192 Multilingual integration<\/strong>; not used for import in this release.<\/p>\n\n<p>Single-language sites (no Polylang) behave as before \u2014 no language picker in the Inbox.<\/p><\/dd>\n<dt id=\"does%20github%20import%20use%20a%20folder%20named%20incoming%2F%3F\"><h3>Does GitHub import use a folder named incoming\/?<\/h3><\/dt>\n<dd><p>Yes in this release. Set <strong>Incoming path<\/strong> in GitHub settings (default <code>incoming<\/code>). Each article is a subfolder with a <code>.md<\/code> file plus images. After import the same tree is moved to <code>published\/<\/code>.<\/p><\/dd>\n<dt id=\"does%20the%20github%20token%20access%20every%20repository%3F\"><h3>Does the GitHub token access every repository?<\/h3><\/dt>\n<dd><p>4WP Drive only reads and writes the owner\/repo you configured. A <strong>classic PAT<\/strong> with <code>repo<\/code> can still access other repositories on that GitHub account. Use a <strong>fine-grained token<\/strong> limited to this repository (Contents: Read and write) if you want a narrow token.<\/p><\/dd>\n<dt id=\"where%20is%20import%20history%3F\"><h3>Where is import history?<\/h3><\/dt>\n<dd><p><strong>4WP Drive \u2192 Analytics.<\/strong> Each import stores source, date, post, folder alias, site slug, and incoming\/published paths. <strong>Restore to incoming<\/strong> moves the published package back; then Sync Incoming. History starts after upgrading to 1.5.0 (older imports are not backfilled). You do not need to reactivate the plugin.<\/p><\/dd>\n<dt id=\"where%20do%20i%20see%20which%20multilingual%20plugin%20is%20active%3F\"><h3>Where do I see which multilingual plugin is active?<\/h3><\/dt>\n<dd><p><strong>4WP Drive \u2192 Settings \u2192 Storage sources<\/strong> \u2014 scroll to <strong>Multilingual integration<\/strong>. Cards show Polylang (live), WPML (planned), and single-language fallback, with status badges (Active, Inactive, Not installed, Planned).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.0<\/h4>\n\n<ul>\n<li><strong>Incoming<\/strong> \u2014 queue, preview, and import (same <code>forwp-drive-inbox<\/code> slug).<\/li>\n<li><strong>Markdown<\/strong> \u2014 Drive <code>incoming\/<\/code> packages accept <code>.md<\/code> \/ <code>.markdown<\/code> as the article (preferred over Google Doc \/ Word when several files sit in the folder). Pick which document to import.<\/li>\n<li><strong>Gutenberg<\/strong> \u2014 import serializes headings, paragraphs, lists, quotes, code, and inline strong\/em\/u to core blocks. Image markers support left \/ right \/ center alignment.<\/li>\n<li><strong>Image pin<\/strong> \u2014 package images can be placed in the preview before import (click image, click paragraph). Markdown <code>![](file.png)<\/code> in the same folder becomes <code>[image:file.png]<\/code>.<\/li>\n<li><strong>GitHub<\/strong> \u2014 live source: PAT + owner\/repo, scan <code>incoming\/<\/code>, import Markdown packages, move to published\/failed, sideload package images.<\/li>\n<li><strong>Analytics<\/strong> \u2014 import history table (source, post ID\/type, date, folder alias, site slug, incoming\/published paths). <strong>Restore to incoming<\/strong> moves the published package back to the queue. No plugin reactivation required.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li><strong>Inbox<\/strong> \u2014 editorial dashboard: connection\/sync status, storage <strong>source tabs<\/strong> (Google Drive live; GitHub, OneDrive, Dropbox marked Soon), document <strong>queue<\/strong> + side <strong>workspace<\/strong> for preview and import.<\/li>\n<li><strong>UX<\/strong> \u2014 select a document to preview beside the queue; Open folder + Sync in one chrome block; brand icons per source; compact <strong>Import<\/strong> \/ Edit in Google Docs \/ Reject actions.<\/li>\n<li><strong>Package folder<\/strong> \u2014 for articles in an <code>incoming\/<\/code> subfolder, show doc\/image counts, file names, and Open folder (after Sync).<\/li>\n<li><strong>Core Image template (default)<\/strong> \u2014 <code>[image:filename.jpeg]<\/code> markers sideload from the package folder into <code>core\/image<\/code> blocks on import.<\/li>\n<li><strong>Compatibility<\/strong> \u2014 Tested up to WordPress 7.1.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li><strong>Body \u2192 block templates<\/strong> \u2014 build an import collection in Settings: map document section headings to Gutenberg block templates.<\/li>\n<li><strong>4WP FAQ template<\/strong> \u2014 converts FAQ sections (Heading 2 + Heading 3 Q\/A) into <code>forwp\/faq<\/code> + core accordion (requires 4WP FAQ plugin).<\/li>\n<li><strong>Core Accordion template<\/strong> \u2014 same document pattern, outputs <code>core\/accordion<\/code> only (no FAQ wrapper).<\/li>\n<li><strong>Import<\/strong> \u2014 block markup preserved in post content; Inbox preview notes when body is block markup.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li><strong>Polylang multilingual import<\/strong> \u2014 pluggable language providers; manual <strong>Content language<\/strong> in Inbox when the site has multiple languages (no default; no Drive subfolders).<\/li>\n<li><strong>Import<\/strong> \u2014 assign post language on create via Polylang; <strong>Update existing post<\/strong> lists and validates targets in the selected language only.<\/li>\n<li><strong>Settings<\/strong> \u2014 <strong>Multilingual integration<\/strong> registry (Polylang live, WPML planned, single-language fallback) with Active \/ Inactive \/ Not installed \/ Planned badges.<\/li>\n<li><strong>REST<\/strong> \u2014 <code>language<\/code> on document import; <code>lang<\/code> on import-targets; <code>multilingual<\/code> payload on inbox, preview, settings, and targets.<\/li>\n<li><strong>Developers<\/strong> \u2014 <code>Language_Provider_Interface<\/code>, <code>Language_Provider_Registry<\/code>, <code>Import_Language_Resolver<\/code>; filter <code>forwp_drive_language_providers<\/code>. WPML provider class kept; not enabled for import until a future release.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Inbox: <strong>Update existing post<\/strong> \u2014 import a Drive document into a selected post or page instead of creating a new draft.<\/li>\n<li>REST: import targets search for choosing an existing post or page to update.<\/li>\n<li>Import: <code>Post_Creator::update_existing()<\/code> and <code>Import_Target_Resolver<\/code> for safe target validation.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Inbox: single <strong>Sync from Drive<\/strong> button (replaces separate refresh control).<\/li>\n<li>OAuth: detect expired or revoked tokens on Inbox\/Settings load; show reconnect notice before sync.<\/li>\n<li>WordPress.org listing assets: icons, banners, and screenshots.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Plugin review: remove unnecessary core file include; load wp-admin image helpers only when generating attachment metadata.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First WordPress.org release: Google Drive OAuth, folder sync, inbox, draft import, field mapping, WP-CLI sync.<\/li>\n<li>Plugin Check fixes: i18n translators, redirect URI copy, OAuth error messages, readme External services.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Internal MVP.<\/li>\n<\/ul>","raw_excerpt":"Import Google Docs and Markdown from Drive or GitHub into WordPress drafts\u2014or update existing posts and pages from Incoming.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/324683","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/tt.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/tt.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=324683"}],"author":[{"embeddable":true,"href":"https:\/\/tt.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/4wpdev"}],"wp:attachment":[{"href":"https:\/\/tt.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=324683"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/tt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=324683"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/tt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=324683"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/tt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=324683"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/tt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=324683"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/tt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=324683"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}