Repository files navigation

UCSC Communications Custom Functionality

CI

Custom functionality plugin for the UC Santa Cruz Communications and Marketing website on the CampusPress network. It provides the A-Z Editorial Style Guide — a custom post type, its ACF field group, and two shortcodes for rendering entries — plus an informational settings page in the admin.

Requirements

RequirementVersion
WordPress6.1 or later
PHP7.4 or later
Advanced Custom Fields ProRequired — see below

ACF Pro is a hard dependency, not an enhancement. The a_z_style_guide post type is registered by ACF from acf-json/post_type_685d7e97c87c6.json, not in PHP, so without ACF Pro active the post type does not exist and both shortcodes render nothing. The plugin declares this via Requires Plugins: advanced-custom-fields-pro in the plugin header; it does not bundle or install ACF Pro for you.

Installation

  1. Download the latest ucsc-communications-functionality.zip from the releases page.
  2. In WordPress, go to Plugins → Add New → Upload Plugin and upload the zip.
  3. Activate the plugin. Make sure ACF Pro is active too.

Once active, a read-only info page listing the version and available features lives at Settings → UCSC Communications Functionality (requires the manage_options capability).

Usage

Style guide entries are managed under the A-Z Ed Style Guide menu in the admin. Each entry has a Style Definitions repeater field, where every row holds:

  • Editorial Style Item — the term, plain text
  • Editorial Style Definition — the guidance, a WYSIWYG field

Two shortcodes render those rows:

ShortcodeOutput
[style-definition]The Style Definitions of the post it is placed on.
[style-archive]Every published style guide entry, ordered by title ascending, with headings.

Neither shortcode takes attributes. Both are defined in lib/functions/shortcodes.php.

Development

git clone https://github.com/ucsc/ucsc-communications-functionality.git
cd ucsc-communications-functionality
composer install
npm install

Commands

CommandWhat it does
composer run lintPHP CodeSniffer — WordPress-Extra, WordPress-Docs, PHPCompatibility
composer run lint-fixAuto-fix the PHPCS violations that are fixable
composer run testPHPUnit
composer run checklint then test — run this before opening a PR
npm run dryrunPreview the next version bump without committing
npm run releaseBump the version and update the changelog
npm run zipPackage the plugin as a distributable zip

There is no build step — the plugin ships no compiled assets.

Tests

The suite in tests/ runs against hand-written WordPress and ACF doubles, so it needs no WordPress install, no database, and no ACF Pro. It does need PHP's mbstring extension. If your local PHP lacks it, either install it (sudo apt install php8.5-mbstring) or run the suite in a container:

docker run --rm -v "$PWD":/app -w /app --user "$(id -u):$(id -g)" \
php:8.3-cli ./vendor/bin/phpunit

Project layout

plugin.php Plugin header, constants, ACF JSON save/load filters
lib/functions/general.php Admin stylesheet enqueue
lib/functions/settings.php Settings → info page
lib/functions/shortcodes.php [style-definition] and [style-archive]
lib/css/ Admin settings page styles
acf-json/ Version-controlled ACF field group and CPT definitions
tests/ PHPUnit suite plus the WP/ACF doubles it runs against

Field group definitions are kept in acf-json/ rather than the database: plugin.php filters acf/settings/save_json and acf/settings/load_json so ACF reads and writes them there, keeping them under version control.

Releasing

npm run release uses commit-and-tag-version to bump package.json, package-lock.json, and the Version: header in plugin.php (through wp-plugin-version-updater.js), and to update CHANGELOG.md from the commit history. Push the resulting v*.*.* tag and .github/workflows/release.yml builds the zip and publishes the GitHub release via the shared ucsc/actions workflow.

Contributing

.github/workflows/ci.yml runs PHPCS on PHP 8.3 and PHPUnit on PHP 8.3 and 8.4 for every pull request, so composer run check should pass locally first. Commit messages follow Conventional Commits — the changelog is generated from them.

For architecture notes, known quirks, and the gotchas worth reading before changing anything, see CLAUDE.md. ROADMAP.md records the original audit items with their causes and fixes.

License

GPL-3.0-or-later. See LICENSE.

About

Custom Functionality Plugin for UCSC's Communications website on the CampusPress network

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

