🚀 New: WordPress Care Plans starting at $49/mo — see plans & pricing →
Fiverr
Upwork
LinkedIn
YouTube
WhatsApp
BD Local Guide
SEO Services
📝
On-Page Optimisation
🔍
Indexing & Crawling
Core Web Vitals
🔗
Backlinks & Off-Page SEO
📍
Local SEO & Map Pack
🛒
E-Commerce SEO
📈
Affiliate Content Scaling
🚨
Traffic Drops & Penalties
WordPress
🔧
WordPress Technical SEO
🛡️
Care Plans — from $49/mo
📦
Products & Tools
Resources
SEO Checklist 2026
💰
SEO Strategy & ROI
🛠️
Tools We Recommend
Company
👋
About Us
👋
Our Portfolio

WordPress SEO that actually ranks

Technical SEO, speed optimisation, and monthly care plans for WordPress sites that need to perform.

Why Your WordPress Custom Post Types Are Not Ranking (And How to Fix Every Cause)
WordPress custom post types SEO diagnosis — developer reviewing code
WordPress Technical SEO

WordPress Custom Post Types
Not Ranking: Every Cause,
Every Fix

Technical SEO Updated March 2025 · 28 min read

You built the CPT. The content is live. The URL resolves. Google simply refuses to rank it. Here is every reason that happens — and the exact fix for each one.

There is a particular brand of WordPress frustration that hits harder than most. You’ve done everything right. You built a custom post type for your portfolio, your case studies, your real estate listings, or your product catalog. Every piece of content has a URL. The pages load correctly in the browser. Your editorial team has been publishing for months.

Then you open Google Search Console and the picture is bleak. Either the CPT pages show up in the “Not indexed” list with vague reasons, or they’re indexed but buried so deep in the SERPs they might as well not exist. Meanwhile, your standard WordPress posts rank fine.

This is one of the most common technical SEO problems in the WordPress ecosystem — and unlike most ranking problems, it’s almost never about content quality. WordPress custom post types don’t rank primarily because of configuration problems: registration settings nobody read carefully, SEO plugin toggles that default to exclusion, sitemap settings that weren’t updated after the CPT was added, or rewrite slug conflicts that produce silent routing failures.

Every single one of those problems has an exact, reproducible fix. This guide works through all of them in diagnostic order — starting with the issues most likely to cause complete indexation failure, and ending with the structural improvements that transform an indexed-but-invisible CPT into a genuine traffic asset.

Section 01

What Custom Post Types Are — and Why Google Treats Them Differently

In WordPress, a custom post type (CPT) is any content type beyond the four built-in types: posts, pages, attachments, and revisions. When you register a CPT using register_post_type(), WordPress creates a new content bucket with its own admin interface, URL structure, query behaviour, and — critically — its own visibility settings.

Standard examples include: portfolio items, properties on a real estate site, menu items for restaurants, testimonials, events, WooCommerce products, job listings, recipes, and case studies. Anything with a consistent data structure that doesn’t fit neatly into posts or pages is a natural CPT candidate.

The reason Google treats CPTs differently isn’t a deliberate search engine decision. It’s a consequence of WordPress’s architecture. Standard posts are fully public by default. They appear in sitemaps, in search results, in RSS feeds, in category archives, in tag archives. They accumulate internal links automatically from dozens of site features.

CPTs, however, are only as public as you configure them to be. The default value of the public parameter in register_post_type() is false — meaning if you don’t explicitly declare a CPT as public, it’s invisible to Google from the moment it’s registered. And even CPTs that are declared public face a gauntlet of SEO plugin settings, sitemap configurations, and permalink conflicts that don’t apply to standard posts.

The Four Visibility Parameters That Control Everything

These four parameters in register_post_type() determine whether Google can see your CPT at all:

Parameter Default Value SEO Impact Required for Indexing
public false Master visibility switch — controls all child params true
publicly_queryable Inherits from public Controls whether CPT URLs are accessible via GET requests true
exclude_from_search Opposite of public Excludes from WP search; some plugins use as noindex signal false
has_archive false Creates a /cpt-slug/ archive page — a rankable content hub Recommended

Nearly every CPT indexation failure traces back to one of these four parameters being wrong. Everything in this guide builds on understanding them correctly.

