{"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-06-17T20:42:27","modified_gmt":"2026-06-17T20:42:27","slug":"4wp-drive","status":"publish","type":"plugin","link":"https:\/\/br.wordpress.org\/plugins\/4wp-drive\/","author":17741300,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.0","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-06-17 20:42:27","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/4wp.dev\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":96,"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"},"1.0.2":{"tag":"1.0.2","author":"4wpdev","date":"2026-06-17 20:42:27"}},"upgrade_notice":{"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"],"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 live; GitHub, 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":"Inbox \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"],"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 live; GitHub, 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":"Inbox \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 a Google Drive folder workflow to WordPress: writers drop documents in Drive, editors review them in an admin <strong>Inbox<\/strong>, and approved content becomes <strong>draft posts<\/strong>\u2014without copy-paste.<\/p>\n\n<p>A plugin by <a href=\"https:\/\/4wp.dev\/\">4wp.dev<\/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 <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>Create Google OAuth credentials and connect Drive in <strong>Storage sources<\/strong>.<\/li>\n<li>Set your Drive <strong>root folder ID<\/strong>; the plugin uses <code>incoming\/<\/code> and <code>published\/<\/code> subfolders.<\/li>\n<li>Drop a Google Doc (with optional image) into <code>incoming\/<\/code> or run <strong>Sync<\/strong>.<\/li>\n<li>Open <strong>Inbox<\/strong> \u2192 Preview \u2192 <strong>Import as Draft<\/strong> or Reject.<\/li>\n<li>On import, files move to <code>published\/<\/code> in Drive.<\/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 new Google Docs and images<\/li>\n<li><strong>Admin Inbox<\/strong> \u2014 preview HTML, import as draft, or reject<\/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>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>REST API<\/strong> + <strong>WP-CLI<\/strong> <code>wp forwp-drive sync<\/code> for manual sync<\/li>\n<li><strong>Roadmap sources<\/strong> \u2014 GitHub Markdown\/MDX and additional storage providers registered for future releases<\/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<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<!--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\n<\/dl>\n\n<!--section=changelog-->\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 from Drive into WordPress drafts\u2014editorial inbox, field mapping, and secure OAuth on your server.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/324683","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=324683"}],"author":[{"embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/4wpdev"}],"wp:attachment":[{"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=324683"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=324683"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=324683"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=324683"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=324683"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=324683"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}