UCSC Communications Custom Functionality

CI

Custom functionality plugin for the UC Santa Cruz Communications and Marketing website on the CampusPress network. It provides the A-Z Editorial Style Guide — a custom post type, its ACF field group, and two shortcodes for rendering entries — plus an informational settings page in the admin.

Requirements

RequirementVersion
WordPress6.1 or later
PHP7.4 or later
Advanced Custom Fields ProRequired — see below

ACF Pro is a hard dependency, not an enhancement. The a_z_style_guide post type is registered by ACF from acf-json/post_type_685d7e97c87c6.json, not in PHP, so without ACF Pro active the post type does not exist and both shortcodes render nothing. The plugin declares this via Requires Plugins: advanced-custom-fields-pro in the plugin header; it does not bundle or install ACF Pro for you.

Installation

  1. Download the latest ucsc-communications-functionality.zip from the releases page.
  2. In WordPress, go to Plugins → Add New → Upload Plugin and upload the zip.
  3. Activate the plugin. Make sure ACF Pro is active too.

Once active, a read-only info page listing the version and available features lives at Settings → UCSC Communications Functionality (requires the manage_options capability).

Usage

Style guide entries are managed under the A-Z Ed Style Guide menu in the admin. Each entry has a Style Definitions repeater field, where every row holds:

  • Editorial Style Item — the term, plain text
  • Editorial Style Definition — the guidance, a WYSIWYG field

Two shortcodes render those rows:

ShortcodeOutput
[style-definition]The Style Definitions of the post it is placed on.
[style-archive]Every published style guide entry, ordered by title ascending, with headings.

Neither shortcode takes attributes. Both are defined in lib/functions/shortcodes.php.

Development

git clone https://github.com/ucsc/ucsc-communications-functionality.git
cd ucsc-communications-functionality
composer install
npm install

Commands

CommandWhat it does
composer run lintPHP CodeSniffer — WordPress-Extra, WordPress-Docs, PHPCompatibility
composer run lint-fixAuto-fix the PHPCS violations that are fixable
composer run testPHPUnit
composer run checklint then test — run this before opening a PR
npm run dryrunPreview the next version bump without committing
npm run releaseBump the version and update the changelog
npm run zipPackage the plugin as a distributable zip

There is no build step — the plugin ships no compiled assets.

Tests

The suite in tests/ runs against hand-written WordPress and ACF doubles, so it needs no WordPress install, no database, and no ACF Pro. It does need PHP's mbstring extension. If your local PHP lacks it, either install it (sudo apt install php8.5-mbstring) or run the suite in a container:

docker run --rm -v "$PWD":/app -w /app --user "$(id -u):$(id -g)" \
php:8.3-cli ./vendor/bin/phpunit

Project layout

plugin.php Plugin header, constants, ACF JSON save/load filters
lib/functions/general.php Admin stylesheet enqueue
lib/functions/settings.php Settings → info page
lib/functions/shortcodes.php [style-definition] and [style-archive]
lib/css/ Admin settings page styles
acf-json/ Version-controlled ACF field group and CPT definitions
tests/ PHPUnit suite plus the WP/ACF doubles it runs against

Field group definitions are kept in acf-json/ rather than the database: plugin.php filters acf/settings/save_json and acf/settings/load_json so ACF reads and writes them there, keeping them under version control.

Releasing

npm run release uses commit-and-tag-version to bump package.json, package-lock.json, and the Version: header in plugin.php (through wp-plugin-version-updater.js), and to update CHANGELOG.md from the commit history. Push the resulting v*.*.* tag and .github/workflows/release.yml builds the zip and publishes the GitHub release via the shared ucsc/actions workflow.

Contributing

.github/workflows/ci.yml runs PHPCS on PHP 8.3 and PHPUnit on PHP 8.3 and 8.4 for every pull request, so composer run check should pass locally first. Commit messages follow Conventional Commits — the changelog is generated from them.

For architecture notes, known quirks, and the gotchas worth reading before changing anything, see CLAUDE.md. ROADMAP.md records the original audit items with their causes and fixes.

License

GPL-3.0-or-later. See LICENSE.

About

Custom Functionality Plugin for UCSC's Communications website on the CampusPress network

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