Section 02

The 9 Root Causes of CPT Ranking Failure

Before jumping into individual fixes, it’s worth mapping the complete landscape of what can go wrong. CPT ranking problems cluster into three distinct failure modes: registration failures (the CPT was never properly configured to be public), plugin-imposed exclusions (an SEO plugin is actively blocking indexation), and structural deficiencies (the CPT is indexable but lacks the signals Google needs to rank it well).

# Cause Type How Common
1 public => false in registration Registration Very Common
2 Excluded from SEO plugin sitemap Plugin Very Common
3 Noindex set by SEO plugin or theme Plugin Common
4 Rewrite slug conflict causing 404 or redirect loop Registration Common
5 No internal links pointing to CPT pages (orphan pages) Structure Common
6 Permalinks not flushed after CPT registration change Registration Common
7 Canonical tags pointing to wrong URL Plugin Moderate
8 Thin or low-quality content on CPT pages Structure Moderate
9 Missing or incorrect schema markup Structure Moderate
⚡ Always Diagnose Top-Down

Work through this list in order. A CPT registered with public => false will never rank regardless of schema markup quality. Fix registration issues before investigating structural ones.

Section 03

Getting register_post_type() Right for SEO

The register_post_type() function call is ground zero for CPT SEO. It lives in either your theme’s functions.php, a custom plugin, or a third-party plugin — and the SEO-relevant parameters are frequently set incorrectly, especially in CPTs registered by themes or plugins whose authors weren’t thinking about search engine visibility.

The Complete SEO-Correct Registration

Here’s a fully annotated, SEO-correct CPT registration for a portfolio post type:

function indxq_register_portfolio_cpt() {
    $args = array(
        /*
         * ✅ CRITICAL: Must be TRUE.
         * Default is FALSE — leaving this out means Google can't see the CPT.
         */
        'public'              => true,

        /*
         * ✅ Allows direct URL access by Googlebot.
         * Inherits from 'public' when not set — but be explicit.
         */
        'publicly_queryable'  => true,

        /*
         * ✅ Must be FALSE for SEO.
         * Setting true causes some plugins to add noindex to all CPT posts.
         */
        'exclude_from_search' => false,

        /*
         * ✅ Creates a /portfolio/ archive page — a rankable content hub.
         * Set to the slug string to customise: 'has_archive' => 'work'
         */
        'has_archive'         => true,

        /*
         * ✅ Required for block editor + improves crawlability signals.
         */
        'show_in_rest'        => true,

        /*
         * ✅ Controls the URL slug.
         * 'with_front' => false prevents /blog/portfolio/ if blog prefix is set.
         */
        'rewrite'             => array(
            'slug'       => 'portfolio',
            'with_front' => false,
        ),

        'label'    => 'Portfolio',
        'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'custom-fields' ),
        'menu_icon' => 'dashicons-portfolio',
    );

    register_post_type( 'portfolio', $args );
}
add_action( 'init', 'indxq_register_portfolio_cpt' );

The with_front Gotcha Nobody Talks About

If your WordPress permalink structure includes a blog prefix — like /blog/%postname%/ — then any CPT registered without 'with_front' => false will prepend that prefix to every CPT URL. Your portfolio items end up at /blog/portfolio/my-project/ instead of the intended /portfolio/my-project/.

This doesn’t always prevent indexing, but it creates confusing URL structures. More dangerously, if you later change the setting and Google has already indexed the old URLs, you now have a canonical conflict with historical signals split across two URL patterns.

After Any Registration Change: Flush Permalinks

Any time you add a new CPT, change its rewrite slug, or modify the public setting, you must flush WordPress’s rewrite rules. Go to Settings → Permalinks and click Save Changes without altering anything. This regenerates the .htaccess rewrite rules. Skipping this step produces 404 errors on every CPT URL even when the registration is otherwise perfect.

🚨 Plugin-Registered CPTs Are Often Wrong

If your CPT was registered by a theme or third-party plugin, check its public setting immediately. Many theme-bundled CPTs are registered with public => false by design (for internal use), or the developer simply didn’t consider SEO. Use the Custom Post Type UI plugin to inspect and override settings without touching code.

