{"id":269769,"date":"2026-01-07T13:01:27","date_gmt":"2026-01-07T13:01:27","guid":{"rendered":"https:\/\/nb.wordpress.org\/plugins\/devenia-linkedin-autoposter\/"},"modified":"2026-09-13T22:56:46","modified_gmt":"2026-09-13T22:56:46","slug":"devenia-autoposter-for-linkedin","status":"publish","type":"plugin","link":"https:\/\/es-ar.wordpress.org\/plugins\/devenia-autoposter-for-linkedin\/","author":9103039,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.17","stable_tag":"1.5.17","tested":"7.1.1","requires":"5.4","requires_php":"7.4","requires_plugins":null,"header_name":"Devenia Autoposter for LinkedIn","header_author":"basicus","header_description":"Automatically share posts to LinkedIn when published. Uses official LinkedIn API - no scraping, no bloat.","assets_banners_color":"4c4f54","last_updated":"2026-09-13 22:56:46","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/devenia.com\/","header_plugin_uri":"https:\/\/devenia.com\/plugins\/linkedin-autoposter\/","header_author_uri":"https:\/\/profiles.wordpress.org\/basicus\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":667,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.11":{"tag":"1.5.11","author":"basicus","date":"2026-01-07 13:00:28","revision":3434357},"1.5.12":{"tag":"1.5.12","author":"basicus","date":"2026-02-17 16:43:43","revision":3463680},"1.5.13":{"tag":"1.5.13","author":"basicus","date":"2026-05-20 10:19:19","revision":3538840},"1.5.14":{"tag":"1.5.14","author":"basicus","date":"2026-08-13 12:31:37","revision":3645304},"1.5.15":{"tag":"1.5.15","author":"basicus","date":"2026-08-16 10:36:55","revision":3649616},"1.5.17":{"tag":"1.5.17","author":"basicus","date":"2026-09-13 22:56:46","revision":3694264}},"upgrade_notice":{"1.5.17":"<p>Choose the permitted post languages separately for each LinkedIn destination. Save explicit selections to exclude languages added later.<\/p>","1.5.16":"<p>Fixes gallery-only selection and Unicode text limits. Review each destination after sharing.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3434361,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3434361,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3434361,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3434361,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.5.11","1.5.12","1.5.13","1.5.14","1.5.15","1.5.17"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[569,6855,313,138,174],"plugin_category":[56],"plugin_contributors":[220191],"plugin_business_model":[],"class_list":["post-269769","plugin","type-plugin","status-publish","hentry","plugin_tags-automation","plugin_tags-autoposter","plugin_tags-linkedin","plugin_tags-share","plugin_tags-social","plugin_category-social-and-sharing","plugin_contributors-basicus","plugin_committers-basicus"],"banners":{"banner":"https:\/\/ps.w.org\/devenia-autoposter-for-linkedin\/assets\/banner-772x250.png?rev=3434361","banner_2x":"https:\/\/ps.w.org\/devenia-autoposter-for-linkedin\/assets\/banner-1544x500.png?rev=3434361","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/devenia-autoposter-for-linkedin\/assets\/icon-128x128.png?rev=3434361","icon_2x":"https:\/\/ps.w.org\/devenia-autoposter-for-linkedin\/assets\/icon-256x256.png?rev=3434361","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Publish in WordPress and let a background job prepare the LinkedIn update. Choose the destinations, write a text template, and select which images to use. Check the result for each destination after sharing.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li>Queues sharing when an eligible post enters published status. Updates to a published post do not trigger another share; previously shared posts are skipped.<\/li>\n<li>Supports a personal profile, a company page, or both, subject to the connected account's permissions.<\/li>\n<li>Filters post languages separately for the personal profile and company page. Polylang supplies assigned post languages; a single-language site uses its WordPress site language.<\/li>\n<li>Uses a manual excerpt when present; otherwise prepares text from the post content. Supports {title}, {excerpt}, and {author} in the template.<\/li>\n<li>Keeps paragraph breaks and Unicode characters, and shortens the complete text to 3000 characters when needed.<\/li>\n<li>Offers featured-first, gallery-first, and gallery-only image selection.<\/li>\n<li>Records queue state, recent share attempts, and results for each destination.<\/li>\n<li>Provides two read-only diagnostics abilities when the WordPress Abilities API is available.<\/li>\n<\/ul>\n\n<h4>Choose languages for each destination<\/h4>\n\n<p>Select allowed languages separately for your personal profile and company page. For example, allow English and Norwegian for the profile but only English for the company page. Norwegian posts then go only to the profile.<\/p>\n\n<p>The choices are independent of LinkedIn profile language settings and do not translate content. Posts in excluded or unassigned Polylang languages are skipped before image selection or outbound requests. The queue records the skip and does not retry it. Selecting no languages pauses that destination.<\/p>\n\n<p>Existing installations initially allow their currently configured website languages. Save explicit choices to keep newly added languages excluded until you select them. The filter reads the current settings when a queued job runs. Changing the selection does not automatically reshare old posts.<\/p>\n\n<h4>Choose an image mode<\/h4>\n\n<p>Featured first: featured image, then the first content image, then gallery, then the configured default image or site logo.<\/p>\n\n<p>Gallery first: gallery, then featured image, then the first content image, then the configured default image or site logo.<\/p>\n\n<p>Gallery only: skips sharing when the selected gallery image is unavailable. It does not substitute a default image or logo.<\/p>\n\n<p>When a gallery image is selected, the rotation advances and the image becomes the WordPress post's featured image too. This can change its appearance in your website's post lists. Retries can select another gallery image.<\/p>\n\n<h4>Know what gets sent<\/h4>\n\n<p>The plugin sends text and, when an image upload succeeds, an image attachment. It does not automatically add the article URL, create a link preview, or add a first comment. A failed image upload can still be followed by a text-only post. Review each destination's result: overall success means at least one destination succeeded, not necessarily both.<\/p>\n\n<p>There is no guarantee of reach or engagement. The background queue needs functioning WordPress scheduled tasks. Reconnect when the plugin reports an expired or unusable LinkedIn connection; it does not automatically renew tokens with refresh tokens.<\/p>\n\n<h4>External services and data<\/h4>\n\n<p>Sharing uses LinkedIn's official REST API at api.linkedin.com. The selected text, author identity, and image are sent to LinkedIn. OAuth credentials and tokens are stored in your WordPress database. Images may be fetched from their configured host before upload. Restrict access to WordPress administration and database backups.<\/p>\n\n<p>LinkedIn's <a href=\"https:\/\/www.linkedin.com\/legal\/user-agreement\">User Agreement<\/a>, <a href=\"https:\/\/www.linkedin.com\/legal\/privacy-policy\">Privacy Policy<\/a>, and <a href=\"https:\/\/www.linkedin.com\/legal\/l\/api-terms-of-use\">API Terms<\/a> apply.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Download the <a href=\"https:\/\/downloads.devenia.com\/devenia-autoposter-for-linkedin.zip\">plugin ZIP<\/a>.<\/li>\n<li>In WordPress, open Plugins &gt; Add New &gt; Upload Plugin. Upload and activate it.<\/li>\n<li>Open Settings &gt; Autoposter for LinkedIn.<\/li>\n<li>Create or configure your app in the <a href=\"https:\/\/www.linkedin.com\/developers\/apps\">LinkedIn Developer Portal<\/a>. Enable the products and permissions needed for your destination. App access and approval depend on LinkedIn.<\/li>\n<li>Add the exact redirect URL shown by the plugin to the app. Enter the client ID and client secret, then connect to LinkedIn.<\/li>\n<li>Select a profile or company page, eligible post types, image mode, and text template. Save the settings.<\/li>\n<li>Publish a suitable post and inspect its queue and destination results.<\/li>\n<\/ol>\n\n<p>Personal sharing requires w_member_social. Company-page sharing requires w_organization_social and a role that LinkedIn permits to publish for that page. Optional administrative diagnostics can be unavailable without blocking an otherwise eligible publishing request; the actual Posts API response determines whether it succeeds.<\/p>\n\n<p>Read the <a href=\"https:\/\/devenia.com\/plugins\/linkedin-autoposter\/\">product guide<\/a> and the <a href=\"https:\/\/learn.microsoft.com\/en-us\/linkedin\/marketing\/community-management\/shares\/posts-api\">LinkedIn Posts API documentation<\/a>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20editing%20a%20published%20post%20share%20it%20again%3F\"><h3>Will editing a published post share it again?<\/h3><\/dt>\n<dd><p>No. A publish-to-publish update is ignored. A previously unshared post can be queued when it enters published status again. Use the post's opt-out checkbox when it should not be shared.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20add%20a%20link%20in%20the%20first%20comment%3F\"><h3>Does the plugin add a link in the first comment?<\/h3><\/dt>\n<dd><p>No. Add any follow-up comment yourself. The supported template fields are {title}, {excerpt}, and {author}; {url} is not supported.<\/p><\/dd>\n<dt id=\"can%20one%20destination%20succeed%20while%20another%20fails%3F\"><h3>Can one destination succeed while another fails?<\/h3><\/dt>\n<dd><p>Yes. Inspect each destination's result before deciding whether further action is needed. The overall success status alone does not prove that both destinations received the update.<\/p><\/dd>\n<dt id=\"why%20did%20my%20website%27s%20featured%20image%20change%3F\"><h3>Why did my website's featured image change?<\/h3><\/dt>\n<dd><p>Selecting a gallery image also assigns that attachment as the WordPress post's featured image. Choose featured-first mode if existing featured images should take priority.<\/p><\/dd>\n<dt id=\"can%20assistants%20inspect%20the%20status%3F\"><h3>Can assistants inspect the status?<\/h3><\/dt>\n<dd><p>With the WordPress Abilities API available, administrators can call linkedin-autoposter\/get-status with an optional limit of 1\u201320, or linkedin-autoposter\/get-post-status with a positive post_id. Both require manage_options and read diagnostics without sending posts.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.17<\/h4>\n\n<ul>\n<li>Added: Separate post-language selections for personal profiles and company pages.<\/li>\n<li>Added: Native Polylang post-language detection and single-language WordPress support.<\/li>\n<li>Added: Excluded and unknown languages stop before image selection, with terminal skip diagnostics and no retries.<\/li>\n<\/ul>\n\n<h4>1.5.16<\/h4>\n\n<ul>\n<li>Fixed: Gallery-only sharing stops when no usable gallery image is available.<\/li>\n<li>Fixed: Gallery rotation advances only when gallery selection is needed.<\/li>\n<li>Fixed: Unicode text stays valid when shortened, and the final template is limited to 3000 characters.<\/li>\n<li>Updated: Setup instructions and publishing limitations match the available features.<\/li>\n<\/ul>\n\n<h4>1.5.15<\/h4>\n\n<ul>\n<li>Fixed: Company-page publishing is no longer blocked by optional LinkedIn admin diagnostics that require separate permissions.<\/li>\n<li>Improved: Company-page readiness keeps unavailable diagnostics visible while the Posts API remains the publishing authority.<\/li>\n<\/ul>\n\n<h4>1.5.14<\/h4>\n\n<ul>\n<li>Improved: Added durable per-post LinkedIn share attempt diagnostics.<\/li>\n<li>Improved: Added queue state tracking for queued, retrying, failed, and completed share jobs.<\/li>\n<li>Improved: Added target readiness checks for personal profile and company page publishing.<\/li>\n<li>Improved: Added reconnect-time checks for LinkedIn user and organization permission endpoints.<\/li>\n<li>Improved: Added read-only MCP abilities for status and per-post diagnostics when the Abilities API is available.<\/li>\n<li>Fixed: Company page publishing now reports missing or unconfirmed organization authorization before attempting the post.<\/li>\n<\/ul>\n\n<h4>1.5.13<\/h4>\n\n<ul>\n<li>Improved: Post sharing now runs in a background queue to avoid slowing down publish requests<\/li>\n<li>Improved: Added retry\/backoff handling for transient LinkedIn API failures (429\/5xx)<\/li>\n<li>Improved: Added locking to reduce duplicate posts and gallery rotation race conditions<\/li>\n<li>Improved: Local media files are now read directly when available instead of always fetching over HTTP<\/li>\n<li>Fixed: Removed legacy packaged subdirectory from plugin distribution<\/li>\n<\/ul>\n\n<h4>1.5.12<\/h4>\n\n<ul>\n<li>Fixed: Added automatic LinkedIn API version fallback when a requested version is retired<\/li>\n<li>Fixed: Persists first working LinkedIn API version to avoid repeated failures on future posts<\/li>\n<li>Fixed: Updated organization admin lookup call to avoid unsupported projection parameter<\/li>\n<\/ul>\n\n<h4>1.5.11<\/h4>\n\n<ul>\n<li>Fixed: Removed remaining percentage claim from upgrade notice section<\/li>\n<\/ul>\n\n<h4>1.5.10<\/h4>\n\n<ul>\n<li>Fixed: JavaScript now properly enqueued using wp_add_inline_script() instead of inline script tags<\/li>\n<li>Fixed: Removed marketing claims from readme per WordPress.org guidelines<\/li>\n<\/ul>\n\n<h4>1.5.8<\/h4>\n\n<ul>\n<li>Changed: Renamed plugin to \"Devenia Autoposter for LinkedIn\" for trademark compliance<\/li>\n<\/ul>\n\n<h4>1.5.7<\/h4>\n\n<ul>\n<li>Fixed: WordPress plugin check compliance - all PHPCS warnings resolved<\/li>\n<\/ul>\n\n<h4>1.5.6<\/h4>\n\n<ul>\n<li>Fixed: WordPress coding standards compliance (wp_safe_redirect, wp_parse_url, input sanitization)<\/li>\n<li>Fixed: Proper unslashing and sanitization of all user inputs<\/li>\n<li>Changed: Class renamed to Dlap_LinkedIn_Autoposter for proper prefixing<\/li>\n<\/ul>\n\n<h4>1.5.5<\/h4>\n\n<ul>\n<li>Fixed: Debug logging now respects WP_DEBUG setting<\/li>\n<li>Fixed: Date handling uses wp_date() for proper timezone support<\/li>\n<li>Added: Proper cleanup on plugin deactivation and uninstall<\/li>\n<\/ul>\n\n<h4>1.5.4<\/h4>\n\n<ul>\n<li>Fixed: HTML entities decode properly (emojis work now!)<\/li>\n<li>Fixed: Paragraph breaks preserved in LinkedIn posts<\/li>\n<\/ul>\n\n<h4>1.5.2<\/h4>\n\n<ul>\n<li>New: Gallery images automatically set as featured image on the post<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Added: Image size recommendations (1200x1200 square for best results)<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>New: Image Gallery with automatic rotation<\/li>\n<li>New: Image Source Priority (Featured first \/ Gallery first \/ Gallery only)<\/li>\n<li>New: Rotation indicator shows which image is next<\/li>\n<\/ul>\n\n<h4>1.4.2<\/h4>\n\n<ul>\n<li>Fixed: Excerpt now uses full 2700 characters (LinkedIn allows 3000)<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Changed: Image-only posts for maximum LinkedIn algorithm reach<\/li>\n<li>Simplified: Cleaner codebase, fewer API calls<\/li>\n<\/ul>\n\n<h4>1.3.5<\/h4>\n\n<ul>\n<li>Fixed: Updated to LinkedIn API version 202501<\/li>\n<li>Fixed: Image uploads via LinkedIn Images API<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>New: Default fallback image setting<\/li>\n<li>New: Smart image priority chain<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added: Featured image support<\/li>\n<li>Added: Site logo fallback<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: Post to company pages<\/li>\n<li>New: Post to personal + company simultaneously<\/li>\n<li>New: Email notifications before token expires<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Share published WordPress posts to a LinkedIn profile, company page, or both, with image selection and per-target diagnostics.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/es-ar.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/269769","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es-ar.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/es-ar.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/es-ar.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=269769"}],"author":[{"embeddable":true,"href":"https:\/\/es-ar.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/basicus"}],"wp:attachment":[{"href":"https:\/\/es-ar.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=269769"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/es-ar.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=269769"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/es-ar.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=269769"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/es-ar.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=269769"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/es-ar.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=269769"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/es-ar.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=269769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}