UCSC Communications Custom Functionality

CI

Custom functionality plugin for the UC Santa Cruz Communications and Marketing website on the CampusPress network. It provides the A-Z Editorial Style Guide — a custom post type, its ACF field group, and two shortcodes for rendering entries — plus an informational settings page in the admin.

Requirements

RequirementVersion
WordPress6.1 or later
PHP7.4 or later
Advanced Custom Fields ProRequired — see below

ACF Pro is a hard dependency, not an enhancement. The a_z_style_guide post type is registered by ACF from acf-json/post_type_685d7e97c87c6.json, not in PHP, so without ACF Pro active the post type does not exist and both shortcodes render nothing. The plugin declares this via Requires Plugins: advanced-custom-fields-pro in the plugin header; it does not bundle or install ACF Pro for you.

Installation

  1. Download the latest ucsc-communications-functionality.zip from the releases page.
  2. In WordPress, go to Plugins → Add New → Upload Plugin and upload the zip.
  3. Activate the plugin. Make sure ACF Pro is active too.

Once active, a read-only info page listing the version and available features lives at Settings → UCSC Communications Functionality (requires the manage_options capability).

Usage

Style guide entries are managed under the A-Z Ed Style Guide menu in the admin. Each entry has a Style Definitions repeater field, where every row holds:

  • Editorial Style Item — the term, plain text
  • Editorial Style Definition — the guidance, a WYSIWYG field

Two shortcodes render those rows:

ShortcodeOutput
[style-definition]The Style Definitions of the post it is placed on.
[style-archive]Every published style guide entry, ordered by title ascending, with headings.

Neither shortcode takes attributes. Both are defined in lib/functions/shortcodes.php.

Development

git clone https://github.com/ucsc/ucsc-communications-functionality.git
cd ucsc-communications-functionality
composer install
npm install

Commands

CommandWhat it does
composer run lintPHP CodeSniffer — WordPress-Extra, WordPress-Docs, PHPCompatibility
composer run lint-fixAuto-fix the PHPCS violations that are fixable
composer run testPHPUnit
composer run checklint then test — run this before opening a PR
npm run dryrunPreview the next version bump without committing
npm run releaseBump the version and update the changelog
npm run zipPackage the plugin as a distributable zip

There is no build step — the plugin ships no compiled assets.

Tests

The suite in tests/ runs against hand-written WordPress and ACF doubles, so it needs no WordPress install, no database, and no ACF Pro. It does need PHP's mbstring extension. If your local PHP lacks it, either install it (sudo apt install php8.5-mbstring) or run the suite in a container:

docker run --rm -v "$PWD":/app -w /app --user "$(id -u):$(id -g)" \
php:8.3-cli ./vendor/bin/phpunit

Project layout

plugin.php Plugin header, constants, ACF JSON save/load filters
lib/functions/general.php Admin stylesheet enqueue
lib/functions/settings.php Settings → info page
lib/functions/shortcodes.php [style-definition] and [style-archive]
lib/css/ Admin settings page styles
acf-json/ Version-controlled ACF field group and CPT definitions
tests/ PHPUnit suite plus the WP/ACF doubles it runs against

Field group definitions are kept in acf-json/ rather than the database: plugin.php filters acf/settings/save_json and acf/settings/load_json so ACF reads and writes them there, keeping them under version control.

Releasing

npm run release uses commit-and-tag-version to bump package.json, package-lock.json, and the Version: header in plugin.php (through wp-plugin-version-updater.js), and to update CHANGELOG.md from the commit history. Push the resulting v*.*.* tag and .github/workflows/release.yml builds the zip and publishes the GitHub release via the shared ucsc/actions workflow.

Contributing

.github/workflows/ci.yml runs PHPCS on PHP 8.3 and PHPUnit on PHP 8.3 and 8.4 for every pull request, so composer run check should pass locally first. Commit messages follow Conventional Commits — the changelog is generated from them.

For architecture notes, known quirks, and the gotchas worth reading before changing anything, see CLAUDE.md. ROADMAP.md records the original audit items with their causes and fixes.

License

GPL-3.0-or-later. See LICENSE.

About

Custom Functionality Plugin for UCSC's Communications website on the CampusPress network

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

