WP Manifestindependent plugin directory
manifest / admin / drift-welcome

Drift: Welcome

Drift: Welcome — free WordPress plugin that replaces the wp-admin dashboard with a welcome panel and quick links, with optional white labelling and admin menu hiding. GPLv2 or later.

★ 0stars

Install

Download source zip No release zip yet

This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/drift-creative-systems/drift-welcome/archive/refs/heads/main.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

Drift Creative Systems

Drift: Welcome

Free WordPress plugin by Drift Creative Systems. Replaces the wp-admin dashboard with one welcome panel (logo, heading, message) and a grid of quick-link cards, so editors land somewhere useful. Optional white labelling of the admin bar, footer and login screen, and admin menus hidden from everyone except agency users. Settings are under Settings → Drift: Welcome.

  • WordPress.org slug: drift-welcome (submission pending)
  • Licence: GPL-2.0-or-later
  • Requires WordPress 6.0+, PHP 7.4+

The user-facing documentation is readme.txt, which WordPress.org displays. This file is for developers.

Structure

drift-welcome.php                              Bootstrap: duplicate-install guard, constants, requires, init on plugins_loaded
includes/
  class-drift-welcome-settings.php             The drift_welcome_settings option: defaults, per-tab save (SECTIONS), sanitising
  class-drift-welcome-admin.php                Settings → Drift: Welcome: tabs, Welcome/Quick links/Colours forms, shared media_field()/color_field(), admin footer, Bonsai Dashboard conflict notice
  class-drift-welcome-white-label.php          White Label tab (drift_welcome_white_label): WordPress branding, admin bar logo, footer text, login screen
  class-drift-welcome-admin-access.php         "Agency user" profile checkbox and menu hiding/blocking for everyone else (drift_welcome_hidden_menus)
  class-drift-welcome-dashboard.php            Removes every other dashboard widget, registers the panel, builds the quick links
assets/
  dashboard.css                                The panel. Dashboard only
  admin.css                                    Settings screen. Settings screen only
  admin.js                                     jQuery: image pickers, colour pickers, custom cards repeater
uninstall.php                                  Removes the options on every site in a network, and the agency user meta

How the dashboard replacement works

wp_dashboard_setup runs Drift_Welcome_Dashboard::add_widget() at priority 10 (registers drift_welcome_panel), then strip_other_widgets() at 999: explicit remove_meta_box() calls for the core widgets, then a sweep of $wp_meta_boxes['dashboard'] that removes anything else. Our widget has to be registered before the sweep, or it would remove itself. wp_welcome_panel is removed outright.

Widgets are removed from $wp_meta_boxes, not hidden with CSS, so a plugin added later is swept up without this plugin knowing its widget ID.

Bonsai Dashboard does the same job. If both are active, each sweep removes the other's widget and the dashboard is empty. A notice on the Dashboard, Plugins and settings screens says so.

Built in Drift_Welcome_Dashboard::get_quick_links(), in this order. Each card only shows when it leads somewhere the user can go:

Card Shows when
Pages / Posts User has edit_pages / edit_posts
Theme Setup theme-general-settings (ACF Options Page convention) is in the user's admin menu
Team The configured post type (default team) exists and the user can edit it
Analytics A URL is set
Custom cards Always, in save order. Rows without a label or URL are dropped at save time
Support A URL is set

Then drift_welcome_quick_links filters the list. Cards missing a label, URL or icon are dropped after the filter.

The custom cards repeater (assets/admin.js) clones a `