{"id":253793,"date":"2025-10-15T12:01:40","date_gmt":"2025-10-15T12:01:40","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/post-forwarder\/"},"modified":"2026-06-16T22:00:25","modified_gmt":"2026-06-16T22:00:25","slug":"post-forwarder","status":"publish","type":"plugin","link":"https:\/\/fi.wordpress.org\/plugins\/post-forwarder\/","author":23214719,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"3.0.2","stable_tag":"3.0.2","tested":"7.0","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"Post Forwarder","header_author":"Sylwester Ulatowski","header_description":"Forwards posts to other WordPress sites via REST API with taxonomy mapping and featured image support.","assets_banners_color":"f0f5fc","last_updated":"2026-06-16 22:00:25","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/Padwaywaydonc\/post-forwarder","header_author_uri":"","rating":5,"author_block_rating":0,"active_installs":20,"downloads":381,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.1.0":{"tag":"2.1.0","author":"sylwester1213","date":"2025-10-15 12:00:24"},"3.0.0":{"tag":"3.0.0","author":"sylwester1213","date":"2026-06-16 21:47:30"},"3.0.1":{"tag":"3.0.1","author":"sylwester1213","date":"2026-06-16 21:56:56"},"3.0.2":{"tag":"3.0.2","author":"sylwester1213","date":"2026-06-16 22:00:25"}},"upgrade_notice":{"3.0.2":"<p>Maintenance release: restores the plugin icon\/banner and corrects listing metadata. No functional changes.<\/p>","3.0.1":"<p>Compatibility with WordPress 7.0 and PHP 8.3, plus clearer documentation including the content calendar. All existing portal configurations are preserved.<\/p>","3.0.0":"<p>Major update. LinkedIn posts now include featured image thumbnails and auto-hashtags from post tags. All existing portal configurations are preserved on upgrade.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3575026,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3575026,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.1.0","3.0.0","3.0.1","3.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3575019,"resolution":"1","location":"assets","locale":"","width":1065,"height":1043},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3575019,"resolution":"2","location":"assets","locale":"","width":280,"height":736},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3575019,"resolution":"3","location":"assets","locale":"","width":1282,"height":825}},"screenshots":{"1":"Connection settings \u2014 connect your WordPress sites, LinkedIn, and X with one-click authorization","2":"Post editor \u2014 choose which destinations each post is forwarded to when you publish","3":"Content calendar \u2014 schedule and review posts across all connected channels"}},"plugin_section":[],"plugin_tags":[5365,313,4062,5699,159],"plugin_category":[51],"plugin_contributors":[267401],"plugin_business_model":[],"class_list":["post-253793","plugin","type-plugin","status-publish","hentry","plugin_tags-forward","plugin_tags-linkedin","plugin_tags-schedule","plugin_tags-syndication","plugin_tags-twitter","plugin_category-multisite","plugin_contributors-sylwester1213","plugin_committers-sylwester1213"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/post-forwarder\/assets\/icon-256x256.png?rev=3575026","icon_2x":"https:\/\/ps.w.org\/post-forwarder\/assets\/icon-256x256.png?rev=3575026","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/post-forwarder\/assets\/screenshot-1.png?rev=3575019","caption":"Connection settings \u2014 connect your WordPress sites, LinkedIn, and X with one-click authorization"},{"src":"https:\/\/ps.w.org\/post-forwarder\/assets\/screenshot-2.png?rev=3575019","caption":"Post editor \u2014 choose which destinations each post is forwarded to when you publish"},{"src":"https:\/\/ps.w.org\/post-forwarder\/assets\/screenshot-3.png?rev=3575019","caption":"Content calendar \u2014 schedule and review posts across all connected channels"}],"raw_content":"<!--section=description-->\n<p>Post Forwarder lets you syndicate content from one WordPress site to any combination of destinations with a single click at publish time \u2014 or schedule it ahead with the built-in calendar. Configure as many portals as you need and choose per-post which ones receive each article.<\/p>\n\n<p><strong>Supported Destinations<\/strong><\/p>\n\n<ul>\n<li><strong>WordPress sites<\/strong> \u2014 forwards via the REST API with taxonomy mapping, featured image upload, ACF field support, and duplicate prevention. One-click authorization using WordPress Application Passwords, or enter credentials manually.<\/li>\n<li><strong>LinkedIn<\/strong> \u2014 posts as a link-share article card with your excerpt, featured image thumbnail, and hashtags auto-generated from your WordPress post tags. Supports personal profiles and organisation pages. One-click connect \u2014 no configuration required.<\/li>\n<li><strong>X (Twitter)<\/strong> \u2014 posts the title and post URL as a tweet; the featured image attaches directly on paid API tiers or appears as a link preview card. Connect with your own free X developer app.<\/li>\n<\/ul>\n\n<p><strong>Plan ahead with the content calendar<\/strong><\/p>\n\n<p>Post Forwarder includes a built-in weekly calendar so you can do more than fire-and-forget on publish. Schedule posts to go out to your connected channels at the time that suits you, see everything that's queued at a glance, and manage upcoming posts across all your WordPress sites, LinkedIn, and X from one screen. Great for keeping a steady publishing rhythm without babysitting the clock.<\/p>\n\n<p><strong>WordPress forwarding highlights<\/strong><\/p>\n\n<ul>\n<li>One-click \"Save &amp; Connect with WordPress\" using the built-in Application Password flow.<\/li>\n<li>Taxonomy mapping with automatic fallback to tags.<\/li>\n<li>Featured image, ACF fields, and custom post types are carried across.<\/li>\n<li>Duplicate prevention so the same post is never forwarded twice.<\/li>\n<\/ul>\n\n<p><strong>LinkedIn highlights<\/strong><\/p>\n\n<ul>\n<li>Zero-configuration connect \u2014 click \"Connect with LinkedIn\" and authorize in one step.<\/li>\n<li>Featured image is uploaded directly to LinkedIn and shown as the article thumbnail.<\/li>\n<li>WordPress post tags become LinkedIn hashtags automatically (the tag \"my topic\" becomes #MyTopic).<\/li>\n<li>Supports personal profiles and organisation pages.<\/li>\n<li>Token expiry is shown in settings, with a reconnect prompt before it lapses.<\/li>\n<\/ul>\n\n<p><strong>Compatibility<\/strong><\/p>\n\n<p>Tested with WordPress 7.0 and PHP 8.3.<\/p>\n\n<h3>Platform Requirements &amp; Limitations<\/h3>\n\n<h4>WordPress<\/h4>\n\n<ul>\n<li>The destination site must run WordPress 5.6+ with the REST API enabled (default).<\/li>\n<li>The connecting user must have at least the Editor role on the destination site.<\/li>\n<li>Use \"Save &amp; Connect with WordPress\" for one-click Application Password authorization, or enter a username and Application Password manually.<\/li>\n<\/ul>\n\n<h4>LinkedIn<\/h4>\n\n<ul>\n<li>No extra configuration required \u2014 one-click connect handles sign-in.<\/li>\n<li>LinkedIn access tokens expire after <strong>60 days<\/strong>. The plugin shows the expiry date and prompts you to reconnect.<\/li>\n<li>For organisation page posts set the Author URN to <code>urn:li:organization:YOUR_ORG_ID<\/code>. You'll also need the <strong>Community Management API<\/strong> product approved on the LinkedIn app (not needed for personal profile posts).<\/li>\n<li>LinkedIn needs the post URL to be publicly reachable to show an article card. Posts from localhost or <code>.local<\/code>\/<code>.test<\/code> domains fall back to image-only or text+URL mode.<\/li>\n<\/ul>\n\n<h4>X (Twitter)<\/h4>\n\n<p><strong>You need a free X developer account to post tweets.<\/strong> X limits write access per developer app, so each plugin user connects their own app.<\/p>\n\n<p><strong>Step 1 \u2014 Create an X developer account (one-time)<\/strong><\/p>\n\n<ol>\n<li>Go to <a href=\"https:\/\/developer.x.com\">developer.x.com<\/a> and sign in with your X account.<\/li>\n<li>Click <strong>Sign up<\/strong> and agree to the terms \u2014 your developer account is created instantly.<\/li>\n<\/ol>\n\n<p><strong>Step 2 \u2014 Create an app and get credentials<\/strong><\/p>\n\n<ol>\n<li>In the <a href=\"https:\/\/console.x.com\">Developer Portal<\/a> go to <strong>Apps<\/strong> and click <strong>Create App<\/strong>.<\/li>\n<li>Give it any name (e.g. \"My Post Forwarder\").<\/li>\n<li>Open the app, click <strong>Keys &amp; Tokens<\/strong> then <strong>User authentication settings<\/strong> then <strong>Set up<\/strong>.<\/li>\n<li>Set:\n\n<ul>\n<li><strong>App permissions<\/strong>: Read and write<\/li>\n<li><strong>Type of App<\/strong>: Web App, Automated App or Bot<\/li>\n<li><strong>Callback URI<\/strong>: the callback URL shown in the plugin's X portal settings<\/li>\n<li><strong>Website URL<\/strong>: your site URL<\/li>\n<\/ul><\/li>\n<li>Click <strong>Save<\/strong> and copy the <strong>Client ID<\/strong> and <strong>Client Secret<\/strong> (the secret is shown only once).<\/li>\n<\/ol>\n\n<p><strong>Step 3 \u2014 Connect in the plugin<\/strong><\/p>\n\n<ol>\n<li>In <strong>Post Forwarder -&gt; Settings -&gt; Connection Configuration<\/strong>, add an X portal.<\/li>\n<li>Enter the Client ID and Client Secret you copied.<\/li>\n<li>Click <strong>Save Portals<\/strong>, then click <strong>Save &amp; Connect with X<\/strong>.<\/li>\n<li>Authorize the app on X and you are redirected back with a \"Connected\" badge.<\/li>\n<\/ol>\n\n<p><strong>Notes:<\/strong>\n* The free tier allows 1,500 tweet writes per month. Each user's app has its own separate quota.\n* X access tokens are long-lived and refreshed automatically before expiry.\n* Featured images on the free tier appear as link preview cards (public sites only), not as direct attachments. The X Basic plan enables direct image upload.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>Post Forwarder only sends data when you choose to connect an account or forward a post \u2014 nothing is sent in the background.<\/p>\n\n<p>To publish to LinkedIn or X (Twitter), the plugin uses a small open-source connection helper to handle the secure sign-in step, then sends the post you're forwarding (such as its title, link, and image) to the network you connected. WordPress-to-WordPress forwarding talks only to the site you set up.<\/p>\n\n<p>You stay in control: connect or disconnect any destination at any time, and advanced users can self-host the connection helper. Each network's handling of the content you send is governed by its own terms:<\/p>\n\n<ul>\n<li>LinkedIn \u2014 <a href=\"https:\/\/www.linkedin.com\/legal\/user-agreement\">Terms<\/a> \u00b7 <a href=\"https:\/\/www.linkedin.com\/legal\/privacy-policy\">Privacy<\/a><\/li>\n<li>X (Twitter) \u2014 <a href=\"https:\/\/twitter.com\/en\/tos\">Terms<\/a> \u00b7 <a href=\"https:\/\/twitter.com\/en\/privacy\">Privacy<\/a><\/li>\n<\/ul>\n\n<h3>Technical Notes<\/h3>\n\n<p><strong>Security:<\/strong>\n* OAuth tokens are stored in the WordPress database. Enable at-rest encryption on your host for best protection.\n* Sensitive fields (access tokens, client secrets, passwords) are never echoed back to the browser \u2014 submitting a blank field preserves the saved value.\n* All form inputs are sanitized and validated; WordPress nonces protect all forms and OAuth callbacks.<\/p>\n\n<p><strong>Tested with:<\/strong>\n* WordPress 7.0\n* PHP 8.3<\/p>\n\n<p><strong>Minimum Requirements:<\/strong>\n* WordPress 5.6+\n* PHP 7.4+<\/p>\n\n<!--section=installation-->\n<h4>Plugin<\/h4>\n\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/post-forwarder\/<\/code>, or install via <strong>Plugins -&gt; Add New<\/strong>.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to <strong>Post Forwarder -&gt; Settings<\/strong> to configure portals.<\/li>\n<\/ol>\n\n<h4>WordPress portal credentials (manual)<\/h4>\n\n<ol>\n<li>On the destination site go to <strong>Users -&gt; Profile<\/strong>.<\/li>\n<li>Scroll to <strong>Application Passwords<\/strong> and create a new one.<\/li>\n<li>Enter the username and generated password in the plugin settings, or use the one-click button.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20i%20forward%20to%20multiple%20destinations%20at%20once%3F\"><h3>Can I forward to multiple destinations at once?<\/h3><\/dt>\n<dd><p>Yes. Check as many portals as you like in the post editor sidebar \u2014 all selected portals receive the post when you publish or update.<\/p><\/dd>\n<dt id=\"can%20i%20schedule%20posts%20instead%20of%20forwarding%20on%20publish%3F\"><h3>Can I schedule posts instead of forwarding on publish?<\/h3><\/dt>\n<dd><p>Yes. Open <strong>Post Forwarder -&gt; Calendar<\/strong> to schedule posts to your connected channels for a future date and time, and to review everything that's queued.<\/p><\/dd>\n<dt id=\"can%20i%20forward%20custom%20post%20types%3F\"><h3>Can I forward custom post types?<\/h3><\/dt>\n<dd><p>Yes for WordPress portals. LinkedIn and X always receive a link-post with excerpt and featured image regardless of post type.<\/p><\/dd>\n<dt id=\"does%20linkedin%20need%20any%20setup%3F\"><h3>Does LinkedIn need any setup?<\/h3><\/dt>\n<dd><p>No. One-click connect handles sign-in for you \u2014 no LinkedIn API keys needed on your end.<\/p><\/dd>\n<dt id=\"what%20are%20the%20hashtags%20in%20linkedin%20posts%3F\"><h3>What are the hashtags in LinkedIn posts?<\/h3><\/dt>\n<dd><p>Your WordPress post tags are converted to LinkedIn hashtags automatically. For example, a tag \"social media tips\" becomes <code>#SocialMediaTips<\/code> at the end of the post.<\/p><\/dd>\n<dt id=\"does%20the%20featured%20image%20appear%20on%20linkedin%3F\"><h3>Does the featured image appear on LinkedIn?<\/h3><\/dt>\n<dd><p>Yes. The plugin uploads your featured image directly to LinkedIn and attaches it as the article thumbnail. If no featured image is set, the article card may still show a preview from the linked page's Open Graph tags.<\/p><\/dd>\n<dt id=\"how%20often%20do%20linkedin%20tokens%20expire%3F\"><h3>How often do LinkedIn tokens expire?<\/h3><\/dt>\n<dd><p>Every 60 days. The plugin shows the expiry date in portal settings. Reconnect before expiry to avoid forwarding failures.<\/p><\/dd>\n<dt id=\"why%20does%20x%20posting%20fail%20with%20a%20quota%20error%3F\"><h3>Why does X posting fail with a quota error?<\/h3><\/dt>\n<dd><p>Each developer app has 1,500 tweet writes per month on the free tier. If you see a quota error, wait until next month or upgrade your X API plan. Make sure you entered your own Client ID and Secret in the portal settings.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20destination%20is%20unreachable%3F\"><h3>What happens if a destination is unreachable?<\/h3><\/dt>\n<dd><p>The plugin logs the error and shows it in the post editor sidebar after saving. Other destinations are still attempted.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.0.2<\/h4>\n\n<ul>\n<li>Restored the plugin icon and banner on the WordPress.org listing<\/li>\n<li>Corrected listing metadata (contributor username and tags)<\/li>\n<\/ul>\n\n<h4>3.0.1<\/h4>\n\n<ul>\n<li>Compatibility with WordPress 7.0 and PHP 8.3<\/li>\n<li>Documented the built-in content calendar for scheduling posts<\/li>\n<li>Reorganised the readme: WordPress, then LinkedIn, then X<\/li>\n<li>Clearer, friendlier setup and service information<\/li>\n<\/ul>\n\n<h4>3.0.0<\/h4>\n\n<ul>\n<li>WordPress portal: one-click Application Password authorization flow<\/li>\n<li>WordPress portal: duplicate prevention, taxonomy mapping, ACF field forwarding, featured image upload<\/li>\n<li>LinkedIn: featured image uploaded directly and shown as the article thumbnail<\/li>\n<li>LinkedIn: WordPress post tags automatically converted to hashtags (e.g. #MyTag)<\/li>\n<li>LinkedIn: commentary truncated at LinkedIn's 3000-character limit to prevent silent failures<\/li>\n<li>LinkedIn: token expiry date shown in settings with a reconnect prompt when expired<\/li>\n<li>LinkedIn: organisation page support via <code>urn:li:organization:...<\/code> Author URN<\/li>\n<li>LinkedIn: zero-config one-click connect \u2014 no LinkedIn API keys required<\/li>\n<li>X (Twitter): OAuth 2.0 with automatic long-lived token refresh<\/li>\n<li>X: per-user developer app credentials for independent API quotas<\/li>\n<li>Post editor sidebar: live forwarding result notices after publish (Gutenberg)<\/li>\n<li>Content calendar for scheduling posts across all channels<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Multi-portal support with selective per-post forwarding<\/li>\n<li>Intelligent taxonomy mapping with tag fallback<\/li>\n<li>Featured image transfer<\/li>\n<li>Duplicate prevention<\/li>\n<li>ACF integration<\/li>\n<li>Improved error handling and logging<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Complete rewrite with REST API support<\/li>\n<li>Taxonomy and meta field forwarding<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release \u2014 basic post forwarding<\/li>\n<\/ul>","raw_excerpt":"Forward WordPress posts to other WordPress sites, LinkedIn, and X \u2014 automatically on publish or scheduled from a built-in content calendar.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/253793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=253793"}],"author":[{"embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sylwester1213"}],"wp:attachment":[{"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=253793"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=253793"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=253793"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=253793"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=253793"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=253793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}