UCSC Communications Custom Functionality

CI

Custom functionality plugin for the UC Santa Cruz Communications and Marketing website on the CampusPress network. It provides the A-Z Editorial Style Guide — a custom post type, its ACF field group, and two shortcodes for rendering entries — plus an informational settings page in the admin.

Requirements

RequirementVersion
WordPress6.1 or later
PHP7.4 or later
Advanced Custom Fields ProRequired — see below

ACF Pro is a hard dependency, not an enhancement. The a_z_style_guide post type is registered by ACF from acf-json/post_type_685d7e97c87c6.json, not in PHP, so without ACF Pro active the post type does not exist and both shortcodes render nothing. The plugin declares this via Requires Plugins: advanced-custom-fields-pro in the plugin header; it does not bundle or install ACF Pro for you.

Installation

  1. Download the latest ucsc-communications-functionality.zip from the releases page.
  2. In WordPress, go to Plugins → Add New → Upload Plugin and upload the zip.
  3. Activate the plugin. Make sure ACF Pro is active too.

Once active, a read-only info page listing the version and available features lives at Settings → UCSC Communications Functionality (requires the manage_options capability).

Usage

Style guide entries are managed under the A-Z Ed Style Guide menu in the admin. Each entry has a Style Definitions repeater field, where every row holds:

  • Editorial Style Item — the term, plain text
  • Editorial Style Definition — the guidance, a WYSIWYG field

Two shortcodes render those rows:

ShortcodeOutput
[style-definition]The Style Definitions of the post it is placed on.
[style-archive]Every published style guide entry, ordered by title ascending, with headings.

Neither shortcode takes attributes. Both are defined in lib/functions/shortcodes.php.

Development

git clone https://github.com/ucsc/ucsc-communications-functionality.git
cd ucsc-communications-functionality
composer install
npm install

Commands

CommandWhat it does
composer run lintPHP CodeSniffer — WordPress-Extra, WordPress-Docs, PHPCompatibility
composer run lint-fixAuto-fix the PHPCS violations that are fixable
composer run testPHPUnit
composer run checklint then test — run this before opening a PR
npm run dryrunPreview the next version bump without committing
npm run releaseBump the version and update the changelog
npm run zipPackage the plugin as a distributable zip

There is no build step — the plugin ships no compiled assets.

Tests

The suite in tests/ runs against hand-written WordPress and ACF doubles, so it needs no WordPress install, no database, and no ACF Pro. It does need PHP's mbstring extension. If your local PHP lacks it, either install it (sudo apt install php8.5-mbstring) or run the suite in a container:

docker run --rm -v "$PWD":/app -w /app --user "$(id -u):$(id -g)" \
php:8.3-cli ./vendor/bin/phpunit

Project layout

plugin.php Plugin header, constants, ACF JSON save/load filters
lib/functions/general.php Admin stylesheet enqueue
lib/functions/settings.php Settings → info page
lib/functions/shortcodes.php [style-definition] and [style-archive]
lib/css/ Admin settings page styles
acf-json/ Version-controlled ACF field group and CPT definitions
tests/ PHPUnit suite plus the WP/ACF doubles it runs against

Field group definitions are kept in acf-json/ rather than the database: plugin.php filters acf/settings/save_json and acf/settings/load_json so ACF reads and writes them there, keeping them under version control.

Releasing

npm run release uses commit-and-tag-version to bump package.json, package-lock.json, and the Version: header in plugin.php (through wp-plugin-version-updater.js), and to update CHANGELOG.md from the commit history. Push the resulting v*.*.* tag and .github/workflows/release.yml builds the zip and publishes the GitHub release via the shared ucsc/actions workflow.

Contributing

.github/workflows/ci.yml runs PHPCS on PHP 8.3 and PHPUnit on PHP 8.3 and 8.4 for every pull request, so composer run check should pass locally first. Commit messages follow Conventional Commits — the changelog is generated from them.

For architecture notes, known quirks, and the gotchas worth reading before changing anything, see CLAUDE.md. ROADMAP.md records the original audit items with their causes and fixes.

License

GPL-3.0-or-later. See LICENSE.

About

Custom Functionality Plugin for UCSC's Communications website on the CampusPress network

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

