{"id":393918,"date":"2026-10-28T11:29:02","date_gmt":"2026-10-28T11:29:02","guid":{"rendered":"https:\/\/cn.wordpress.org\/plugins\/lesending\/"},"modified":"2026-10-28T11:28:26","modified_gmt":"2026-10-28T11:28:26","slug":"lesending","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/lesending\/","author":16982120,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.2","stable_tag":"1.1.2","tested":"7.1.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Lesending","header_author":"\u8001\u848b","header_description":"\u5728\u6587\u7ae0\u7f16\u8f91\u5668\u4e2d\u5c06\u5185\u5bb9\u53d1\u5e03\u5230\u672c\u7ad9\uff0c\u6216\u901a\u8fc7 REST API \/ \u6865\u63a5\u811a\u672c\u540c\u6b65\u5230\u8fdc\u7a0b WordPress \u7ad9\u70b9\uff0c\u53ef\u9009\u540c\u6b65\u56fe\u7247\u3002","assets_banners_color":"f9fcfe","last_updated":"2026-10-28 11:28:26","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.lezaiyun.com\/lesending.html","header_author_uri":"https:\/\/www.laojiang.me","rating":0,"author_block_rating":0,"active_installs":0,"downloads":54,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.2":{"tag":"1.1.2","author":"laobuluo","date":"2026-10-28 11:28:26","revision":3770539}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3770539,"resolution":"128x128","location":"assets","locale":"","width":128,"height":122},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3770539,"resolution":"256x256","location":"assets","locale":"","width":256,"height":242}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3770539,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3770539,"resolution":"1","location":"assets","locale":"","width":1637,"height":746},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3770539,"resolution":"2","location":"assets","locale":"","width":1600,"height":1102},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3770539,"resolution":"3","location":"assets","locale":"","width":2379,"height":1238}},"screenshots":[]},"plugin_section":[],"plugin_tags":[14236,14267,14512,2299,5699],"plugin_category":[],"plugin_contributors":[169988],"plugin_business_model":[],"class_list":["post-393918","plugin","type-plugin","status-publish","hentry","plugin_tags-bridge","plugin_tags-cross-post","plugin_tags-remote","plugin_tags-rest","plugin_tags-syndication","plugin_contributors-laobuluo","plugin_committers-laobuluo"],"banners":{"banner":"https:\/\/ps.w.org\/lesending\/assets\/banner-772x250.png?rev=3770539","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/lesending\/assets\/icon-128x128.png?rev=3770539","icon_2x":"https:\/\/ps.w.org\/lesending\/assets\/icon-256x256.png?rev=3770539","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/lesending\/assets\/screenshot-1.png?rev=3770539","caption":""},{"src":"https:\/\/ps.w.org\/lesending\/assets\/screenshot-2.png?rev=3770539","caption":""},{"src":"https:\/\/ps.w.org\/lesending\/assets\/screenshot-3.png?rev=3770539","caption":""}],"raw_content":"<!--section=description-->\n<p>Lesending lets you choose a publish target while editing: local site only, local plus remote, or remote only (after a successful sync the local post is saved as a draft and the mode resets to local only).<\/p>\n\n<p>This plugin is developed by Lezaiyun Studio and maintained by LaoJiang.<\/p>\n\n<p>Official product page: https:\/\/www.lezaiyun.com\/lesending.html<\/p>\n\n<p>Developer blog: https:\/\/www.laojiang.me<\/p>\n\n<h4>Connection modes<\/h4>\n\n<ul>\n<li>REST + Application Passwords: for sites with a working WordPress REST API. The plugin auto-detects \/wp-json, \/index.php\/wp-json, and index.php?rest_route= endpoints.<\/li>\n<li>Bridge file: when remote REST is restricted, upload a standalone PHP bridge to the remote WordPress root and authenticate with a shared secret.<\/li>\n<\/ul>\n\n<h4>Editor<\/h4>\n\n<ul>\n<li>Gutenberg sidebar panel<\/li>\n<li>Classic editor meta box<\/li>\n<li>Sync log meta box with per-site results<\/li>\n<\/ul>\n\n<h4>Media sync<\/h4>\n\n<ul>\n<li>Toggle image sync in plugin settings<\/li>\n<li>When enabled, content images and the featured image are uploaded to the remote media library and URLs are rewritten<\/li>\n<li>Supports REST media upload and bridge sideload<\/li>\n<\/ul>\n\n<h4>Settings<\/h4>\n\n<ul>\n<li>Card-style remote site list<\/li>\n<li>Connection test for REST and bridge modes<\/li>\n<li>Bridge script download (optional custom .php filename)<\/li>\n<\/ul>\n\n<p>Uninstalling the plugin removes options and related post meta (see uninstall.php).<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>lesending<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate Lesending under Plugins.<\/li>\n<li>Go to Settings \u2192 Lesending, enable remote publishing, and add remote sites.<\/li>\n<li>For bridge mode: download the bridge script, upload it to the remote WordPress root (same folder as wp-config.php), set the secret and user ID, then enter the bridge URL and the same secret on this site.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20does%20rest%20mode%20require%20on%20the%20remote%20site%3F\"><h3>What does REST mode require on the remote site?<\/h3><\/dt>\n<dd><p>The remote site must be WordPress, with Application Passwords enabled for a user who can publish posts. The REST API must not be fully blocked by a security plugin. For plain permalinks (index.php?rest_route=), the plugin tries to discover the REST entry automatically.<\/p><\/dd>\n<dt id=\"when%20should%20i%20use%20bridge%20mode%3F\"><h3>When should I use bridge mode?<\/h3><\/dt>\n<dd><p>Use the bridge when remote REST is unavailable, blocked, or returns 404. Upload the downloaded bridge file (or a custom .php name) to the remote site root, set LESENDING_BRIDGE_SECRET and LESENDING_BRIDGE_USER_ID, and enter the same secret in Lesending settings.<\/p><\/dd>\n<dt id=\"which%20images%20are%20synced%3F\"><h3>Which images are synced?<\/h3><\/dt>\n<dd><p>Only images from this site's uploads directory (wp-content\/uploads), including content images, block images, and the featured image. External CDN or third-party URLs are not downloaded. Up to 30 images per post.<\/p><\/dd>\n<dt id=\"how%20do%20i%20disable%20image%20sync%3F\"><h3>How do I disable image sync?<\/h3><\/dt>\n<dd><p>Uncheck \"Sync images\" under Settings \u2192 Lesending, or use the <code>lesending_sync_media<\/code> filter in code.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Plugin Check compliance: English readme, languages folder, bridge shipped as downloadable template with ABSPATH-protected stub.<\/li>\n<li>Admin download uses WP_Filesystem; stricter input sanitization; settings view variable prefixes.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Security hardening: remote sync requires publish_posts; credentialed requests use wp_safe_remote_* with no redirects; HTTPS required by default.<\/li>\n<li>Credential storage upgraded to AES-256-GCM (legacy ciphertext still supported); public editor site list no longer exposes remote usernames.<\/li>\n<li>Bridge: minimum 32-char secret, explicit user ID, optional IP allowlist, sideload limits, minimal ping payload.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Sync content images and featured image to the remote media library (REST upload \/ bridge sideload).<\/li>\n<li>Settings toggle for image sync.<\/li>\n<li>Bridge refactor: validate secret before loading WordPress; improved ping and error JSON.<\/li>\n<li>REST discovery for index.php?rest_route= and Link header parsing.<\/li>\n<li>Card-style settings UI; connection tests can reuse a saved bridge secret.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: REST sync, three publish modes, block editor sidebar, settings page, and uninstall cleanup.<\/li>\n<\/ul>","raw_excerpt":"Publish posts locally or sync them to remote WordPress sites via REST API or a bridge script.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/393918","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=393918"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/laobuluo"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=393918"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=393918"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=393918"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=393918"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=393918"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=393918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}