The Art of SEO — O'Reilly
Recommended Book
The Art of SEO: Mastering Search Engine Optimization (4th Ed.)
The definitive technical SEO reference by Eric Enge, Stephan Spencer, and Jessie Stricchiola. Covers structured data, crawl architecture, content strategy, and advanced WordPress SEO.
View on Amazon
Section 04

Sitemap Exclusion: The Silent CPT Killer

A CPT can be registered as perfectly public and still be completely absent from your XML sitemap — and a page not in the sitemap is significantly less likely to be discovered by Google, especially on newer or lower-authority sites.

WordPress 5.5 introduced a native sitemap at /wp-sitemap.xml that includes all public CPTs automatically. But virtually every serious WordPress SEO setup replaces this with the sitemap generated by Yoast SEO, Rank Math, or All in One SEO — and each of these plugins has its own CPT inclusion settings that need explicit configuration.

Why Sitemaps Matter More for CPTs Than Standard Posts

Standard WordPress posts accumulate discovery signals automatically: category archives, tag archives, recent posts widgets, sidebars, RSS feeds. All of these give Googlebot a way to find new posts without needing an explicit sitemap entry. CPTs often have none of these built-in discovery mechanisms. The sitemap may be the only path Googlebot has to find them.

Fixing Yoast SEO Sitemap Exclusion

1
Navigate to Yoast SEO → Search Appearance → Content Types
This screen lists all registered public post types including your CPTs. Each has its own visibility toggle.
2
Set your CPT’s “Show in search results” to Yes
This single toggle controls both the noindex directive and the sitemap inclusion simultaneously. Setting it to No excludes the CPT from both.
3
Verify sitemap at /sitemap_index.xml
Check that a dedicated CPT sitemap entry like portfolio-sitemap.xml appears in the index. If absent, the toggle wasn’t saved or Yoast doesn’t recognise the post type as public.
4
Re-submit the sitemap to Google Search Console
Go to GSC → Sitemaps, enter your sitemap URL, and click Submit. Then use URL Inspection on a specific CPT URL to request immediate indexing.

Fixing Rank Math Sitemap Exclusion

In Rank Math, navigate to Rank Math → Sitemap Settings → Post Types. Each registered post type has an individual inclusion toggle. Enable your CPT, set sitemap priority (0.8 is standard for primary content types), and choose an update frequency matching your publishing cadence.

Also check Rank Math → Titles & Meta → [Your CPT]. The Robots Meta setting there must be set to “Index” — the sitemap setting and the robots setting are independent controls in Rank Math, and having one wrong undoes the other.

🔍
Related Guide WordPress Categories Indexing Issues — Complete Diagnosis and Fix Guide →
Section 05

SEO Plugin Configuration: Where CPTs Most Often Get Blocked

Your SEO plugin is the most powerful single tool affecting how Google sees your WordPress site — and it’s also where CPT visibility problems most frequently originate. Beyond sitemap settings, SEO plugins control noindex directives, canonical URL output, title templates, schema types, and robots meta tags at both the post-type and individual-post level.

Yoast vs Rank Math: CPT Configuration Comparison

Setting Yoast Location Rank Math Location Affects
Sitemap inclusion Search Appearance → Content Types Sitemap Settings → Post Types Discovery
Global noindex toggle Search Appearance → Content Types Titles & Meta → [CPT] → Robots Indexability
Default title template Search Appearance → Content Types Titles & Meta → [CPT] → Title SERP appearance
Default meta desc template Search Appearance → Content Types Titles & Meta → [CPT] → Description Click-through rate
Default schema type Search Appearance → Content Types Titles & Meta → [CPT] → Schema Rich results eligibility
Archive page noindex Search Appearance → Archives Titles & Meta → [CPT] → Archive Archive indexability

The Plugin Conflict Problem

When multiple plugins output meta robots tags for the same page, the results are unpredictable. If your theme adds its own <meta name="robots"> tag and Yoast SEO also adds one, and they say different things — or worse, if one says noindex and the other says index, follow — Google applies the most restrictive directive. A single stray noindex from a theme nullifies everything your SEO plugin is doing.

⚠️
Plugin Conflicts Yoast SEO Conflicting With Other Plugins — How to Diagnose and Fix →

Auditing What Google Actually Sees