UCSC Communications Custom Functionality

CI

Custom functionality plugin for the UC Santa Cruz Communications and Marketing website on the CampusPress network. It provides the A-Z Editorial Style Guide — a custom post type, its ACF field group, and two shortcodes for rendering entries — plus an informational settings page in the admin.

Requirements

RequirementVersion
WordPress6.1 or later
PHP7.4 or later
Advanced Custom Fields ProRequired — see below

ACF Pro is a hard dependency, not an enhancement. The a_z_style_guide post type is registered by ACF from acf-json/post_type_685d7e97c87c6.json, not in PHP, so without ACF Pro active the post type does not exist and both shortcodes render nothing. The plugin declares this via Requires Plugins: advanced-custom-fields-pro in the plugin header; it does not bundle or install ACF Pro for you.

Installation

  1. Download the latest ucsc-communications-functionality.zip from the releases page.
  2. In WordPress, go to Plugins → Add New → Upload Plugin and upload the zip.
  3. Activate the plugin. Make sure ACF Pro is active too.

Once active, a read-only info page listing the version and available features lives at Settings → UCSC Communications Functionality (requires the manage_options capability).

Usage

Style guide entries are managed under the A-Z Ed Style Guide menu in the admin. Each entry has a Style Definitions repeater field, where every row holds:

  • Editorial Style Item — the term, plain text
  • Editorial Style Definition — the guidance, a WYSIWYG field

Two shortcodes render those rows:

ShortcodeOutput
[style-definition]The Style Definitions of the post it is placed on.
[style-archive]Every published style guide entry, ordered by title ascending, with headings.

Neither shortcode takes attributes. Both are defined in lib/functions/shortcodes.php.

Development

git clone https://github.com/ucsc/ucsc-communications-functionality.git
cd ucsc-communications-functionality
composer install
npm install

Commands

CommandWhat it does
composer run lintPHP CodeSniffer — WordPress-Extra, WordPress-Docs, PHPCompatibility
composer run lint-fixAuto-fix the PHPCS violations that are fixable
composer run testPHPUnit
composer run checklint then test — run this before opening a PR
npm run dryrunPreview the next version bump without committing
npm run releaseBump the version and update the changelog
npm run zipPackage the plugin as a distributable zip

There is no build step — the plugin ships no compiled assets.

Tests

The suite in tests/ runs against hand-written WordPress and ACF doubles, so it needs no WordPress install, no database, and no ACF Pro. It does need PHP's mbstring extension. If your local PHP lacks it, either install it (sudo apt install php8.5-mbstring) or run the suite in a container:

docker run --rm -v "$PWD":/app -w /app --user "$(id -u):$(id -g)" \
php:8.3-cli ./vendor/bin/phpunit

Project layout

plugin.php Plugin header, constants, ACF JSON save/load filters
lib/functions/general.php Admin stylesheet enqueue
lib/functions/settings.php Settings → info page
lib/functions/shortcodes.php [style-definition] and [style-archive]
lib/css/ Admin settings page styles
acf-json/ Version-controlled ACF field group and CPT definitions
tests/ PHPUnit suite plus the WP/ACF doubles it runs against

Field group definitions are kept in acf-json/ rather than the database: plugin.php filters acf/settings/save_json and acf/settings/load_json so ACF reads and writes them there, keeping them under version control.

Releasing

npm run release uses commit-and-tag-version to bump package.json, package-lock.json, and the Version: header in plugin.php (through wp-plugin-version-updater.js), and to update CHANGELOG.md from the commit history. Push the resulting v*.*.* tag and .github/workflows/release.yml builds the zip and publishes the GitHub release via the shared ucsc/actions workflow.

Contributing

.github/workflows/ci.yml runs PHPCS on PHP 8.3 and PHPUnit on PHP 8.3 and 8.4 for every pull request, so composer run check should pass locally first. Commit messages follow Conventional Commits — the changelog is generated from them.

For architecture notes, known quirks, and the gotchas worth reading before changing anything, see CLAUDE.md. ROADMAP.md records the original audit items with their causes and fixes.

License

GPL-3.0-or-later. See LICENSE.

About

Custom Functionality Plugin for UCSC's Communications website on the CampusPress network

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

