{"id":321859,"date":"2026-06-08T02:25:43","date_gmt":"2026-06-08T02:25:43","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/lihi-short-url\/"},"modified":"2026-06-26T01:21:22","modified_gmt":"2026-06-26T01:21:22","slug":"lihi-short-url","status":"publish","type":"plugin","link":"https:\/\/lt.wordpress.org\/plugins\/lihi-short-url\/","author":23496059,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.5","stable_tag":"1.0.5","tested":"7.0","requires":"5.5","requires_php":"7.4","requires_plugins":null,"header_name":"lihi Short URL","header_author":"lihi","header_description":"Adds a one-click \"lihi\" button to generate and copy short URLs, including posts, pages, media and all post-type list tables.","assets_banners_color":"","last_updated":"2026-06-26 01:21:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/lihi.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":127,"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":"lihidev","date":"2026-06-08 02:55:30"},"1.0.4":{"tag":"1.0.4","author":"lihidev","date":"2026-06-25 12:37:28"},"1.0.5":{"tag":"1.0.5","author":"lihidev","date":"2026-06-26 01:21:22"}},"upgrade_notice":{"1.0.5":"<p>Fixes Plugin Check security findings for admin AJAX parsing and output escaping; no action required.<\/p>","1.0.4":"<p>Adds modal short-URL creation options, JS-rendered Copy\/Edit states, lihi dashboard passthrough, password-based account verification, and current lihi API option handling; no action required.<\/p>","1.0.3":"<p>Unifies the lihi API client internals and clears saved plugin data on deactivation; no action required.<\/p>","1.0.2":"<p>Strengthens authentication site identity verification; no action required.<\/p>","1.0.1":"<p>Updates WordPress.org release metadata, package paths, and authentication site identity payload; no action required.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3586169,"resolution":"128x128","location":"assets","locale":"","width":251,"height":245}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1","1.0.4","1.0.5"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[83,266119,84,137,5530],"plugin_category":[50],"plugin_contributors":[266120],"plugin_business_model":[],"class_list":["post-321859","plugin","type-plugin","status-publish","hentry","plugin_tags-admin","plugin_tags-lihi","plugin_tags-media","plugin_tags-short-url","plugin_tags-url-shortener","plugin_category-media","plugin_contributors-lihidev","plugin_committers-lihidev"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/lihi-short-url\/assets\/icon-128x128.png?rev=3586169","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>lihi Short URL integrates the <a href=\"https:\/\/lihi.io\">lihi<\/a> short-link service into the WordPress admin. Editors can create short URLs from post and media list screens, choose a redirect domain, add tags, and add UTM parameters for non-media items, then copy the result without leaving WordPress. Existing short URLs become Copy controls, and administrators can open the matching lihi dashboard page to edit the link. This plugin is open source and maintained at <a href=\"https:\/\/github.com\/weedgood\/lihi-wp-plugin\">weedgood\/lihi-wp-plugin<\/a>.<\/p>\n\n<p>The plugin runs only inside <code>wp-admin<\/code>; it adds no front-end output and enqueues no scripts on public pages.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Adds a <strong>lihi Short URL<\/strong> column with a <strong>Create<\/strong> button to all public post-type list screens (posts, pages, custom post types).<\/li>\n<li>Adds the same Create \/ Copy controls to the Media Library list view and to the attachment detail panel in the media grid view.<\/li>\n<li>One-click copy: generates the short URL on demand via AJAX and writes it to the clipboard, with a manual-copy prompt if browser clipboard access is blocked.<\/li>\n<li>Creation modal: choose a redirect domain, add recommended or custom tags, and add UTM parameters for non-media items before creating a new short URL.<\/li>\n<li>UTM source and medium are loaded from the lihi account options, while campaign, term, and content remain free-text fields; media items hide UTM controls and submit blank UTM values.<\/li>\n<li>Reuses an existing short URL whenever one already exists for the item, so repeated clicks are idempotent.<\/li>\n<li>Copy buttons still confirm the upstream short URL exists before copying; if it was removed, the button returns to <strong>Create<\/strong> and opens the creation modal again.<\/li>\n<li>Marks items with <code>lihi_already = 1<\/code> post meta after a successful short-URL lookup\/create; the frontend renders those buttons as \"Copy\".<\/li>\n<li>Administrators can open existing short URLs, personal domain management, and UTM option management in the lihi dashboard through a browser-proof passthrough flow.<\/li>\n<li>Settings page under <strong>Settings \u2192 lihi Short URL<\/strong> for entering and verifying the lihi account email and password, showing connected-account details, and opening the lihi dashboard.<\/li>\n<li>Email verification is round-tripped through the lihi WordPress API before being saved, so an address the service rejects never becomes the active configuration.<\/li>\n<li>Per-account auth token is automatically cleared whenever the configured email changes.<\/li>\n<li>Localised; ships with Traditional Chinese (<code>zh_TW<\/code>).<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the lihi short URL service to identify the WordPress site, authenticate the site administrator, and create or look up short URLs. Without an internet connection the plugin cannot function.<\/p>\n\n<p><strong>Service: lihi WordPress API auth endpoints<\/strong> (<code>https:\/\/app.lihi.com\/api\/wordpress\/v1\/auth<\/code>)<\/p>\n\n<ul>\n<li>When data is sent: when the administrator saves account settings on the settings page (Settings \u2192 lihi Short URL), and on the first short-URL request after the cached auth token expires.<\/li>\n<li>What is sent: the administrator's email address, the entered lihi password, the site's hostname, and a site-scoped UUID stored in the <code>lihi_uuid<\/code> option. Account-creation consent is checked locally before the plugin calls the API. Login requests also send whether WordPress identifies the current request as mobile (<code>is_mobile<\/code>). The plugin stores the email, site UUID, and cached token, but does not store the password.<\/li>\n<\/ul>\n\n<p><strong>Service: lihi WordPress API short URL endpoints<\/strong> (<code>https:\/\/app.lihi.com\/api\/wordpress\/v1<\/code>)<\/p>\n\n<ul>\n<li>When data is sent: when the administrator opens the settings page after configuring an email (to display account info), when the Create modal loads redirect-domain and UTM options, when the administrator opens the lihi dashboard through passthrough, and when a user clicks a \"Create\", \"Copy\", or \"Edit\" button to generate, look up, copy, or edit a short URL. Media Create modals hide UTM controls and submit blank UTM values.<\/li>\n<li>What is sent: the bearer token returned by the lihi WordPress API auth endpoint, the post or attachment URL (<code>permalink<\/code> or attachment file URL, with UTM parameters appended when entered), the post type namespace (including the site's hostname), the post ID, the selected redirect domain, selected tags as a comma-separated string, selected UTM parameters appended to the destination URL, and passthrough nonce data (<code>challenge<\/code>, <code>nonce<\/code>, <code>verifier<\/code>, and optional target such as a short URL or lihi dashboard path) when opening the lihi dashboard.<\/li>\n<\/ul>\n\n<p>By using the plugin you agree that the data above is transmitted to the lihi service. Please review the lihi service's legal documents:<\/p>\n\n<ul>\n<li>Terms of Use: https:\/\/knowledge.lihi.io\/terms\/<\/li>\n<li>Privacy Policy: https:\/\/knowledge.lihi.io\/privacy-policy\/<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>lihi-short-url<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory, or install the plugin through the WordPress <strong>Plugins<\/strong> screen.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Go to <strong>Settings \u2192 lihi Short URL<\/strong>.<\/li>\n<li>Enter your lihi account email address and password, confirm account creation if needed, and click <strong>Save &amp; Verify<\/strong>. Existing accounts are bound by password; if the account still needs email verification, lihi will send a verification email.<\/li>\n<li>Once an email is saved, the <strong>Create<\/strong> button appears in a <strong>lihi Short URL<\/strong> column on every public post-type list screen and in the Media Library.<\/li>\n<\/ol>\n\n<p>The plugin requires the <code>manage_options<\/code> capability to view or change settings. Any logged-in user can use the <strong>Create<\/strong> button on screens they are otherwise allowed to access.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"why%20don%27t%20i%20see%20the%20create%20button%20in%20my%20list%20tables%3F\"><h3>Why don't I see the Create button in my list tables?<\/h3><\/dt>\n<dd><p>The UI hooks register once a lihi email is configured. Open <strong>Settings \u2192 lihi Short URL<\/strong> to save and verify the email address; redirect-domain selection is handled inside the Create modal and no longer blocks the button.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20change%20the%20email%20address%3F\"><h3>What happens if I change the email address?<\/h3><\/dt>\n<dd><p>Changing the email clears the cached auth token because it belongs to the previous account. After saving a new email and password, the plugin authenticates with that address on the next short-URL request.<\/p><\/dd>\n<dt id=\"can%20i%20manage%20redirect%20domains%20or%20utm%20options%20from%20wordpress%3F\"><h3>Can I manage redirect domains or UTM options from WordPress?<\/h3><\/dt>\n<dd><p>Yes. Administrators can open lihi personal-domain and UTM option management from the Create modal. The plugin asks for confirmation, creates a short-lived passthrough nonce, then opens the lihi dashboard in a new tab.<\/p><\/dd>\n<dt id=\"how%20do%20i%20disable%20the%20plugin%20without%20deactivating%20it%3F\"><h3>How do I disable the plugin without deactivating it?<\/h3><\/dt>\n<dd><p>Clear the email field on <strong>Settings \u2192 lihi Short URL<\/strong> and click <strong>Save &amp; Verify<\/strong>. With no email configured the plugin stops registering its admin UI. Deactivating the plugin also clears its saved settings and site UUID.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20run%20on%20the%20front-end%3F\"><h3>Does the plugin run on the front-end?<\/h3><\/dt>\n<dd><p>No. The plugin returns early on non-admin requests \u2014 it only adds admin UI and an <code>admin-ajax.php<\/code> handler.<\/p><\/dd>\n<dt id=\"which%20post%20types%20are%20supported%3F\"><h3>Which post types are supported?<\/h3><\/dt>\n<dd><p>All post types registered with <code>public =&gt; true<\/code>, plus the Media Library (both list mode and the grid view's attachment details panel).<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20store%20data%20in%20my%20database%3F\"><h3>Does the plugin store data in my database?<\/h3><\/dt>\n<dd><p>Yes \u2014 two active options (<code>lihi_email<\/code>, <code>lihi_uuid<\/code>), one transient (<code>lihi_token<\/code>), and per-item <code>lihi_already<\/code> post meta after a short URL succeeds. The lihi password is never stored. Options and transients are removed when the plugin is deactivated or deleted from the <strong>Plugins<\/strong> screen; any legacy <code>lihi_domain<\/code> option from older versions is also cleaned up.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Fixes Plugin Check security findings around admin AJAX request parsing and escaped output.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Adds JavaScript-rendered Create, Copy, and administrator-only Edit controls for the lihi Short URL column.<\/li>\n<li>Adds a creation modal with redirect-domain selection, click-to-add recommended tags, custom tags, UTM source \/ medium options, and free-text UTM fields for non-media items.<\/li>\n<li>Verifies existing short URLs before Copy and Edit; removed upstream links reset the item back to Create and reopen the creation flow.<\/li>\n<li>Adds clipboard-blocked fallback prompts so generated short URLs remain available for manual copy.<\/li>\n<li>Adds lihi dashboard passthrough for editing short URLs, managing personal domains, and managing UTM options.<\/li>\n<li>Updates the settings page with password-based email verification, account-creation consent, connected-account details, and a lihi dashboard service overview.<\/li>\n<li>Aligns the lihi WordPress API client with the current <code>site\/find<\/code> single-result response and <code>user\/options<\/code> domain \/ UTM options response.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Unifies authentication and short-URL calls under the lihi WordPress API client.<\/li>\n<li>Updates internal dependency composition for client, service, and store singletons.<\/li>\n<li>Clears saved settings, site UUID, and cached token when the plugin is deactivated.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Strengthens authentication identity checks by sending the site hostname and persistent site UUID in the authentication JSON payload instead of relying on the HTTP Host header.<\/li>\n<li>Sends WordPress' mobile-request flag (<code>is_mobile<\/code>) on auth login requests.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Aligns the plugin package directory, main file, and text domain with the WordPress.org slug.<\/li>\n<li>Removes dashboard-wide setup notices while keeping the settings page available.<\/li>\n<li>Updates release packaging validation for the <code>lihi-short-url<\/code> directory.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Adds a \"lihi\" short-URL button to all public post-type list tables and the Media Library.<\/li>\n<li>Settings page with email verification flow and per-account redirect domain selection.<\/li>\n<li>Traditional Chinese (<code>zh_TW<\/code>) translation included.<\/li>\n<\/ul>","raw_excerpt":"Adds lihi Short URL controls to create, copy, and edit short URLs for posts, pages, media, and public post types in the WordPress admin.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/321859","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lt.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lt.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=321859"}],"author":[{"embeddable":true,"href":"https:\/\/lt.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/lihidev"}],"wp:attachment":[{"href":"https:\/\/lt.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=321859"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=321859"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=321859"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=321859"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=321859"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=321859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}