Don’t guess — check. Use Google’s Rich Results Test or the URL Inspection tool in GSC to render any CPT URL as Googlebot sees it. Examine the <head> section carefully. If you see two <meta name="robots"> tags with conflicting values, you have a plugin conflict producing the most restrictive outcome. The solution is to remove whichever output is wrong — usually by disabling the theme’s SEO features in its settings, since your dedicated SEO plugin should own all meta tag output.

WordPress: The Missing Manual
Recommended Book
WordPress: The Missing Manual — Complete Guide to WordPress Architecture
Comprehensive coverage of custom post types, taxonomies, theme templates, and WordPress plugin development. Ideal for developers managing complex CPT structures.
View on Amazon
Section 07

Canonical Tags, Noindex Directives, and URL Canonicalisation

Even a correctly registered, sitemap-included CPT can fail to rank if its canonical tags are wrong or if noindex directives are being applied from unexpected sources. Canonical issues are particularly common with CPTs because CPT content often exists in multiple URL contexts simultaneously.

A portfolio item might be accessible at /portfolio/project-name/, via a direct WordPress query string at /?post_type=portfolio&p=123, and potentially through a custom page template that renders the same content at a different URL. Without correct canonical tags, Google sees the same content at multiple addresses and may index the wrong one — or none of them.

What a Correct Canonical Looks Like

For a CPT post at https://yoursite.com/portfolio/my-project/:

<!-- This is what Google should see in your <head> -->
<link rel="canonical" href="https://yoursite.com/portfolio/my-project/" />

<!-- NOT this (query string form) -->
<link rel="canonical" href="https://yoursite.com/?post_type=portfolio&p=123" />

<!-- NOT this (HTTP instead of HTTPS) -->
<link rel="canonical" href="http://yoursite.com/portfolio/my-project/" />

Common Canonical Mistakes With CPTs

Mistake Canonical You See Effect on Google Fix
Canonical points to homepage https://yoursite.com/ CPT pages may not be indexed at all Check SEO plugin CPT settings; disable theme canonical output
Canonical uses HTTP http://yoursite.com/... Splits link signals between HTTP and HTTPS Update siteurl in Settings → General to HTTPS
Canonical uses query string /?post_type=portfolio&p=123 Google indexes ugly URL instead of pretty permalink Flush permalinks; confirm public=true and rewrite set
Duplicate canonicals Two different canonical tags on same page Google ignores conflicting canonicals entirely Remove theme’s canonical output; let SEO plugin handle it

All the Places a Noindex Can Come From

Unexpected noindex on CPT pages can originate from multiple independent sources, and you need to audit all of them:

  • SEO plugin global setting — The “Show in search results” toggle for the post type (described in sections 04 and 05).
  • Individual post-level noindex — Each CPT post has its own Yoast or Rank Math meta box. If someone manually set noindex on specific posts, those won’t rank regardless of post-type settings.
  • Password-protected posts — WordPress automatically adds a noindex directive to all password-protected content.
  • Theme meta robots output — Older themes frequently output their own <meta name="robots"> tags. If those tags say noindex for any reason, your SEO plugin’s correct settings are overridden.
  • Robots.txt blocking — If Disallow: /portfolio/ appears in your robots.txt, Googlebot won’t crawl those URLs. It may still index them if they have external links, but it won’t be able to read the content correctly.
Section 09

Schema Markup for Custom Post Types

Schema markup doesn’t cause a CPT page to rank — but it significantly affects how Google understands what the page represents and whether it qualifies for rich results. For CPTs representing specific real-world entities (products, events, recipes, job listings, local businesses, reviews), structured data is the difference between a plain blue link and an enhanced result with star ratings, pricing, event dates, or recipe imagery.

The reason schema matters specifically for CPT ranking, beyond rich results, is that it helps Google disambiguate content type. A portfolio page without schema could be a blog post, a landing page, a case study, or a product page — all structured very differently. Schema markup declares unambiguously what the content represents, which helps Google match it to the right search intents.

Schema Types by CPT Use Case

CPT Type Recommended Schema Rich Result Potential
Portfolio / Case Studies CreativeWork, Article Standard listing
Products Product, Offer, AggregateRating Price, ratings, availability
Events Event Date, venue, ticket links
Recipes Recipe Image, cook time, ratings
Job Listings JobPosting Google for Jobs integration
Properties / Real Estate RealEstateListing, Place Location, price range
Reviews / Testimonials Review, AggregateRating Star ratings in SERPs
Team Members / Profiles Person Knowledge panel potential