UCSC Communications Custom Functionality

CI

Custom functionality plugin for the UC Santa Cruz Communications and Marketing website on the CampusPress network. It provides the A-Z Editorial Style Guide — a custom post type, its ACF field group, and two shortcodes for rendering entries — plus an informational settings page in the admin.

Requirements

RequirementVersion
WordPress6.1 or later
PHP7.4 or later
Advanced Custom Fields ProRequired — see below

ACF Pro is a hard dependency, not an enhancement. The a_z_style_guide post type is registered by ACF from acf-json/post_type_685d7e97c87c6.json, not in PHP, so without ACF Pro active the post type does not exist and both shortcodes render nothing. The plugin declares this via Requires Plugins: advanced-custom-fields-pro in the plugin header; it does not bundle or install ACF Pro for you.

Installation

  1. Download the latest ucsc-communications-functionality.zip from the releases page.
  2. In WordPress, go to Plugins → Add New → Upload Plugin and upload the zip.
  3. Activate the plugin. Make sure ACF Pro is active too.

Once active, a read-only info page listing the version and available features lives at Settings → UCSC Communications Functionality (requires the manage_options capability).

Usage

Style guide entries are managed under the A-Z Ed Style Guide menu in the admin. Each entry has a Style Definitions repeater field, where every row holds:

  • Editorial Style Item — the term, plain text
  • Editorial Style Definition — the guidance, a WYSIWYG field

Two shortcodes render those rows:

ShortcodeOutput
[style-definition]The Style Definitions of the post it is placed on.
[style-archive]Every published style guide entry, ordered by title ascending, with headings.

Neither shortcode takes attributes. Both are defined in lib/functions/shortcodes.php.

Development

git clone https://github.com/ucsc/ucsc-communications-functionality.git
cd ucsc-communications-functionality
composer install
npm install

Commands

CommandWhat it does
composer run lintPHP CodeSniffer — WordPress-Extra, WordPress-Docs, PHPCompatibility
composer run lint-fixAuto-fix the PHPCS violations that are fixable
composer run testPHPUnit
composer run checklint then test — run this before opening a PR
npm run dryrunPreview the next version bump without committing
npm run releaseBump the version and update the changelog
npm run zipPackage the plugin as a distributable zip

There is no build step — the plugin ships no compiled assets.

Tests

The suite in tests/ runs against hand-written WordPress and ACF doubles, so it needs no WordPress install, no database, and no ACF Pro. It does need PHP's mbstring extension. If your local PHP lacks it, either install it (sudo apt install php8.5-mbstring) or run the suite in a container:

docker run --rm -v "$PWD":/app -w /app --user "$(id -u):$(id -g)" \
php:8.3-cli ./vendor/bin/phpunit

Project layout

plugin.php Plugin header, constants, ACF JSON save/load filters
lib/functions/general.php Admin stylesheet enqueue
lib/functions/settings.php Settings → info page
lib/functions/shortcodes.php [style-definition] and [style-archive]
lib/css/ Admin settings page styles
acf-json/ Version-controlled ACF field group and CPT definitions
tests/ PHPUnit suite plus the WP/ACF doubles it runs against

Field group definitions are kept in acf-json/ rather than the database: plugin.php filters acf/settings/save_json and acf/settings/load_json so ACF reads and writes them there, keeping them under version control.

Releasing

npm run release uses commit-and-tag-version to bump package.json, package-lock.json, and the Version: header in plugin.php (through wp-plugin-version-updater.js), and to update CHANGELOG.md from the commit history. Push the resulting v*.*.* tag and .github/workflows/release.yml builds the zip and publishes the GitHub release via the shared ucsc/actions workflow.

Contributing

.github/workflows/ci.yml runs PHPCS on PHP 8.3 and PHPUnit on PHP 8.3 and 8.4 for every pull request, so composer run check should pass locally first. Commit messages follow Conventional Commits — the changelog is generated from them.

For architecture notes, known quirks, and the gotchas worth reading before changing anything, see CLAUDE.md. ROADMAP.md records the original audit items with their causes and fixes.

License

GPL-3.0-or-later. See LICENSE.

About

Custom Functionality Plugin for UCSC's Communications website on the CampusPress network

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

