Download the PHP package n5s/page-for-custom-post-type without Composer
On this page you can find all versions of the php package n5s/page-for-custom-post-type. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download n5s/page-for-custom-post-type
More information about n5s/page-for-custom-post-type
Files in n5s/page-for-custom-post-type
Package page-for-custom-post-type
Short Description Page for custom post types, just like page for posts
License GPL-3.0-or-later
Homepage https://github.com/nlemoine/page-for-custom-post-type
Informations about the package page-for-custom-post-type
Page for Custom Post Type
Assign any WordPress page as the archive page for a custom post type — just like the native "page for posts" setting.
The problem
WordPress custom post type archives are dynamically generated and can't be edited as regular pages. This creates recurring issues:
- No editable content: clients can't add a title, excerpt, cover image, or custom fields to archive pages.
- No SEO control: archive pages lack the metadata management that pages offer through SEO plugins.
- No page builder support: archive templates can't leverage the page editor or custom fields.
Several plugins have attempted to solve this:
- post-type-archive-pages
- wp-post-type-archive-pages
- page-for-post-type (humanmade)
- page-for-post-type (statenweb)
While these provided inspiration, none fully replicate WordPress's native behavior.
Approach
This plugin mimics how WordPress handles the posts page (show_on_front=page, page_for_posts={id}). On a posts page request, $wp_query contains both:
$wp_query->queried_object— the page itself (WP_Post)$wp_query->posts— the post type's posts (WP_Post[])
This plugin replicates this exact behavior for custom post types, with no extra queries or new functions needed to get your page object.
Setup
Once activated, your public custom post types appear in Settings > Reading.
Select any published page to serve as the archive page for each custom post type.
Use page slug as rewrite slug
An optional checkbox lets you use the assigned page's slug as the post type's rewrite slug. This means your archive URL and single post URLs will share the same base path (e.g., /products/ for the archive and /products/my-product/ for a single post).
Warning: Enabling this option changes all single post URLs for the post type. Consider the SEO implications before toggling it on an existing site.
Slug-change protection
Once "Use page slug as rewrite slug" is on, changing the page slug breaks every published URL for that custom post type. The plugin guards both editing surfaces:
- Block editor: a warning notice and confirmation checkbox appear in the document sidebar; the Update button stays disabled until the checkbox is ticked.
- Quick Edit on the Pages list: a confirmation dialog blocks the save until acknowledged.
Both only fire when the slug actually differs from the saved value, on pages assigned to a CPT with "use page slug" enabled.
Key differences with native CPT archives
| CPT archive | Page for CPT | |
|---|---|---|
| Conditionals | is_post_type_archive = trueis_archive = true |
is_home = trueis_{posttype}_page = trueis_page_for_custom_post_type = $posttype |
| Queried object | WP_Post_Type |
WP_Post |
| Template hierarchy | archive-{posttype}.phparchive.phpindex.php |
home-{posttype}.phphome.phpindex.php |
API
Functions
All functions are available both in the n5s\PageForCustomPostType namespace and in the global namespace.
Query properties
Hooks
Filters
| Filter | Description |
|---|---|
pfcpt/page_ids |
Modify the array of page ID / post type mappings |
pfcpt/post_type_from_id/page_id |
Filter page ID resolution for a post type |
pfcpt/dropdown_page_args |
Customize the page dropdown arguments in Settings |
Actions
| Action | Description |
|---|---|
pfcpt/template_redirect |
Fires on template_redirect when on a PFCPT page |
pfcpt/flush_rewrite_rules |
Fires before rewrite rules are flushed |
Integrations
Polylang
Full multilingual support:
- Each language can have its own assigned page
- Archive URLs are automatically translated
- Page slugs are translated when using the "use page slug" option
- Settings dropdown only shows pages in the default language
Requires Polylang 3.4+.
Yoast SEO (WordPress SEO)
- Full SEO metadata support on archive pages
- Correct breadcrumb trails (archive page appears in single post and taxonomy breadcrumbs)
- Proper
CollectionPageschema markup - Pages are indexed as pages, not archives
Requires Yoast SEO 26+.
WPML
Multilingual support via WPML's String Translation:
- Each language can have its own assigned page
- Archive URLs follow WPML's URL structure
- Page slugs are translatable when using the "use page slug" option
Requires WPML 4.5+.
The SEO Framework
- SEO metadata support
- Correct breadcrumb trails
- Proper query type detection (page, not archive)
Requires The SEO Framework 5.1+.
Advanced Custom Fields
Extends the built-in Page Type location rule with one value per bound post type, so field groups can target PFCPT pages. Each value is named {post_type}_page and is labelled with the post type archives label:
The same values are available from the Page Type dropdown in the field group UI.
Requires ACF 6+.
Requirements
- WordPress 6.0+
- PHP 8.2+
Installation
Composer (recommended)
Manual
Download the latest page-for-custom-post-type-X.Y.Z.zip from the releases page and upload it via Plugins > Add New > Upload Plugin. The zip ships with vendor dependencies bundled, so no build step is required.
Upgrading from 0.x
1.0 makes the "use page slug" behavior opt-in (it was previously always on). On upgrade, the plugin automatically enables it for every CPT that already has a page assigned, so existing URLs stay intact. If you'd rather use the default CPT rewrite slugs going forward, uncheck the option per CPT under Settings > Reading.
The legacy procedural API (is_page_for_custom_post_type(), get_page_id_for_custom_post_type(), etc.) is preserved as deprecated shims that forward to the namespaced equivalents. They'll emit a _doing_it_wrong notice when WP_DEBUG is on.
License
GPL-3.0-or-later