Adding Schema to CPTs Programmatically

For precise control, output JSON-LD directly in your CPT’s single template using the wp_head action:

function indxq_portfolio_schema() {
    if ( ! is_singular( 'portfolio' ) ) return;

    $post_id = get_the_ID();

    $schema = array(
        '@context'    => 'https://schema.org',
        '@type'       => 'CreativeWork',
        'name'        => get_the_title( $post_id ),
        'description' => get_the_excerpt( $post_id ),
        'url'         => get_permalink( $post_id ),
        'dateCreated' => get_the_date( 'c', $post_id ),
        'dateModified'=> get_the_modified_date( 'c', $post_id ),
        'image'       => array(
            '@type' => 'ImageObject',
            'url'   => get_the_post_thumbnail_url( $post_id, 'full' ),
        ),
        'author' => array(
            '@type' => 'Organization',
            'name'  => get_bloginfo( 'name' ),
            'url'   => get_bloginfo( 'url' ),
        ),
    );

    echo '<script type="application/ld+json">';
    echo wp_json_encode( $schema, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE );
    echo '</script>' . PHP_EOL;
}
add_action( 'wp_head', 'indxq_portfolio_schema' );

Using Rank Math or Yoast for CPT Schema

Both plugins offer CPT-level schema configuration. In Rank Math: Titles & Meta → [Your CPT] → Schema — select the appropriate schema type from the dropdown and it applies to all posts in that CPT as the default, with per-post overrides still available. In Yoast, the equivalent setting is under Search Appearance → Content Types → [Your CPT] → Schema tab. Using the plugin approach means you don’t need to write code, and the schema output is automatically kept in sync with each post’s content.

Section 10

Optimising Custom Post Type Archive Pages

The CPT archive page is the anchor of your entire CPT structure. When has_archive => true is set in registration, WordPress creates an archive at the URL matching your CPT’s rewrite slug — for example, /portfolio/ for a portfolio CPT. This page lists all posts in that CPT, functioning much like a category archive lists all posts in a category.

The problem is that CPT archives are almost always neglected. They have no custom title or meta description. They contain no introductory text — just a grid of post titles and featured images. They receive almost no attention in terms of on-page SEO. The result is that the archive page doesn’t rank for the broad head terms you’d ideally want it to capture (“web design portfolio,” “digital marketing case studies”), and it contributes minimal authority to the individual CPT pages it links to because its own authority is low.

Turning CPT Archives Into Rankable Pages

  • Add 150–300 words of introductory content above the loop — Use a WordPress template (archive-[post_type].php) with a description function call to display content you’ve written for the term. Alternatively, use a custom field or page builder block to add editorial context above the post listing.
  • Write a custom title tag and meta description — In Yoast or Rank Math, navigate to the archive settings for your CPT. Write a title targeting the primary head keyword for that content category and a meta description optimised for click-through rate.
  • Enable the archive in your sitemap — Rank Math and Yoast have separate settings for CPT archives versus individual CPT posts. Find the archive-specific toggle and enable it independently.
  • Link to the archive from your main navigation — If the CPT represents important site content, its archive belongs in the header navigation. This passes homepage authority directly to the archive, which distributes it to all individual CPT entries.
  • Handle pagination correctly — WordPress auto-paginates long archives at /portfolio/page/2/. Ensure your SEO plugin handles pagination canonicals correctly and that paginated archive pages don’t have noindex applied (which some plugins do by default for pagination).
⚠️ Don’t Blindly Noindex CPT Archives

Many SEO tutorials recommend noindexing archive pages to avoid duplicate content. For CPT archives, this is usually wrong. Unlike standard date or tag archives (which often do overlap and duplicate content), a CPT archive typically represents a unique content hub with genuine ranking value. Only noindex a CPT archive if it genuinely adds no unique value — which is rare.

Section 11

Custom Taxonomies and CPT SEO: Making Content Topically Coherent

