PHPackages                             upstatement/jigsaw - 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. [Admin Panels](/categories/admin)
4. /
5. upstatement/jigsaw

ActiveLibrary[Admin Panels](/categories/admin)

upstatement/jigsaw
==================

Provides an easy API for developers to tweak the admin options of a WordPress install

0.9.2(6y ago)1563.3k16[5 issues](https://github.com/Upstatement/jigsaw/issues)MITPHPPHP &gt;=5.3.0CI failing

Since Feb 27Pushed 6y ago35 watchersCompare

[ Source](https://github.com/Upstatement/jigsaw)[ Packagist](https://packagist.org/packages/upstatement/jigsaw)[ Docs](http://upstatement.com)[ RSS](/packages/upstatement-jigsaw/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (3)Versions (7)Used By (0)

[![Jigsaw Banner](https://cloud.githubusercontent.com/assets/1298086/5921029/e0c15824-a60e-11e4-9001-62b4e4fee1e6.jpg)](https://cloud.githubusercontent.com/assets/1298086/5921029/e0c15824-a60e-11e4-9001-62b4e4fee1e6.jpg)

Simple ways to make admin customizations for WordPress. You know all that brain space you saved for [memorizing hooks](http://wptavern.com/learn-three-wordpress-filters-a-day)? Use it for something better. For example, you can...

### Add a column to an admin page!

[](#add-a-column-to-an-admin-page)

###### `Jigsaw::add_column($post_type, $column_label, $callback_function, $order = 10);`

[](#jigsawadd_columnpost_type-column_label-callback_function-order--10)

```
Jigsaw::add_column('slides', 'Preview', function($pid){
  	$data = array();
	$data['post'] = new TimberPost($pid);
	Timber::render('admin/slide-table-preview.twig', $data);
}, 5);
```

```
Jigsaw::add_column(array('slides', 'post'), 'Preview', function($pid){
  	$data = array();
	$data['post'] = new TimberPost($pid);
	Timber::render('admin/slide-table-preview.twig', $data);
});
```

### Add a column to the users table!

[](#add-a-column-to-the-users-table)

###### `Jigsaw::add_user_column($column_label, $callback_function, $order = 10);`

[](#jigsawadd_user_columncolumn_label-callback_function-order--10)

```
Jigsaw::add_user_column('Favorite Band', function($uid){
  	echo get_user_meta($uid, 'favorite-band', true);
}, 5);
```

### Remove a column from the admin

[](#remove-a-column-from-the-admin)

###### `Jigsaw::remove_column($post_types, $column_slug);`

[](#jigsawremove_columnpost_types-column_slug)

```
Jigsaw::remove_column('slides', 'author');
```

```
Jigsaw::remove_column(array('slides', 'post'), 'author');
```

### Add something to the admin bar

[](#add-something-to-the-admin-bar)

###### `Jigsaw::add_toolbar_item($label, $url_or_callback_function);`

[](#jigsawadd_toolbar_itemlabel-url_or_callback_function)

```
Jigsaw::add_toolbar_item('Clear Cache', function(){
	$total_cache->flush_all();
});
```

### Add a dropdown

[](#add-a-dropdown)

###### `Jigsaw::add_toolbar_group($label, $items);`

[](#jigsawadd_toolbar_grouplabel-items)

```
$optionOne = new stdClass();
$optionOne->label = 'All Caches';
$optionOne->action = function(){
	$total_cache->flush_all();
};
$optionTwo = new stdClass();
$optionTwo->label = 'Page Cache';
$optionTwo->action = function(){
	$total_cache->flush_page_cache();
};
$optionThree = array('Home', 'http://localhost');
Jigsaw::add_toolbar_group('Clear Cache', array($optionOne, $optionTwo, $optionThree));
```

### Show an admin notice

[](#show-an-admin-notice)

###### `Jigsaw::show_notice($message, $level = 'updated');`

[](#jigsawshow_noticemessage-level--updated)

```
Jigsaw::show_notice('Cache has been flushed', 'updated');
```

...or

```
Jigsaw::show_notice('Error flushing cache, is the plugin activated?', 'error');
```

### Add a CSS file to the admin

[](#add-a-css-file-to-the-admin)

###### `Jigsaw::add_css($css_file);`

[](#jigsawadd_csscss_file)

```
Jigsaw::add_css('css/my-admin-style.css');
```

### Add a JS file to the admin

[](#add-a-js-file-to-the-admin)

###### `Jigsaw::add_js($css_file);`

[](#jigsawadd_jscss_file)

```
Jigsaw::add_js('js/my-admin-script.js');
```

JigsawPermalinks
================

[](#jigsawpermalinks)

### Set the base of the author permalink

[](#set-the-base-of-the-author-permalink)

###### `JigsawPermalinks::set_author_base($base_string);`

[](#jigsawpermalinksset_author_basebase_string)

```
JigsawPermalinks::set_author_base('writers');
```

After this you have to reset permalinks to see it working.

### Remove a custom post type permalink

[](#remove-a-custom-post-type-permalink)

###### `JigsawPermalinks::remove_permalink_slug($custom_post_type)`;

[](#jigsawpermalinksremove_permalink_slugcustom_post_type)

```
JigsawPermalinks::remove_permalink_slug('event');
```

or

```
JigsawPermalinks::remove_permalink_slug(array('event', 'book', 'my_other_cpt'));
```

### Set a custom permalink

[](#set-a-custom-permalink)

###### `JigsawPermalinks::set_permalink($post_type, $structure);`

[](#jigsawpermalinksset_permalinkpost_type-structure)

```
JigsawPermalinks::set_permalink('gallery', '/galleries/%year%/%gallery%');
```

###  Health Score

35

—

LowBetter than 80% of packages

Maintenance19

Infrequent updates — may be unmaintained

Popularity37

Limited adoption so far

Community22

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 91.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 ~215 days

Recently: every ~264 days

Total

6

Last Release

2291d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/692aa0b61ab3442df442597fb9526c13d82252ec3836c574edab4a0b9b38dc38?d=identicon)[jarednova](/maintainers/jarednova)

---

Top Contributors

[![jarednova](https://avatars.githubusercontent.com/u/1298086?v=4)](https://github.com/jarednova "jarednova (73 commits)")[![signal-intrusion](https://avatars.githubusercontent.com/u/5875587?v=4)](https://github.com/signal-intrusion "signal-intrusion (3 commits)")[![arenddeboer](https://avatars.githubusercontent.com/u/7022204?v=4)](https://github.com/arenddeboer "arenddeboer (2 commits)")[![awesomephant](https://avatars.githubusercontent.com/u/2758247?v=4)](https://github.com/awesomephant "awesomephant (1 commits)")[![pkarl](https://avatars.githubusercontent.com/u/8388?v=4)](https://github.com/pkarl "pkarl (1 commits)")

---

Tags

adminphpwordpresswordpressadmintweaks

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/upstatement-jigsaw/health.svg)

```
[![Health](https://phpackages.com/badges/upstatement-jigsaw/health.svg)](https://phpackages.com/packages/upstatement-jigsaw)
```

###  Alternatives

[wecodemore/current-admin-info

Displays info about the current admin screen and its globals, contextual hooks, etc.

852.7k](/packages/wecodemore-current-admin-info)

PHPackages © 2026

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