WP MyLinks
11 releases · latest v1.1.1 · August 25, 2026
v1.1.1
Current release
Maintenance release: WordPress 7.1 compatibility and housekeeping.
New
- Third-party libraries section in this readme crediting the bundled open-source libraries (QR Code Generator for JavaScript, Select2, Simple Icons), and the bundled Select2 stylesheet regained its MIT license banner.
Improved
- The MyLinks admin menu now shows the plugin's own brand icon instead of a generic Dashicon.
- More Plugins tab refreshed: External Marketplace Buttons added, PixMapr and PixSwipr now link to their released product pages, and placeholder links for unreleased plugins were removed so no card can lead to a missing page.
- The two buttons on each More Plugins card no longer animate on hover; their hover colors are unchanged.
Fixed
- The "Export This Page" button in the Import/Export metabox rendered wider than its container and off-center.
Misc
- Introduced the WP MyLinks Pro section in the readme.
- Tested up to WordPress 7.1.
v1.1.0
Headline features
- New Section headings. A link row can now be a heading that groups the links below it. Set a row's type to "Heading" and it renders as a section label instead of a button.
- New Search / filter bar. An optional per-page search box filters the links as the visitor types. Section headings hide when every link under them is filtered out, and a "no matches" message shows when nothing is found. Everything runs in the browser, so no data leaves the page.
- New HTML blocks. A link row can be an "HTML Block" for a newsletter form, a table, or any embed, placed anywhere in the link order. Raw scripts and iframes are kept only for users allowed to post unfiltered HTML; everyone else gets a safe subset.
- New Custom font family. Set a page font globally on Settings, General or per page on the editor. WP MyLinks does not fetch fonts from third parties, to keep visitor data private, so name a font your site already loads.
-
New
Icon-font classes for additional social platforms. Instead of uploading an image, enter an icon class (for example
fa-brands fa-github) from an icon font your site already loads. An uploaded image still takes priority. -
New
Google Tag Manager and GA4 friendly. Every link click pushes a
wp_mylinks_clickevent (with the link URL, title, and page ID) towindow.dataLayerwhen it exists. No effect when the dataLayer is absent. - New Choose which post types feed the Link URL picker. A new Tools setting lists your site's public post types, with Posts, Pages, and Products (when WooCommerce is active) checked by default, and adds new ones automatically as plugins or themes register them. Uncheck any you do not want to link to. Link Collections are always available.
- New Per-link click counter. Every link click is counted via a non-blocking, privacy-respecting ping to your own site (no cookies, no IPs, no third parties; bots filtered). Totals appear in a new Clicks column on the MyLinks list.
- New QR code generation. A QR Code box on the MyLink editor renders a scannable code for the page URL, generated entirely in the browser by a bundled open-source library, with one-click PNG download.
- New Accent colors. Four color controls (page background, button background, button text, text) available globally on Settings → General and per page on the editor. They layer on top of all 16 themes; empty values leave the theme untouched.
- New SVG social icons. The 8 default social icons are now crisp, brand-colored SVG chips (0.6 to 2.4 KB each) that stay sharp at any size and remain visible on dark themes. Custom uploaded icons keep working unchanged; the legacy PNGs remain shipped for anyone referencing them directly.
- New More Plugins tab. A settings tab introducing other plugins by the same author. It stays inside its own tab, no dashboard widgets, no admin notices, nothing on your pages.
- New Import & Export (Tools tab). Export your plugin settings, all MyLink pages (filterable by status, Link Collections included), or a single page as JSON, and import them on any site. Each MyLink editor also gets an Import/Export side box to back up or transplant one page's configuration. Page imports always create new pages, so nothing existing is ever overwritten.
- Improved Scripts tab redesigned. Script and CSS fields are now proper code editors, monospace, tall, inset, with the Header/After Body/Footer fields side by side.
- Improved The Link URL picker searches your whole site. It queries the post types you chose as you type, so every matching post, page, product, or Collection is reachable, instead of a short preloaded list.
- Improved The Links editor shows only the fields a row uses. Choosing a row's type (Link, Heading, or HTML Block) hides the unrelated fields, and turning on Card Layout hides the video and embed fields it replaces.
- Improved Editor text areas restyled. The per-page script, custom styles, HTML block, and meta description fields now use the same styled boxes as the Scripts tab, monospace for the code fields.
- Improved The "Delete All Plugin Data on Uninstall" option moved to Tools → Data Management, in its own settings group.
The big one: CMB2 replaced by a native fields system
- Improved The bundled CMB2 framework (3.6 MB, 340 files, 84% of the plugin) has been replaced by WP MyLinks' own lightweight fields system. The download shrank from 4.3 MB to under 1 MB.
- Improved Zero migration: the new system writes byte-identical post meta, verified by an automated storage-contract test suite against CMB2 itself before the swap. Existing pages open, edit, save, and render exactly as before.
- Improved No more risk of conflicts with other plugins bundling different CMB2 versions, and no dependence on a third-party framework's release cycle.
Full admin redesign
- Improved The settings page and the MyLink editor were redesigned: a proper settings header, icon tabs, card layouts, toggle switches, tidy multi-column metabox layouts, collapsible link rows, and side-by-side media buttons.
- Improved Measured accessibility pass on the new admin: contrast ratios computed and fixed where they fell short of WCAG (including a footer link that had shipped at 1.9:1 since 1.0.8), keyboard focus rings throughout, ARIA on icon-only controls.
- Improved Editing a Collection link now updates every MyLink page that uses it, link rows resolve the Collection's current URL at render time instead of a stale copy.
- Improved WordPress's raw Custom Fields box no longer appears on MyLink editors.
Developer platform
-
New
Documented public API (see API.md in the repository):
wp_mylinks_link_dataandwp_mylinks_link_renderfilters for the link loop,wp_mylinks_meta_boxesandwp_mylinks_field_typesfor registering fields,wp_mylinks_settings_tabsfor settings tabs, and thewp_mylinks_track_link_clickaction with documented analytics data shapes.
Bug fixes
-
Fixed
The global Default Schema Type could never be saved as
Organization, the sanitizer lowercased the value before comparing it. Per-page overrides were unaffected. - Fixed The page-view counter now increments atomically (concurrent visits no longer lose counts) and filters out bots and crawlers.
- Fixed A PHP 8 "Attempt to read property on string" warning fired on every uncached oEmbed render.
- Fixed Other plugins' admin notices no longer render inside the plugin's settings header.
- Misc The plugin's admin footer now shows the WP MyLinks version on plugin screens, the number support will ask you for.
- Misc Codebase fully normalized to the WordPress Coding Standards; PHPCS now runs clean as a release gate.
v1.0.8
Headline features
-
New
Schema.org JSON-LD output for every MyLinks page. Choose
Person(default) orOrganizationeither globally on Settings → MyLinks → Global, or per-page on the MyLink editor. Output includes name, image, description, page URL, and asameAsarray populated from all configured social profiles, perfect for Google's Knowledge Graph. Defers automatically to Yoast SEO when Yoast is handling schema. -
New
ProfilePage schema wrapper (optional toggle on Settings → MyLinks → Global). When enabled, the JSON-LD output becomes a
@grapharray containing the Person/Organization entity, a ProfilePage that references it via@id, and a BreadcrumbList. This is the pattern used by X (Twitter), GitHub, and LinkedIn profiles. Helps search engines and AI tools recognize the URL as a canonical profile page. - New BreadcrumbList schema automatically emitted alongside the Person/Organization schema whenever JSON-LD is enabled. Two-step path (Home → page name). Google uses this in SERPs in place of the raw URL line.
- New Open Graph & Twitter Card meta tags. Share previews on Facebook, X (Twitter), LinkedIn, and Discord now display your MyLink page properly. Configure globally or per-page; the share image falls back gracefully through per-page → global → Yoast → avatar so something always renders. Defers to Yoast when Yoast is handling Open Graph.
- New Default share-image option (recommended size 1200×630) on Settings → MyLinks → Global, with per-page overrides on the MyLink editor.
-
New
Twitter / X handle field on Settings → MyLinks → Global. Used for
twitter:siteandtwitter:creator. The@is added automatically if missing. - New Additional Social Platforms metabox on the MyLink editor (placed right under the existing Social Media metabox so it's impossible to miss). Add Threads, Bluesky, GitHub, Mastodon, WhatsApp, Telegram, Signal, or any other platform via a CMB2 repeater with sortable rows. Each row accepts a name, profile URL, and optional icon. Existing hardcoded 8 platforms (Facebook, Twitter, LinkedIn, Instagram, YouTube, Pinterest, TikTok, Discord) are preserved exactly, no migration risk.
-
New
Accessibility improvements: skip-to-content link, ARIA labels on every social icon and link button, "opens in new tab" hints for screen readers, graceful avatar
altfallback when the name is empty, decorative images correctly marked with emptyalt. WCAG 2.2 compliant.
Permalink fixes (the long-standing 404 bug)
-
Fixed
Permalink conflicts that caused 404s when MyLink slugs collided with pages, posts, or pagination. The post type now registers with a real
mylinkrewrite slug and resolves slug-only URLs through the WordPressrequestfilter with proper collision detection, no more fragilepre_get_postshacks. - Fixed Activation hook was registered against the wrong file path, so rewrite rules were never flushed on activation. Activation now flushes rules correctly, and a one-time auto-flush runs on the first admin page load after every update so existing installs heal themselves transparently.
- Fixed Slug-stripping no longer corrupts post permalinks whose slug happens to contain the word "mylink". The replacement is now anchored to the home URL via regex.
-
Fixed
pre_get_postscallback was registered twice and contained a logic bug ('' == isset(...)) that made the post-type override fire on every front-page query. -
Fixed
wp_mylinks_requestfilter no longer breaks when other plugins add query vars (the brittle2 != count($query->query)check has been removed). -
Added
Canonical 301 redirect from
/mylink//to//for SEO consistency. -
Added
wp_mylinks_cpt_rewrite_slugfilter so developers can change the internal CPT slug without breaking public URLs.
Data preservation & uninstall
-
Fixed
Deactivation no longer deletes user options. The previous code wiped every plugin setting on deactivation, which destroyed configuration for anyone who toggled the plugin off temporarily. A separate
uninstall.phpnow handles true uninstallation. - New "Delete Plugin Data on Uninstall?" option on Settings → MyLinks → Global. Off by default, preserve your settings across uninstall/reinstall cycles. Enable it for a clean removal of all plugin options and oEmbed caches.
-
Added
WP_MYLINKS_PURGE_POSTS_ON_UNINSTALLconstant for users who want a complete data purge (including posts) on plugin deletion. -
Added
Proper
uninstall.phpthat cleans up options and oEmbed transients (when opted in), but preserves MyLink posts by default.
Security & code quality
-
Security
Hardened admin settings page: every option output is now properly escaped, every
register_setting()has an explicitsanitize_callback, and tab parameters use a strict allowlist. -
Security
Admin column rendering now escapes URLs with
esc_url()andesc_attr(). -
Security
All user-supplied script/style content output through tightly-scoped
wp_kses()allowlists. Admin-only withmanage_optionscapability gating remains. Custom-script settings now use a dedicatedwp_mylinks_sanitize_raw_script()callback that strips control characters and normalizes line endings while preserving raw HTML/JS/CSS content. - Changed Front-end template refactored to produce clean, predictable HTML output with consistent two-space indentation. PHP control structures now sit at column 0 so their whitespace doesn't leak into the rendered markup.
-
Changed
Empty `
and` wrappers are no longer emitted when those sections have no content (eliminates ~60px of phantom vertical space). -
Changed
Inline `
blocks consolidated from three separate tags into one` block per page. -
Changed
Asset enqueueing moved to `
for stylesheets and just-before-` for scripts (proper WordPress convention). -
Changed
Renamed the global
Pluginclass toWp_Mylinks_Front_Page_Pluginto avoid namespace collisions with other plugins. -
Changed
Renamed misspelled function
wp_mylinks_custom_sidebar_suppporttowp_mylinks_custom_sidebar_support(with backward-compat alias). -
Misc
Frontend template upgraded `
to` for better semantic markup. -
Misc
Invalid duplicate
id="link_count"on multiple anchors replaced with alink_countclass. Obsoletealign="middle"attribute removed. Image alt text reflects link title. - Misc `` added to identify plugin output for support.
Internationalization
-
New
Eleven new translatable strings on the MyLink CMB2 metaboxes (
Choose Avatar,Choose Icon× 8,Choose Favicon,Select a link…) that were previously hard-coded English. -
New
Submenu titles for the Collection sidebar (
UTM Campaign Builder,Support) and admin sidebar quick links (Rate This Plugin,Buy Me a Coffee, etc.) are now translatable. -
Misc
Added
/* translators: */comments to everysprintf()call in admin output for translator clarity. -
Misc
All
add_submenu_page(),add_meta_box(), and CMB2 field labels now flow through__()/_x()with thewp-mylinkstext domain.
Hooks & filters for extension
-
Added
New action hooks for plugin extension:
wp_mylinks_head,wp_mylinks_body_open,wp_mylinks_before_links,wp_mylinks_after_links,wp_mylinks_footer. -
Added
New filter hooks:
wp_mylinks_schema_data(mutate JSON-LD before encoding),wp_mylinks_og_meta(mutate Open Graph meta lines before output). -
Added
wp_mylinks_extract_youtube_id()helper recognizes regular, short (youtu.be), embed, mobile, and shorts YouTube URLs. Previously, only the standard?v=URL format worked.
Frontend assets
-
Misc
Frontend JavaScript modernized: added
'use strict', switched to an IIFE, validates YouTube IDs before injecting them, lazy-loads thumbnails, supports keyboard activation (Enter/Space), forces HTTPS for thumbnail URLs. -
Misc
Frontend CSS rewritten to WordPress CSS Coding Standards: tab indentation, alphabetized selectors per section, the
@keyframes slidebgblock consolidated from three duplicates to one, removed long-obsolete-webkit-/-moz-border-radius and gradient prefixes, and the minified file regenerated to match the source. -
Added
.screen-reader-texthelper class with WCAG-compliant focus styling for the new skip-to-content link. -
Added
Bundled
globe.svgfallback icon for Additional Social Platforms with no custom icon configured.
Admin assets
- Misc Admin assets (CSS and JS) now only enqueue on plugin-relevant screens (the settings page and the mylink/mylinks-collection edit screens) instead of every wp-admin page, eliminating the prior risk of leaking styles into other admin areas.
-
Misc
Admin JavaScript modernized: wrapped in IIFE with
'use strict', switched to event delegation, no more globalmediaUploaderleak. Reusable media-frame helper now drives both the favicon and the new Open Graph share-image pickers without conflict. - New Friendly admin footer text on plugin screens with a 5-star review prompt linking to the WordPress.org reviews page. Footer text on every other admin page is left untouched.
WordPress 7.0 compatibility
- Misc Bumped minimum WordPress version to 6.0 and tested up to WordPress 7.0.
- Misc Audited the codebase for PHP 8.x compatibility.
-
Misc
View counter switched to atomic
update_post_meta()and skips admin/cron requests for cleaner counts.
Show 8 earlier releases
v1.0.7
Security
- Fixed Cross Site Scripting (XSS) vulnerability as discovered and reported by SOPROBRO to Patchstack, reported by Darius Sveikauskas (Kudos to SOPROBRO, Darius Sveikauskas and Patchstack)
Fixed
- Fixed JavaScript issues preventing users to add new links
- Fixed several unsanitized fields on the MyLinks page output
- CSS issues making several templates not responsive on smaller screens
New
- Added extra options for Transparent avatar style and adding scripts to after the open tag
Misc
- Changed and optimized several fields on the MyLinks editor screen
- Updated CMB2 to the latest version 2.11.0
- Updated select2.min.js to the latest version 4.1.0-rc.0
- Optimized a large part of the MyLinks page template
- Compatibility with latest version of WordPress v6.6.2
v1.0.6
New
- Enhanced Media Embedding: In addition to embedding YouTube videos, you can now seamlessly embed media from any site supported by WordPress.
- Organized Link Collections: Easily save and access important links in a dedicated collections page, eliminating the need to repeatedly enter the same links manually.
- Searchable Link Lists: The Link input field now includes a search function, allowing you to find previously defined links from your Links Collection, existing posts, or pages by default.
- Added Discord social media support
Fixed
- Flush permalink issue
Misc
- Compatibility with latest version of WordPress
v1.0.5
New
- Youtube Video embed
- Card-style Link
- Avatar Styles
- Social Buttons position
Fixed
- Flush permalink issue
Misc
- CSS issues
- Compatibility with latest version of WordPress
v1.0.4
Fixed
- CSS issues
Misc
- Compatibility with latest version of WordPress
v1.0.3
New
- Klepon Viral theme
Fixed
- CSS issues
- Bug on MyLink as front page not redirect to home page
- 404 permalink issue
v1.0.2
New
- Social icon for Pinterest
- Individual custom favicon input on every MyLinks Page
- Individual custom header script input on every MyLinks Page
- Individual custom footer script input on every MyLinks Page
- Individual custom style input on every MyLinks Page
Fixed
- Several icons not showing correctly
v1.0.1
New
- Set MyLinks page as front page
Fixed
- Permalink rewrite issue
Changes
- Compatibility with latest version of WordPress
v1.0.0
Changes
- Initial release: Hello World!