Custom taxonomies are to custom post types what categories and tags are to standard posts. They create classification structures that help both users and search engines understand how content within your CPT relates to other content. But they also introduce their own SEO complexity — each taxonomy creates its own archive pages that can either strengthen your site’s topical authority or contribute thin-content problems, depending on how they’re configured.

The SEO Value of a Well-Structured Taxonomy

A custom taxonomy does three important things for CPT SEO:

  1. Creates crawlable archive pages that rank independently — A portfolio-type taxonomy with a “Branding” term creates a /portfolio-type/branding/ archive that can rank for queries like “branding portfolio examples” even when individual portfolio items can’t.
  2. Establishes explicit topical relationships — Google can see that your “Acme Corp” case study and your “Beta Inc.” case study both belong to the “SaaS” category. This topical clustering strengthens authority signals for all content in the group.
  3. Creates additional internal link paths — Every taxonomy archive page links to all CPT posts within it. More paths from high-authority pages to individual CPT entries means better PageRank distribution.

SEO-Correct Taxonomy Registration

function indxq_register_portfolio_taxonomy() {
    $args = array(
        'public'             => true,
        'publicly_queryable' => true,
        'show_in_rest'       => true,    // Required for block editor

        // hierarchical = true gives categories-like behaviour
        // hierarchical = false gives tag-like behaviour
        'hierarchical'       => true,

        'rewrite' => array(
            'slug'       => 'portfolio-type',
            'with_front' => false,
        ),

        'show_admin_column' => true,
        'labels' => array(
            'name'          => 'Portfolio Types',
            'singular_name' => 'Portfolio Type',
        ),
    );

    // Link to the 'portfolio' CPT
    register_taxonomy( 'portfolio_type', array( 'portfolio' ), $args );
}
add_action( 'init', 'indxq_register_portfolio_taxonomy' );

Avoiding the Thin Archive Problem

Custom taxonomy archives face the same thin-content risk as CPT archives. A taxonomy term with two or three posts under it has almost no textual content and no unique value for Google. Practical strategies to avoid this:

  • Add taxonomy term descriptions in the admin (Appearance → Taxonomies) — SEO plugins display these as introductory text on the archive page
  • Set a minimum threshold of five or more posts before adding a new taxonomy term
  • Noindex taxonomy terms with fewer than four posts and re-enable indexation once they grow
  • Consolidate very specific niche terms into broader, well-populated ones
Technical SEO book
Recommended Resource
Professional WordPress: Design and Development (3rd Ed.)
Deep coverage of custom post types, custom taxonomies, theme template hierarchy, and the query system — everything a developer needs to build SEO-correct CPT architectures.
View on Amazon
Section 12

The Complete Google Search Console Audit for CPT Problems

Google Search Console is the most powerful diagnostic tool available for CPT indexation problems — but only if you know exactly what to look at and what each status message means in the context of custom post types. This section gives you a structured audit sequence that takes about 30 minutes and will identify the cause of any CPT ranking failure.

Step-by-Step GSC Audit Sequence

1
Run a site: search in Google
Search site:yourdomain.com/your-cpt-slug/ in Google. Zero results means either not indexed or not being crawled. This is your baseline — before opening GSC, know what Google actually shows.
2
Check GSC → Indexing → Pages, filter to your CPT slug
Use the Page URL filter to show only URLs containing your CPT slug. Review the “Not indexed” section and note which specific reason codes appear — each maps to a specific fix.
3
Use URL Inspection on 3–5 specific CPT pages
Enter specific CPT post URLs in the URL Inspection tool. Check: crawl date, index status, canonical URL Google is using, and whether any noindex directive is detected. This gives per-page diagnostic data.
4
Check the Sitemaps report for CPT coverage
Under GSC → Sitemaps, verify your sitemap is being processed without errors. Then check the sitemap XML directly to confirm CPT URLs are present. The “pages submitted” count should match your CPT post count.
5
Review Performance data filtered to CPT URLs
In GSC → Performance, filter Pages to show only CPT URLs. Even zero impressions tells you something — it means Google is not showing these pages for any queries, which confirms a configuration problem rather than a ranking problem.

Decoding the “Not Indexed” Reason Codes

