{"id":371962,"date":"2026-09-23T19:02:18","date_gmt":"2026-09-23T19:02:18","guid":{"rendered":"https:\/\/es.wordpress.org\/plugins\/cortaito\/"},"modified":"2026-09-23T19:39:52","modified_gmt":"2026-09-23T19:39:52","slug":"cortaito-url-shortener","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/cortaito-url-shortener\/","author":17836515,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.7.3","stable_tag":"trunk","tested":"7.1.2","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Cortaito","header_author":"Koke P\u00e9rez \/ Kokenet","header_description":"Acortador de URLs privado con estad\u00edsticas de clics, geolocalizaci\u00f3n y caducidad de enlaces. \u2615 Peque\u00f1o pero potente, como un caf\u00e9 de M\u00e1laga.","assets_banners_color":"1a1b36","last_updated":"2026-09-23 19:39:52","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/kokeperez.es\/cortaito-url-shortener","header_author_uri":"https:\/\/kokeperez.es","rating":0,"author_block_rating":0,"active_installs":0,"downloads":45,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.7.1":{"tag":"1.7.1","author":"kokenet","date":"2026-09-23 19:02:05","revision":3709995}},"upgrade_notice":{"1.6.1":"<p>Fixes .htaccess badge detection and admin UI notices. Update recommended.<\/p>","1.5":"<p>Important update: the plugin no longer requires a hardcoded subdomain. Configure your preferred short-link base from Cortaito \u2192 Settings.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3709995,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3709995,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3709995,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3709995,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.7.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3710129,"resolution":"1","location":"assets","locale":"","width":1200,"height":700},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3710129,"resolution":"2","location":"assets","locale":"","width":1200,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3710129,"resolution":"3","location":"assets","locale":"","width":1200,"height":1300},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3710129,"resolution":"4","location":"assets","locale":"","width":1200,"height":900}},"screenshots":{"1":"Links list with click counts and copy button.","2":"New link form with optional custom code and expiry date.","3":"Click statistics detail view.","4":"Settings page with subdomain and geolocation options."}},"plugin_section":[],"plugin_tags":[282339,7182,727,5364,5530],"plugin_category":[],"plugin_contributors":[268423],"plugin_business_model":[],"class_list":["post-371962","plugin","type-plugin","status-publish","hentry","plugin_tags-click-statistics","plugin_tags-link-tracking","plugin_tags-redirect","plugin_tags-short-links","plugin_tags-url-shortener","plugin_contributors-kokenet","plugin_committers-kokenet"],"banners":{"banner":"https:\/\/ps.w.org\/cortaito-url-shortener\/assets\/banner-772x250.png?rev=3709995","banner_2x":"https:\/\/ps.w.org\/cortaito-url-shortener\/assets\/banner-1544x500.png?rev=3709995","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/cortaito-url-shortener\/assets\/icon-128x128.png?rev=3709995","icon_2x":"https:\/\/ps.w.org\/cortaito-url-shortener\/assets\/icon-256x256.png?rev=3709995","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/cortaito-url-shortener\/assets\/screenshot-1.png?rev=3710129","caption":"Links list with click counts and copy button."},{"src":"https:\/\/ps.w.org\/cortaito-url-shortener\/assets\/screenshot-2.png?rev=3710129","caption":"New link form with optional custom code and expiry date."},{"src":"https:\/\/ps.w.org\/cortaito-url-shortener\/assets\/screenshot-3.png?rev=3710129","caption":"Click statistics detail view."},{"src":"https:\/\/ps.w.org\/cortaito-url-shortener\/assets\/screenshot-4.png?rev=3710129","caption":"Settings page with subdomain and geolocation options."}],"raw_content":"<!--section=description-->\n<p>Cortaito lets you create short links directly from your WordPress dashboard, track every click and see where your visitors come from \u2014 without sending data to any third-party shortening service.<\/p>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li>Create short links with auto-generated or custom codes<\/li>\n<li>Click statistics: country, city, device, browser and referrer<\/li>\n<li>Optional link expiration date<\/li>\n<li>Works on your main domain via <code>\/go\/CODE<\/code> \u2014 no extra subdomain needed<\/li>\n<li>Optional custom subdomain (e.g. <code>go.yourdomain.com<\/code>) configurable from the Settings page<\/li>\n<li>Geolocation via ip-api.com (can be disabled from Settings)<\/li>\n<li>Clean uninstall: removes all tables and options<\/li>\n<\/ul>\n\n<p><strong>External services:<\/strong><\/p>\n\n<p>When geolocation is enabled (on by default), the visitor's IP address is sent to <strong>ip-api.com<\/strong> to retrieve country and city data. No other personal information is transmitted. You can disable this at any time from <em>Cortaito \u2192 Settings<\/em>.<\/p>\n\n<ul>\n<li>ip-api.com service: https:\/\/ip-api.com<\/li>\n<li>ip-api.com privacy policy: https:\/\/ip-api.com\/docs\/legal<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>cortaito<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <em>Plugins<\/em> menu.<\/li>\n<li>Go to <strong>Cortaito \u2192 New link<\/strong> to create your first short link.<\/li>\n<li><em>(Optional)<\/em> Go to <strong>Cortaito \u2192 Settings<\/strong> to configure a custom subdomain.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20subdomain%20to%20use%20cortaito%3F\"><h3>Do I need a subdomain to use Cortaito?<\/h3><\/dt>\n<dd><p>No. By default, short links use the <code>\/go\/CODE<\/code> path on your main domain (e.g. <code>https:\/\/yourdomain.com\/go\/abc123<\/code>). A custom subdomain is optional.<\/p><\/dd>\n<dt id=\"how%20do%20i%20set%20up%20a%20custom%20subdomain%3F\"><h3>How do I set up a custom subdomain?<\/h3><\/dt>\n<dd><p>Go to <em>Cortaito \u2192 Settings<\/em>, enter your subdomain (e.g. <code>go.yourdomain.com<\/code>), save, and then point that subdomain to your server via a DNS A or CNAME record. The plugin will guide you through the .htaccess update.<\/p><\/dd>\n<dt id=\"can%20i%20disable%20geolocation%3F\"><h3>Can I disable geolocation?<\/h3><\/dt>\n<dd><p>Yes. Go to <em>Cortaito \u2192 Settings<\/em> and uncheck <em>Enable geolocation for click tracking<\/em>. You can also use the <code>cortaito_enable_geolocation<\/code> filter in your theme or a custom plugin.<\/p><\/dd>\n<dt id=\"is%20click%20data%20stored%20locally%3F\"><h3>Is click data stored locally?<\/h3><\/dt>\n<dd><p>Yes. All click data is stored in your WordPress database. The only external request made (when geolocation is enabled) is to ip-api.com to look up the visitor's country and city.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20delete%20the%20plugin%3F\"><h3>What happens when I delete the plugin?<\/h3><\/dt>\n<dd><p>All plugin data (tables, options) is removed automatically on deletion.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.7.3<\/h4>\n\n<ul>\n<li>Improved: Removed every remaining inline <code>style=\"\"<\/code> attribute from the admin screens (settings, links list, stats and new-link form); all rules now live in <code>assets\/css\/admin.css<\/code>, which is already enqueued via <code>wp_enqueue_style()<\/code>.<\/li>\n<li>Fixed (accessibility): The hidden page <code>&lt;h1&gt;<\/code> on each admin screen now uses WordPress core's <code>.screen-reader-text<\/code> class instead of <code>style=\"display:none\"<\/code>, so it stays available to screen readers instead of being hidden from everyone.<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Fixed: Removed the duplicate \"Tested up to\" header from the plugin's main PHP file; it is now declared only in readme.txt, as required by the Plugin Directory guidelines.<\/li>\n<li>Fixed: The consent\/redirect notice page no longer prints a raw <code>&lt;style&gt;<\/code> block; its CSS is now registered and enqueued via <code>wp_register_style()<\/code> \/ <code>wp_add_inline_style()<\/code>.<\/li>\n<li>Changed: The admin menu item no longer uses a crowded top-level position (20); it now sits near the bottom of the admin menu, below the core WordPress items.<\/li>\n<li>Removed: Compiled <code>.po<\/code>\/<code>.mo<\/code> translation files are no longer bundled in the plugin package, since translations are managed automatically through translate.wordpress.org. The <code>.pot<\/code> template remains for reference.<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Fixed: Deactivating the plugin no longer leaves a stray empty <code># BEGIN Cortaito<\/code> \/ <code># END Cortaito<\/code> block in <code>.htaccess<\/code> when the subdomain rule was never enabled.<\/li>\n<li>Fixed: The <code>.htaccess<\/code> block is now fully removed (markers included) on deactivation and on uninstall, instead of being left behind empty. Any duplicate leftover blocks from previous versions are also cleaned up automatically.<\/li>\n<li>Added: <code>uninstall.php<\/code> now removes the <code>.htaccess<\/code> block too, as a safety net for when the plugin is deleted without being deactivated first.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Fixed: \"Tested up to\" now reflects an actual released WordPress version.<\/li>\n<li>Fixed: Admin CSS\/JS moved from inline <code>&lt;style&gt;<\/code>\/<code>&lt;script&gt;<\/code> output to properly registered files via <code>wp_enqueue_style()<\/code>\/<code>wp_enqueue_script()<\/code>.<\/li>\n<li>Improved: Completed full i18n coverage \u2014 every remaining hardcoded admin string (menu labels, headings, table columns, form labels, notices) is now translatable.<\/li>\n<li>Added: English (en_US) translation included in <code>\/languages<\/code>, since the plugin's source strings are written in Spanish.<\/li>\n<li>Added: Explicit <code>load_plugin_textdomain()<\/code> call so translations load correctly outside of WordPress.org hosting.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Fixed: .htaccess block status badge now correctly reflects real file content for any domain.<\/li>\n<li>Fixed: Admin notices no longer appear inside the plugin header card.<\/li>\n<li>Fixed: Text Domain updated to match plugin slug (cortaito-url-shortener).<\/li>\n<li>Improved: Admin UI visual consistency aligned with Niquelao Image Optimizer.<\/li>\n<li>Improved: uninstall.php now removes all plugin options on deletion.<\/li>\n<\/ul>\n\n<h4>1.5<\/h4>\n\n<ul>\n<li>Links now work on any domain via \/go\/CODE path \u2014 no hardcoded domain.<\/li>\n<li>Added Settings page: configurable subdomain and geolocation toggle.<\/li>\n<li>Geolocation now uses HTTPS and can be disabled; documented as external service.<\/li>\n<li>Replaced str_shuffle() with random_bytes() for secure code generation.<\/li>\n<li>Full i18n support: all strings wrapped in translation functions (Text Domain: cortaito).<\/li>\n<li>Added uninstall.php for clean removal.<\/li>\n<li>Added wp_cache_get\/set on DB queries.<\/li>\n<li>Fixed: str_shuffle deprecated in PHP 8.3.<\/li>\n<\/ul>\n\n<h4>1.4<\/h4>\n\n<ul>\n<li>Added link expiration date support.<\/li>\n<li>Improved click tracking with referrer and browser detection.<\/li>\n<\/ul>\n\n<h4>1.3<\/h4>\n\n<ul>\n<li>Added geolocation via ip-api.com.<\/li>\n<li>Added device detection (Mobile \/ Tablet \/ Desktop).<\/li>\n<\/ul>\n\n<h4>1.2<\/h4>\n\n<ul>\n<li>Added click statistics page per link.<\/li>\n<li>Improved admin UI with copy-to-clipboard button.<\/li>\n<\/ul>\n\n<h4>1.1<\/h4>\n\n<ul>\n<li>Added .htaccess management for subdomain routing.<\/li>\n<li>dbDelta() used for table creation and upgrades.<\/li>\n<\/ul>\n\n<h4>1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Private URL shortener with click statistics, geolocation and link expiration. Small but mighty, like a M\u00e1laga espresso. \u2615","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/371962","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=371962"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/kokenet"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=371962"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=371962"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=371962"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=371962"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=371962"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=371962"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}