UCSC Communications Custom Functionality

CI

Custom functionality plugin for the UC Santa Cruz Communications and Marketing website on the CampusPress network. It provides the A-Z Editorial Style Guide — a custom post type, its ACF field group, and two shortcodes for rendering entries — plus an informational settings page in the admin.

Requirements

RequirementVersion
WordPress6.1 or later
PHP7.4 or later
Advanced Custom Fields ProRequired — see below

ACF Pro is a hard dependency, not an enhancement. The a_z_style_guide post type is registered by ACF from acf-json/post_type_685d7e97c87c6.json, not in PHP, so without ACF Pro active the post type does not exist and both shortcodes render nothing. The plugin declares this via Requires Plugins: advanced-custom-fields-pro in the plugin header; it does not bundle or install ACF Pro for you.

Installation

  1. Download the latest ucsc-communications-functionality.zip from the releases page.
  2. In WordPress, go to Plugins → Add New → Upload Plugin and upload the zip.
  3. Activate the plugin. Make sure ACF Pro is active too.

Once active, a read-only info page listing the version and available features lives at Settings → UCSC Communications Functionality (requires the manage_options capability).

Usage

Style guide entries are managed under the A-Z Ed Style Guide menu in the admin. Each entry has a Style Definitions repeater field, where every row holds:

  • Editorial Style Item — the term, plain text
  • Editorial Style Definition — the guidance, a WYSIWYG field

Two shortcodes render those rows:

ShortcodeOutput
[style-definition]The Style Definitions of the post it is placed on.
[style-archive]Every published style guide entry, ordered by title ascending, with headings.

Neither shortcode takes attributes. Both are defined in lib/functions/shortcodes.php.

Development

git clone https://github.com/ucsc/ucsc-communications-functionality.git
cd ucsc-communications-functionality
composer install
npm install

Commands

CommandWhat it does
composer run lintPHP CodeSniffer — WordPress-Extra, WordPress-Docs, PHPCompatibility
composer run lint-fixAuto-fix the PHPCS violations that are fixable
composer run testPHPUnit
composer run checklint then test — run this before opening a PR
npm run dryrunPreview the next version bump without committing
npm run releaseBump the version and update the changelog
npm run zipPackage the plugin as a distributable zip

There is no build step — the plugin ships no compiled assets.

Tests

The suite in tests/ runs against hand-written WordPress and ACF doubles, so it needs no WordPress install, no database, and no ACF Pro. It does need PHP's mbstring extension. If your local PHP lacks it, either install it (sudo apt install php8.5-mbstring) or run the suite in a container:

docker run --rm -v "$PWD":/app -w /app --user "$(id -u):$(id -g)" \
php:8.3-cli ./vendor/bin/phpunit

Project layout

plugin.php Plugin header, constants, ACF JSON save/load filters
lib/functions/general.php Admin stylesheet enqueue
lib/functions/settings.php Settings → info page
lib/functions/shortcodes.php [style-definition] and [style-archive]
lib/css/ Admin settings page styles
acf-json/ Version-controlled ACF field group and CPT definitions
tests/ PHPUnit suite plus the WP/ACF doubles it runs against

Field group definitions are kept in acf-json/ rather than the database: plugin.php filters acf/settings/save_json and acf/settings/load_json so ACF reads and writes them there, keeping them under version control.

Releasing

npm run release uses commit-and-tag-version to bump package.json, package-lock.json, and the Version: header in plugin.php (through wp-plugin-version-updater.js), and to update CHANGELOG.md from the commit history. Push the resulting v*.*.* tag and .github/workflows/release.yml builds the zip and publishes the GitHub release via the shared ucsc/actions workflow.

Contributing

.github/workflows/ci.yml runs PHPCS on PHP 8.3 and PHPUnit on PHP 8.3 and 8.4 for every pull request, so composer run check should pass locally first. Commit messages follow Conventional Commits — the changelog is generated from them.

For architecture notes, known quirks, and the gotchas worth reading before changing anything, see CLAUDE.md. ROADMAP.md records the original audit items with their causes and fixes.

License

GPL-3.0-or-later. See LICENSE.

About

Custom Functionality Plugin for UCSC's Communications website on the CampusPress network

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