GSC Status Meaning for CPTs Most Likely Cause Fix
Noindex tag detected Page has explicit noindex in <head> SEO plugin CPT setting or theme meta robots Fix plugin toggle; remove conflicting theme output
Crawled — not indexed Google visited but chose not to index Thin content; near-duplicate content; low quality signals Add unique content; improve internal links; add schema
Discovered — not crawled Found in sitemap, not yet visited Crawl budget; new pages; low priority signals from few links Request indexing via URL Inspection; strengthen internal links
Blocked by robots.txt Googlebot is being refused access Disallow rule in robots.txt covers CPT slug Edit robots.txt to allow the CPT URL path
Soft 404 Page loads but has no meaningful content Empty CPT template; post with no body content Add substantive content; fix template to display fields correctly
Redirect error CPT URL redirects incorrectly Stale rewrite rules; rewrite slug conflict Flush permalinks; resolve slug conflict
Duplicate without canonical Same content accessible at multiple URLs Query string URL and pretty URL both accessible Flush permalinks; ensure SEO plugin outputs canonical
✓ The 30-Minute CPT SEO Checklist

Work through this in order: (1) Confirm public => true in registration. (2) Flush permalinks. (3) Confirm SEO plugin has CPT set to “index.” (4) Confirm CPT appears in sitemap XML. (5) Use URL Inspection on 3 CPT URLs. (6) Check for rewrite slug conflicts with Rewrite Rules Inspector. (7) Count internal links to CPT pages using Screaming Frog (target: more than 5 per page). If everything passes, the problem is content quality or crawl budget — not technical configuration.

📱
Performance & Rankings Why Is My WordPress Site So Slow on Mobile? — Full Speed Diagnosis and Fix →
FAQs

Common Questions About Custom Post Types and SEO

The most common causes are registering the CPT with public => false, having an SEO plugin apply a noindex directive to the post type, the CPT being absent from your XML sitemap, or a rewrite slug conflict producing 404 errors or redirect loops. Start your diagnosis with the registration parameters in register_post_type(), then check your SEO plugin’s Content Types settings. Use the URL Inspection tool in Google Search Console on a specific CPT URL to see exactly what Google reports about that page’s index status.

WordPress 5.5 introduced a native sitemap at /wp-sitemap.xml that includes all public CPTs automatically. However, most sites using an SEO plugin (Yoast, Rank Math, All in One SEO) have those plugins replace the core sitemap entirely. Each requires you to explicitly enable CPT inclusion in their own sitemap settings. Yoast: Search Appearance → Content Types → Show in search results: Yes. Rank Math: Sitemap Settings → Post Types → enable your CPT.

The exclude_from_search parameter controls whether posts of that type appear in WordPress’s front-end search results (the /?s=query endpoint). When set to true, some SEO plugins interpret this as a signal to add a noindex meta tag to all posts of that type — creating a situation where the CPT is visible on the front-end but actively excluded from Google’s index. Set it to false for every CPT you want Google to index.

Go to Yoast SEO → Search Appearance → Content Types. Your CPT should appear in the list alongside Posts and Pages (if it was registered with public => true). Set “Show in search results” to Yes and save. Verify at yourdomain.com/sitemap_index.xml that a dedicated CPT sitemap entry now appears. Then re-submit the sitemap in Google Search Console and use the URL Inspection tool on a specific CPT URL to request immediate indexing.

Yes, seriously. If your CPT slug matches an existing page slug, a taxonomy slug, or a WordPress reserved word (like page, feed, attachment, embed), WordPress routing either fails or produces unpredictable redirects. The result is 404 errors, redirect loops, or pages that serve the wrong content to Googlebot. Install the Rewrite Rules Inspector plugin to see all registered rules and test specific URLs against them. Flush permalinks after resolving any conflict.

Yes. Archive pages target broader head keywords (e.g., “web design portfolio”) while single posts target specific long-tail queries (e.g., “brand identity design for tech startup”). CPT archives often rank poorly because they contain no unique textual content beyond post titles and excerpts. To improve archive ranking, add custom introductory text above the loop, write a proper title tag and meta description targeting the head keyword, and link to the archive from your main navigation. Individual CPT posts rank better when they contain 500+ words of genuinely unique, useful content.

Use three methods in combination: (1) Search site:yourdomain.com/your-cpt-slug/ in Google to see currently indexed CPT pages. (2) Use the GSC URL Inspection tool on a specific CPT URL — check the Coverage section for crawl date and index status. (3) In GSC → Indexing → Pages, filter by URL contains your CPT slug to see all indexed and not-indexed pages with specific reason codes for each status.

Yes, in almost all cases. Custom taxonomies create crawlable archive pages that can rank for category-level queries, establish topical clustering that strengthens authority signals, and generate additional internal link paths to individual CPT posts. The caveat: each taxonomy term archive needs at least five posts and some introductory content to avoid being flagged as thin content. Use taxonomies with meaningful terms and adequate content volume — 20 micro-niche terms each with two posts is worse than five well-populated categories each with fifteen posts.

A CPT can be publicly accessible in the browser but still excluded from Google through: an SEO plugin’s global noindex setting for that post type; a Disallow rule in robots.txt covering the CPT URL path; or a plugin conflict where multiple plugins output conflicting meta robots tags (and the noindex wins). Use Google’s Rich Results Test or GSC URL Inspection to see the actual HTTP response and HTML head section as Google receives it — this reveals noindex directives that aren’t visible when browsing normally.

Flushing permalinks (Settings → Permalinks → Save Changes without changes) regenerates WordPress’s rewrite rules, which fixes 404 errors caused by stale routing rules. It is required after any CPT registration change, slug modification, or new CPT/taxonomy addition. It does not fix noindex directives, sitemap exclusions, or canonical problems — those require separate fixes. Always flush permalinks first when troubleshooting, then investigate other causes if 404s aren’t the root problem.

Conclusion

Custom Post Types Can Rank — When Every Configuration Is Correct

The consistent theme running through every section of this guide is this: WordPress custom post types don’t rank because of content quality problems. They don’t rank because of a chain of configuration decisions — at the registration level, the SEO plugin level, the sitemap level, the permalink level — that collectively make them invisible to Google before the content quality question ever becomes relevant.

The diagnostic hierarchy matters. A CPT registered with public => false cannot rank regardless of how excellent the content is or how carefully the schema markup was crafted. Fix the registration. Flush permalinks. Confirm the SEO plugin is not applying a noindex. Verify sitemap inclusion. Only when all of those pass should you investigate structural factors like internal linking and content depth.

The rewarding thing about CPT SEO failures is that they respond to exact interventions. There’s no ambiguity of the kind you encounter with ranking problems caused by competition or E-E-A-T assessment. Each cause in this guide has a specific, testable fix. Apply them in order, verify each fix using GSC URL Inspection, and the pages you’ve built will find their way into Google’s index.

The case studies, portfolio items, recipes, job listings, and product pages you’ve published in CPTs represent some of the most structured, specific content on your site. That specificity — content organised around clear entities with consistent attributes — is exactly what performs well in a search landscape increasingly dominated by entity-based understanding and semantic search. The work of getting these pages indexed is worth the effort.

// Next Steps

Everything still visible after
fixing your CPTs?

Read the full indxq diagnostic series — WordPress SEO problems dissected from first principles, with evidence-based fixes for every cause.

Explore the Full SEO Series →

3 thoughts on “WordPress Custom Post Types Not Ranking: Every Cause,Every Fix”

  1. Thanks for one’s marvelous posting! I really enjoyed reading it, you could be a great author.I will be sure to bookmark your blog and will often come back later in life. I want to encourage one to continue your great writing, have a nice holiday weekend!

  2. It’s perfect time to make some plans for the future and it’s time to be happy. I have read this post and if I could I wish to suggest you some interesting things or advice. Perhaps you can write next articles referring to this article. I want to read more things about it!

  3. Howdy very cool site!! Man .. Excellent .. Superb .. I will bookmark your blog and take the feeds also? I am happy to find numerous helpful information here within the publish, we’d like work out extra strategies on this regard, thank you for sharing. . . . . .

Comments are closed.

IQ

Sayed Iftekharul Haque — SEO Strategist & Web Designer

Founder of IndXQ. Specialises in SEO-first website redesigns, Core Web Vitals, and digital growth strategy. Available for projects via Fiverr, Upwork, and direct engagements. Connect on LinkedIn or watch free SEO tutorials on YouTube.

Published by IndXQ · Web Strategy & SEO · April 2026 · All rights reserved.

Scroll to Top