NexVibe Self-Hosted Font Manager
NexVibe Self-Hosted Font Manager
Description
This plugin is a self-hosted font manager for WordPress. No account and no per-font fees for your own font files — everything happens on your own site.
Key features
- Upload custom font files (TTF, OTF, WOFF, WOFF2) directly, handled by WordPress’s own uploader.
- Curated font packs for Latin, Bangla/Bengali, Arabic, Devanagari (Hindi/Marathi/Nepali), Cyrillic (Russian/Ukrainian/etc.), and CJK (Chinese/Japanese/Korean) scripts — useful for multilingual and non-Latin-script sites, not just English ones.
- Smart per-page loading: only the fonts a specific page actually needs are enqueued there, instead of loading your entire font library on every page.
- Automatic font detection via the
fontik-font-{slug}CSS class or the[fontik font="slug"]shortcode — no manual page-by-page setup required. - Language-based font switching: tag a font with a language code (e.g.
bn,ar,hi,ru,ja) and it is automatically applied to any element with a matchinglangattribute — handy for multilingual sites that mix scripts. - CSS selector assignment (e.g.
body,h1,.site-title) for site-wide typography. - Gutenberg / block editor integration — your fonts appear in the block Typography font-family picker via theme.json.
- CSS custom properties (
var(--fontik-your-font-slug)) for use in custom CSS or page builders. - Fully translation-ready (all strings run through WordPress i18n functions).
- Optional: a one-click tool to import and self-host fonts from Google Fonts, a font library operated by Google LLC. This plugin is not affiliated with, endorsed by, or sponsored by Google. See “External services” below for details.
External services
This plugin includes an optional tool, under the plugin’s Google Fonts screen, that lets you import a font from Google Fonts and self-host it on your own server.
This feature only runs when you explicitly click “Import” on a specific font in the Google Fonts admin screen. It is never triggered automatically, and nothing is requested from Google when this feature is not used.
- What is sent, and when: when you click “Import”, your server (not your site visitors’ browsers) sends a request containing the chosen font family name to Google Fonts’ public CSS endpoint (
fonts.googleapis.com) to retrieve the font’s stylesheet, then downloads the referenced font files from Google’s font file server (fonts.gstatic.com) to your own site’s uploads folder via WordPress’sdownload_url(). No visitor data, site content, or personal information is sent — only the font family name and standard HTTP request metadata (e.g. your server’s IP address, as with any HTTP request). - After import: the downloaded font files are served entirely from your own server from then on. No further requests are made to Google for that font, and your site visitors’ browsers never contact Google as a result of using this feature.
- Service provider: Google LLC. Google Fonts Terms of Service: https://developers.google.com/fonts/faq — Google Privacy Policy: https://policies.google.com/privacy — Google Terms of Service: https://policies.google.com/terms
Installation
- Upload the plugin files to
/wp-content/plugins/nexvibe-self-hosted-font-manager, or install via Plugins Add New Upload Plugin. - Activate the plugin.
- Go to All Fonts to upload a font, or Google Fonts to self-host one from a curated pack (or any Google Font by name).
- Optionally assign fonts site-wide on Assign Fonts, or per-page via the “Fonts Used on This Page” box in the post editor.
Faq
No. Custom font uploads are handled entirely by WordPress’s own uploader. The optional Google Fonts import feature uses Google Fonts’ public CSS endpoint (the same one browsers use) and requires no account or key — see “External services” above for what it sends.
No. This plugin ships curated font packs for Bangla, Arabic, Devanagari, Cyrillic and CJK scripts in addition to Latin, and lets you assign a language tag to any font so it switches automatically based on the lang attribute of the content.
This plugin’s smart per-page loading is designed to do the opposite: instead of loading every font on every page, it only outputs @font-face rules for fonts actually assigned to, or detected on, the current page.
Import or upload the font, set its “Language tag” (e.g. bn for Bangla, ar for Arabic), and any element with a matching lang attribute will use it automatically.
Reviews
Changelog
1.0.2
- Improved: Assign Fonts screen now offers a dropdown of common presets (Whole site, Headings, Paragraph text, Buttons, Menu, etc.) instead of requiring a typed CSS selector. A “Custom…” option is still available for anyone who wants to type their own selector or language code.
- Fix: TTF/OTF/WOFF font uploads were being silently rejected on some servers because PHP’s fileinfo detects these binaries as a generic type rather than a font-specific one, and WordPress’s upload check then refused the mismatch. The plugin now explicitly trusts its own allow-listed font extensions during upload.
- Fix: on the Assign Fonts screen, a new row’s selector could be saved as empty if its “Apply to” dropdown was never touched, silently applying no font. The dropdown now always holds a real value from page load, with a server-side fallback as well.
- Fix: the plugin’s dynamic font CSS is now attached to a real physical stylesheet file instead of a placeholder handle, so caching/CSS-optimization plugins no longer strip it from the page.
- New: a low-key, dismissible admin notice invites admins to leave a WordPress.org review, shown at most once per day starting a few days after activation, and never again once dismissed or clicked through.
1.0.1
- New: “Preload primary font” setting (Settings screen) now actually works — when enabled, it outputs a
<link rel="preload">tag for each needed font’s primary variant, so browsers fetch it immediately instead of waiting for CSS to be parsed. Reduces flash-of-unstyled-text and layout shift for fonts used in body text or headings. - Updated the setting’s description in the admin UI to explain what it does (previously labeled “reserved for a future update”).
1.0.0
- Initial release.