UCSC Communications Custom Functionality

CI

Custom functionality plugin for the UC Santa Cruz Communications and Marketing website on the CampusPress network. It provides the A-Z Editorial Style Guide — a custom post type, its ACF field group, and two shortcodes for rendering entries — plus an informational settings page in the admin.

Requirements

RequirementVersion
WordPress6.1 or later
PHP7.4 or later
Advanced Custom Fields ProRequired — see below

ACF Pro is a hard dependency, not an enhancement. The a_z_style_guide post type is registered by ACF from acf-json/post_type_685d7e97c87c6.json, not in PHP, so without ACF Pro active the post type does not exist and both shortcodes render nothing. The plugin declares this via Requires Plugins: advanced-custom-fields-pro in the plugin header; it does not bundle or install ACF Pro for you.

Installation

  1. Download the latest ucsc-communications-functionality.zip from the releases page.
  2. In WordPress, go to Plugins → Add New → Upload Plugin and upload the zip.
  3. Activate the plugin. Make sure ACF Pro is active too.

Once active, a read-only info page listing the version and available features lives at Settings → UCSC Communications Functionality (requires the manage_options capability).

Usage

Style guide entries are managed under the A-Z Ed Style Guide menu in the admin. Each entry has a Style Definitions repeater field, where every row holds:

  • Editorial Style Item — the term, plain text
  • Editorial Style Definition — the guidance, a WYSIWYG field

Two shortcodes render those rows:

ShortcodeOutput
[style-definition]The Style Definitions of the post it is placed on.
[style-archive]Every published style guide entry, ordered by title ascending, with headings.

Neither shortcode takes attributes. Both are defined in lib/functions/shortcodes.php.

Development

git clone https://github.com/ucsc/ucsc-communications-functionality.git
cd ucsc-communications-functionality
composer install
npm install

Commands

CommandWhat it does
composer run lintPHP CodeSniffer — WordPress-Extra, WordPress-Docs, PHPCompatibility
composer run lint-fixAuto-fix the PHPCS violations that are fixable
composer run testPHPUnit
composer run checklint then test — run this before opening a PR
npm run dryrunPreview the next version bump without committing
npm run releaseBump the version and update the changelog
npm run zipPackage the plugin as a distributable zip

There is no build step — the plugin ships no compiled assets.

Tests

The suite in tests/ runs against hand-written WordPress and ACF doubles, so it needs no WordPress install, no database, and no ACF Pro. It does need PHP's mbstring extension. If your local PHP lacks it, either install it (sudo apt install php8.5-mbstring) or run the suite in a container:

docker run --rm -v "$PWD":/app -w /app --user "$(id -u):$(id -g)" \
php:8.3-cli ./vendor/bin/phpunit

Project layout

plugin.php Plugin header, constants, ACF JSON save/load filters
lib/functions/general.php Admin stylesheet enqueue
lib/functions/settings.php Settings → info page
lib/functions/shortcodes.php [style-definition] and [style-archive]
lib/css/ Admin settings page styles
acf-json/ Version-controlled ACF field group and CPT definitions
tests/ PHPUnit suite plus the WP/ACF doubles it runs against

Field group definitions are kept in acf-json/ rather than the database: plugin.php filters acf/settings/save_json and acf/settings/load_json so ACF reads and writes them there, keeping them under version control.

Releasing

npm run release uses commit-and-tag-version to bump package.json, package-lock.json, and the Version: header in plugin.php (through wp-plugin-version-updater.js), and to update CHANGELOG.md from the commit history. Push the resulting v*.*.* tag and .github/workflows/release.yml builds the zip and publishes the GitHub release via the shared ucsc/actions workflow.

Contributing

.github/workflows/ci.yml runs PHPCS on PHP 8.3 and PHPUnit on PHP 8.3 and 8.4 for every pull request, so composer run check should pass locally first. Commit messages follow Conventional Commits — the changelog is generated from them.

For architecture notes, known quirks, and the gotchas worth reading before changing anything, see CLAUDE.md. ROADMAP.md records the original audit items with their causes and fixes.

License

GPL-3.0-or-later. See LICENSE.

About

Custom Functionality Plugin for UCSC's Communications website on the CampusPress network

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages