PHPackages                             jcodigital/jcore-portti - 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. jcodigital/jcore-portti

ActiveWordpress-plugin

jcodigital/jcore-portti
=======================

JCORE Global Content plugin

v0.3.1(3mo ago)016↓75%[4 issues](https://github.com/JCO-Digital/jcore-portti/issues)GPL-2.0-onlyPHPCI passing

Since Feb 5Pushed 3mo agoCompare

[ Source](https://github.com/JCO-Digital/jcore-portti)[ Packagist](https://packagist.org/packages/jcodigital/jcore-portti)[ RSS](/packages/jcodigital-jcore-portti/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (5)Versions (7)Used By (0)

JCORE Portti
------------

[](#jcore-portti)

The `jcore-portti` plugin provides a portal block system for managing campaign content or other dynamic changing content within WordPress. It uses a "Slot" and "Content" architecture that allows administrators to define areas in layouts (Slots) and schedule specific content to appear in those areas based on configurable rules.

### Features

[](#features)

- **Campaign Content Post Type**: A dedicated post type (`jcore-portal-content`) for managing portal items with full block editor support.
- **Portal Slots Taxonomy**: A hierarchical taxonomy (`jcore-portal-slot`) used to categorize and target where content should appear.
- **Portal Slot Block**: A Gutenberg block (`jco/portal-slot`) that allows editors to place "slots" in layouts, which dynamically pull content based on the selected taxonomy terms.
- **Scheduling Support**: Configure start and end dates for campaign content to automatically show/hide based on time.
- **Targeting Options**: Target content to specific pages/posts or use route path patterns with wildcard support.
- **Priority System**: Set content priority (High, Medium, Low) to control which content displays when multiple items match.
- **Fallback Content**: Support for fallback/inner block content when no matching campaign content is found.
- **Performance Optimized**: Uses modern WordPress block registration APIs (`wp_register_block_types_from_metadata_collection`) for better performance.
- **Multilingual Support**: Integrated with Polylang for translation support of campaign content.

### How It Works

[](#how-it-works)

1. **Create Portal Slots**: Define taxonomy terms representing areas in your layout (e.g., "Homepage Hero", "Sidebar Banner").
2. **Place Portal Slot Blocks**: Add the Portal Slot block to your templates/pages and select which slot it represents.
3. **Create Campaign Content**: Create content items, assign them to slots, and configure targeting rules.
4. **Automatic Display**: The plugin automatically displays the appropriate content based on your rules.

### Campaign Content Settings

[](#campaign-content-settings)

Each campaign content item can be configured with:

SettingDescription**Start Date**Optional. Content will only display after this date/time.**End Date**Optional. Content will stop displaying after this date/time.**Selected Page/Post**Target a specific page or post. Takes precedence over route path.**Route Path**URL pattern matching. Supports exact paths (`/shop`) or wildcards (`/products/*`). Leave empty to match all pages.**Priority**High, Medium, or Low. Higher priority content displays first when multiple items match.### Portal Slot Block Attributes

[](#portal-slot-block-attributes)

AttributeTypeDefaultDescription`slotId`string`""`The slug of the portal slot taxonomy term.`maxItems`number`1`Maximum number of content items to display.### Content Selection Logic

[](#content-selection-logic)

When rendering a portal slot, the plugin:

1. Queries all published campaign content assigned to the slot.
2. Filters by date range (if start/end dates are set).
3. Matches against the current page using selected post ID or route path patterns.
4. Sorts results by specificity (specific post &gt; route path), then priority, then date.
5. Returns up to `maxItems` matching content items.

### Route Path Matching

[](#route-path-matching)

- **Exact match**: `/contact` only matches the `/contact` page.
- **Wildcard match**: `/products/*` matches `/products/item-a`, `/products/item-b`, etc.
- **Global match**: Empty path matches all pages (useful for site-wide campaigns).

### Requirements

[](#requirements)

- WordPress 6.7 or higher
- PHP 8.2 or higher

### Development

[](#development)

The plugin uses a modern build process:

- Source files are located in `src/`.
- Block source: `src/portal-slot/`
- Campaign content sidebar: `src/campaign-content-sidebar/`
- The blocks are built using `@wordpress/scripts`.
- Production builds generate a `blocks-manifest.php` for efficient registration.

#### Build Commands

[](#build-commands)

```
# Install dependencies
pnpm install

# Development build with watch
pnpm start

# Production build
pnpm build
```

### License

[](#license)

GPL-2.0-or-later

###  Health Score

32

—

LowBetter than 72% of packages

Maintenance81

Actively maintained with recent releases

Popularity8

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity28

Early-stage or recently created project

 Bus Factor1

Top contributor holds 86.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 ~2 days

Total

3

Last Release

98d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/744ed170b0dedcb63d4eee2a7db74cf480a9eb05543fecba1f791a118b2ea3e1?d=identicon)[jcore](/maintainers/jcore)

---

Top Contributors

[![foonly](https://avatars.githubusercontent.com/u/1481639?v=4)](https://github.com/foonly "foonly (44 commits)")[![github-actions[bot]](https://avatars.githubusercontent.com/in/15368?v=4)](https://github.com/github-actions[bot] "github-actions[bot] (7 commits)")

###  Code Quality

Code StylePHP\_CodeSniffer

### Embed Badge

![Health badge](/badges/jcodigital-jcore-portti/health.svg)

```
[![Health](https://phpackages.com/badges/jcodigital-jcore-portti/health.svg)](https://phpackages.com/packages/jcodigital-jcore-portti)
```

PHPackages © 2026

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