PHPackages                             the-markup/wp-shlink - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. the-markup/wp-shlink

ActiveWordpress-plugin[Utility &amp; Helpers](/categories/utility)

the-markup/wp-shlink
====================

Create and manage Shlink short links from WordPress

0.4.2(1y ago)16262[15 PRs](https://github.com/the-markup/wp-shlink/pulls)GPL-2.0-or-laterPHPCI passing

Since Jan 14Pushed 1y ago1 watchersCompare

[ Source](https://github.com/the-markup/wp-shlink)[ Packagist](https://packagist.org/packages/the-markup/wp-shlink)[ RSS](/packages/the-markup-wp-shlink/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (8)Dependencies (2)Versions (25)Used By (0)

Smol Links
==========

[](#smol-links)

Create and manage Shlink short links from WordPress

Description
-----------

[](#description)

A WordPress dashboard interface for managing a self-hosted [Shlink URL shortener](https://shlink.io/) instance.

- Create and edit Shlinks short links from a manager interface
- Optionally generate new short URLs upon saving new posts
- Manage multiple short URL domains, with an assigned default
- Automatically tag each short link, configurable with a filter hook
- Customize long URLs automatically using a filter hook (e.g., to add query arguments)
- Integrates with [WordPress Sentry](https://wordpress.org/plugins/wp-sentry-integration/) plugin, if installed

**Filter hooks**

- `smol_links_tags` - assigns tags to each saved short link (default: `["smol-links-server:$hostname", "smol-links-user:$username"]`)
- `smol_links_long_url` - automatically adjust the long URL redirect
- `smol_links_manager_tabs` - customizes the manager tabs (array: \["Tab label" =&gt; \[*Shlink API query*\]\])

Developer setup
===============

[](#developer-setup)

**Developer dependencies:**

- [node.js](https://nodejs.org/) (tested on v20)
- [Docker Desktop](https://www.docker.com/products/docker-desktop)

**Build and start:**

```
./bin/build
./bin/start

```

**Running tests:**

```
docker compose exec web composer --working-dir="/var/www/html/wp-content/plugins/smol-links" test

```

Installation
------------

[](#installation)

1. Upload `smol-links` folder to the `/wp-content/plugins/` directory
2. Activate the plugin through the 'Plugins' menu in WordPress
3. Configure the **Smol Links** settings from your WordPress dashboard

Screenshots
-----------

[](#screenshots)

### 1. Create and manage Shlink short links from WordPress.

[](#1-create-and-manage-shlink-short-links-from-wordpress)

[![Create and manage Shlink short links from WordPress.](assets/screenshot-1.jpg)](assets/screenshot-1.jpg)

### 2. Configure your self-hosted Shlink server and optionally generate a short URL whenever a post is published.

[](#2-configure-your-self-hosted-shlink-server-and-optionally-generate-a-short-url-whenever-a-post-is-published)

[![Configure your self-hosted Shlink server and optionally generate a short URL whenever a post is published.](assets/screenshot-2.jpg)](assets/screenshot-2.jpg)

### 3. The post editor includes the short URL in the sidebar.

[](#3-the-post-editor-includes-the-short-url-in-the-sidebar)

[![The post editor includes the short URL in the sidebar.](assets/screenshot-3.jpg)](assets/screenshot-3.jpg)

Changelog
---------

[](#changelog)

### 0.4.2

[](#042)

- Fix bug causing settings to not get saved
- Update dependencies

### 0.4.1

[](#041)

- Validate and sanitize settings

### 0.4.0

[](#040)

- Add search to manager interface
- URL validation on form inputs

### 0.3.1

[](#031)

- Remove Composer from installation

### 0.3.0

[](#030)

- Add pagination to Smol Links manager interface

### 0.2.0

[](#020)

- Update to Shlink v3 API

### 0.1.1

[](#011)

- Fix a bug with the Short Links manager
- Upgrade dependencies

### 0.1.0

[](#010)

- Release to WordPress plugin directory
- Security improvements

### 0.0.1

[](#001)

- Generate short URLs upon saving a post
- Create/edit short URLs from a manager

Upgrade Notice
--------------

[](#upgrade-notice)

###  Health Score

32

—

LowBetter than 72% of packages

Maintenance41

Moderate activity, may be stable

Popularity16

Limited adoption so far

Community12

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 83.3% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~116 days

Recently: every ~14 days

Total

9

Last Release

655d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/eebb9744a31549664449303d6529cda313d6879593b79a1147c85781834dac0d?d=identicon)[themarkup](/maintainers/themarkup)

---

Top Contributors

[![dphiffer](https://avatars.githubusercontent.com/u/38114?v=4)](https://github.com/dphiffer "dphiffer (184 commits)")[![BatMiles](https://avatars.githubusercontent.com/u/5900353?v=4)](https://github.com/BatMiles "BatMiles (36 commits)")[![jajjaj58](https://avatars.githubusercontent.com/u/77450168?v=4)](https://github.com/jajjaj58 "jajjaj58 (1 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/the-markup-wp-shlink/health.svg)

```
[![Health](https://phpackages.com/badges/the-markup-wp-shlink/health.svg)](https://phpackages.com/packages/the-markup-wp-shlink)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
