<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>wordpress development Archives - Developry Plugins</title>
	<atom:link href="https://developryplugins.com/tag/wordpress-development/feed/" rel="self" type="application/rss+xml" />
	<link>https://developryplugins.com/tag/wordpress-development/</link>
	<description></description>
	<lastBuildDate>Mon, 24 Nov 2025 11:17:57 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://developryplugins.com/wp-content/uploads/2026/06/cropped-favicon-alt-32x32.webp</url>
	<title>wordpress development Archives - Developry Plugins</title>
	<link>https://developryplugins.com/tag/wordpress-development/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How to Add Custom Post Types to WordPress Without Plugins</title>
		<link>https://developryplugins.com/how-to-add-custom-post-types-to-wordpress-without-plugins/</link>
		
		<dc:creator><![CDATA[Krasen Slavov]]></dc:creator>
		<pubDate>Thu, 20 Aug 2026 09:00:00 +0000</pubDate>
				<category><![CDATA[WordPress Tips Tricks & Hacks]]></category>
		<category><![CDATA[content types]]></category>
		<category><![CDATA[cpt]]></category>
		<category><![CDATA[custom post types]]></category>
		<category><![CDATA[post types]]></category>
		<category><![CDATA[wordpress development]]></category>
		<guid isPermaLink="false">https://developryplugins.com/?p=188</guid>

					<description><![CDATA[<p>Custom post types extend WordPress beyond blogs and pages, enabling portfolio items, products, testimonials, and any content structure imaginable. While plugins simplify creation, coding custom post types provides complete control,...</p>
<p>The post <a href="https://developryplugins.com/how-to-add-custom-post-types-to-wordpress-without-plugins/">How to Add Custom Post Types to WordPress Without Plugins</a> appeared first on <a href="https://developryplugins.com">Developry Plugins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><!-- @format --></p>
<p>Custom post types extend WordPress beyond blogs and pages, enabling portfolio items, products, testimonials, and any content structure imaginable. While plugins simplify creation, coding custom post types provides complete control, better performance, and deeper WordPress understanding. This comprehensive guide teaches custom post type registration, taxonomy association, template creation, and advanced customization without plugins.</p>
<h2 id="understanding-custom-post-types">Understanding Custom Post Types</h2>
<p>WordPress includes five default post types:</p>
<ul>
<li>post (Blog posts)</li>
<li>page (Static pages)</li>
<li>attachment (Media)</li>
<li>revision (Post revisions)</li>
<li>nav_menu_item (Menu items)</li>
</ul>
<p>Custom post types add structured content beyond these defaults.</p>
<p><strong>Common Use Cases</strong>:</p>
<ul>
<li>Portfolio projects</li>
<li>Products/services</li>
<li>Team members</li>
<li>Testimonials</li>
<li>Events</li>
<li>Case studies</li>
<li>Properties/listings</li>
<li>Courses/lessons</li>
</ul>
<h2 id="basic-custom-post-type-registration">Basic Custom Post Type Registration</h2>
<p><strong>Simple Portfolio CPT</strong>:</p>
<div class="sourceCode" id="cb1">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true"></a><span class="kw">function</span> dprt_register_portfolio<span class="ot">()</span> {</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true"></a>    register_post_type<span class="ot">(</span><span class="st">&#39;portfolio&#39;</span><span class="ot">,</span> <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true"></a>        <span class="st">&#39;labels&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true"></a>            <span class="st">&#39;name&#39;</span> =&gt; <span class="st">&#39;Portfolio&#39;</span><span class="ot">,</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true"></a>            <span class="st">&#39;singular_name&#39;</span> =&gt; <span class="st">&#39;Portfolio Item&#39;</span><span class="ot">,</span></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true"></a>            <span class="st">&#39;add_new&#39;</span> =&gt; <span class="st">&#39;Add New Project&#39;</span><span class="ot">,</span></span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true"></a>            <span class="st">&#39;add_new_item&#39;</span> =&gt; <span class="st">&#39;Add New Portfolio Item&#39;</span><span class="ot">,</span></span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true"></a>            <span class="st">&#39;edit_item&#39;</span> =&gt; <span class="st">&#39;Edit Portfolio Item&#39;</span><span class="ot">,</span></span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true"></a>            <span class="st">&#39;new_item&#39;</span> =&gt; <span class="st">&#39;New Portfolio Item&#39;</span><span class="ot">,</span></span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true"></a>            <span class="st">&#39;view_item&#39;</span> =&gt; <span class="st">&#39;View Portfolio Item&#39;</span><span class="ot">,</span></span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true"></a>            <span class="st">&#39;search_items&#39;</span> =&gt; <span class="st">&#39;Search Portfolio&#39;</span><span class="ot">,</span></span>
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true"></a>            <span class="st">&#39;not_found&#39;</span> =&gt; <span class="st">&#39;No portfolio items found&#39;</span><span class="ot">,</span></span>
<span id="cb1-13"><a href="#cb1-13" aria-hidden="true"></a>            <span class="st">&#39;not_found_in_trash&#39;</span> =&gt; <span class="st">&#39;No portfolio items found in trash&#39;</span></span>
<span id="cb1-14"><a href="#cb1-14" aria-hidden="true"></a>        <span class="ot">),</span></span>
<span id="cb1-15"><a href="#cb1-15" aria-hidden="true"></a>        <span class="st">&#39;public&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb1-16"><a href="#cb1-16" aria-hidden="true"></a>        <span class="st">&#39;has_archive&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb1-17"><a href="#cb1-17" aria-hidden="true"></a>        <span class="st">&#39;rewrite&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span><span class="st">&#39;slug&#39;</span> =&gt; <span class="st">&#39;portfolio&#39;</span><span class="ot">),</span></span>
<span id="cb1-18"><a href="#cb1-18" aria-hidden="true"></a>        <span class="st">&#39;supports&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span><span class="st">&#39;title&#39;</span><span class="ot">,</span> <span class="st">&#39;editor&#39;</span><span class="ot">,</span> <span class="st">&#39;thumbnail&#39;</span><span class="ot">,</span> <span class="st">&#39;excerpt&#39;</span><span class="ot">),</span></span>
<span id="cb1-19"><a href="#cb1-19" aria-hidden="true"></a>        <span class="st">&#39;menu_icon&#39;</span> =&gt; <span class="st">&#39;dashicons-portfolio&#39;</span><span class="ot">,</span></span>
<span id="cb1-20"><a href="#cb1-20" aria-hidden="true"></a>        <span class="st">&#39;show_in_rest&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span> <span class="co">// Gutenberg support</span></span>
<span id="cb1-21"><a href="#cb1-21" aria-hidden="true"></a>    <span class="ot">));</span></span>
<span id="cb1-22"><a href="#cb1-22" aria-hidden="true"></a>}</span>
<span id="cb1-23"><a href="#cb1-23" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;init&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_register_portfolio&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<p><strong>Flush Rewrite Rules</strong> (run once after registration):</p>
<div class="sourceCode" id="cb2">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true"></a><span class="co">// Visit Settings → Permalinks to flush, or run this code once:</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true"></a>flush_rewrite_rules<span class="ot">();</span></span></code></pre>
</div>
<h2 id="complete-parameter-reference">Complete Parameter Reference</h2>
<p><strong>Essential Parameters</strong>:</p>
<p><strong>public</strong> (boolean): Makes CPT publicly queryable.</p>
<ul>
<li>true: Visible on front-end and admin</li>
<li>false: Hidden from public</li>
</ul>
<p><strong>publicly_queryable</strong> (boolean): Whether post type can be queried from front-end.</p>
<p><strong>show_ui</strong> (boolean): Generate admin UI.</p>
<p><strong>show_in_menu</strong> (boolean): Show in admin menu.</p>
<ul>
<li>true: Top-level menu</li>
<li>string: ‘tools.php’ makes submenu under Tools</li>
</ul>
<p><strong>menu_position</strong> (integer): Admin menu order.</p>
<ul>
<li>5: Below Posts</li>
<li>10: Below Media</li>
<li>15: Below Links</li>
<li>20: Below Pages</li>
<li>25: Below Comments</li>
</ul>
<p><strong>menu_icon</strong> (string): Dashicon class or image URL.</p>
<ul>
<li>‘dashicons-portfolio’</li>
<li>‘dashicons-products’</li>
<li>‘dashicons-groups’</li>
<li>get_template_directory_uri() . ‘/images/icon.png’</li>
</ul>
<p><strong>supports</strong> (array): Features CPT supports.</p>
<ul>
<li>‘title’: Title field</li>
<li>‘editor’: Content editor</li>
<li>‘thumbnail’: Featured image</li>
<li>‘excerpt’: Excerpt field</li>
<li>‘custom-fields’: Custom fields metabox</li>
<li>‘comments’: Comment discussion</li>
<li>‘revisions’: Revision tracking</li>
<li>‘page-attributes’: Order/parent</li>
<li>‘post-formats’: Post format selection</li>
</ul>
<p><strong>taxonomies</strong> (array): Associated taxonomies.</p>
<ul>
<li>array(‘category’, ‘post_tag’)</li>
</ul>
<p><strong>has_archive</strong> (boolean|string): Archive page support.</p>
<ul>
<li>true: Uses CPT slug</li>
<li>‘projects’: Custom archive slug</li>
</ul>
<p><strong>rewrite</strong> (array|boolean): Permalink structure.</p>
<div class="sourceCode" id="cb3">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true"></a><span class="kw">array</span><span class="ot">(</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true"></a>    <span class="st">&#39;slug&#39;</span> =&gt; <span class="st">&#39;portfolio&#39;</span><span class="ot">,</span></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true"></a>    <span class="st">&#39;with_front&#39;</span> =&gt; <span class="kw">false</span><span class="ot">,</span></span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true"></a>    <span class="st">&#39;hierarchical&#39;</span> =&gt; <span class="kw">false</span></span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true"></a><span class="ot">)</span></span></code></pre>
</div>
<p><strong>capability_type</strong> (string): Capability structure.</p>
<ul>
<li>‘post’: Uses post capabilities</li>
<li>‘page’: Uses page capabilities</li>
<li>array(‘book’, ‘books’): Custom capabilities</li>
</ul>
<p><strong>show_in_rest</strong> (boolean): REST API and Gutenberg support.</p>
<ul>
<li>true: Enables block editor</li>
</ul>
<h2 id="advanced-custom-post-type-example">Advanced Custom Post Type Example</h2>
<p><strong>Complete Product CPT</strong>:</p>
<div class="sourceCode" id="cb4">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true"></a><span class="kw">function</span> dprt_register_products<span class="ot">()</span> {</span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true"></a>    <span class="kw">$labels</span> = <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true"></a>        <span class="st">&#39;name&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Products&#39;</span><span class="ot">,</span> <span class="st">&#39;Post type general name&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true"></a>        <span class="st">&#39;singular_name&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Product&#39;</span><span class="ot">,</span> <span class="st">&#39;Post type singular name&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true"></a>        <span class="st">&#39;menu_name&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Products&#39;</span><span class="ot">,</span> <span class="st">&#39;Admin Menu text&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true"></a>        <span class="st">&#39;name_admin_bar&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Product&#39;</span><span class="ot">,</span> <span class="st">&#39;Add New on Toolbar&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true"></a>        <span class="st">&#39;add_new&#39;</span> =&gt; <span class="kw">__</span><span class="ot">(</span><span class="st">&#39;Add New&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true"></a>        <span class="st">&#39;add_new_item&#39;</span> =&gt; <span class="kw">__</span><span class="ot">(</span><span class="st">&#39;Add New Product&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true"></a>        <span class="st">&#39;new_item&#39;</span> =&gt; <span class="kw">__</span><span class="ot">(</span><span class="st">&#39;New Product&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-10"><a href="#cb4-10" aria-hidden="true"></a>        <span class="st">&#39;edit_item&#39;</span> =&gt; <span class="kw">__</span><span class="ot">(</span><span class="st">&#39;Edit Product&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-11"><a href="#cb4-11" aria-hidden="true"></a>        <span class="st">&#39;view_item&#39;</span> =&gt; <span class="kw">__</span><span class="ot">(</span><span class="st">&#39;View Product&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-12"><a href="#cb4-12" aria-hidden="true"></a>        <span class="st">&#39;all_items&#39;</span> =&gt; <span class="kw">__</span><span class="ot">(</span><span class="st">&#39;All Products&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-13"><a href="#cb4-13" aria-hidden="true"></a>        <span class="st">&#39;search_items&#39;</span> =&gt; <span class="kw">__</span><span class="ot">(</span><span class="st">&#39;Search Products&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-14"><a href="#cb4-14" aria-hidden="true"></a>        <span class="st">&#39;parent_item_colon&#39;</span> =&gt; <span class="kw">__</span><span class="ot">(</span><span class="st">&#39;Parent Products:&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-15"><a href="#cb4-15" aria-hidden="true"></a>        <span class="st">&#39;not_found&#39;</span> =&gt; <span class="kw">__</span><span class="ot">(</span><span class="st">&#39;No products found.&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-16"><a href="#cb4-16" aria-hidden="true"></a>        <span class="st">&#39;not_found_in_trash&#39;</span> =&gt; <span class="kw">__</span><span class="ot">(</span><span class="st">&#39;No products found in Trash.&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-17"><a href="#cb4-17" aria-hidden="true"></a>        <span class="st">&#39;featured_image&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Product Image&#39;</span><span class="ot">,</span> <span class="st">&#39;Overrides the &quot;Featured Image&quot; phrase&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-18"><a href="#cb4-18" aria-hidden="true"></a>        <span class="st">&#39;set_featured_image&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Set product image&#39;</span><span class="ot">,</span> <span class="st">&#39;Overrides the &quot;Set featured image&quot; phrase&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-19"><a href="#cb4-19" aria-hidden="true"></a>        <span class="st">&#39;remove_featured_image&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Remove product image&#39;</span><span class="ot">,</span> <span class="st">&#39;Overrides the &quot;Remove featured image&quot; phrase&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-20"><a href="#cb4-20" aria-hidden="true"></a>        <span class="st">&#39;use_featured_image&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Use as product image&#39;</span><span class="ot">,</span> <span class="st">&#39;Overrides the &quot;Use as featured image&quot; phrase&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-21"><a href="#cb4-21" aria-hidden="true"></a>        <span class="st">&#39;archives&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Product archives&#39;</span><span class="ot">,</span> <span class="st">&#39;The post type archive label&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-22"><a href="#cb4-22" aria-hidden="true"></a>        <span class="st">&#39;insert_into_item&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Insert into product&#39;</span><span class="ot">,</span> <span class="st">&#39;Overrides the &quot;Insert into post&quot; phrase&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-23"><a href="#cb4-23" aria-hidden="true"></a>        <span class="st">&#39;uploaded_to_this_item&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Uploaded to this product&#39;</span><span class="ot">,</span> <span class="st">&#39;Overrides the &quot;Uploaded to this post&quot; phrase&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-24"><a href="#cb4-24" aria-hidden="true"></a>        <span class="st">&#39;filter_items_list&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Filter products list&#39;</span><span class="ot">,</span> <span class="st">&#39;Screen reader text&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-25"><a href="#cb4-25" aria-hidden="true"></a>        <span class="st">&#39;items_list_navigation&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Products list navigation&#39;</span><span class="ot">,</span> <span class="st">&#39;Screen reader text&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-26"><a href="#cb4-26" aria-hidden="true"></a>        <span class="st">&#39;items_list&#39;</span> =&gt; _x<span class="ot">(</span><span class="st">&#39;Products list&#39;</span><span class="ot">,</span> <span class="st">&#39;Screen reader text&#39;</span><span class="ot">,</span> <span class="st">&#39;textdomain&#39;</span><span class="ot">),</span></span>
<span id="cb4-27"><a href="#cb4-27" aria-hidden="true"></a>    <span class="ot">);</span></span>
<span id="cb4-28"><a href="#cb4-28" aria-hidden="true"></a></span>
<span id="cb4-29"><a href="#cb4-29" aria-hidden="true"></a>    <span class="kw">$args</span> = <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb4-30"><a href="#cb4-30" aria-hidden="true"></a>        <span class="st">&#39;labels&#39;</span> =&gt; <span class="kw">$labels</span><span class="ot">,</span></span>
<span id="cb4-31"><a href="#cb4-31" aria-hidden="true"></a>        <span class="st">&#39;public&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb4-32"><a href="#cb4-32" aria-hidden="true"></a>        <span class="st">&#39;publicly_queryable&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb4-33"><a href="#cb4-33" aria-hidden="true"></a>        <span class="st">&#39;show_ui&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb4-34"><a href="#cb4-34" aria-hidden="true"></a>        <span class="st">&#39;show_in_menu&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb4-35"><a href="#cb4-35" aria-hidden="true"></a>        <span class="st">&#39;query_var&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb4-36"><a href="#cb4-36" aria-hidden="true"></a>        <span class="st">&#39;rewrite&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span><span class="st">&#39;slug&#39;</span> =&gt; <span class="st">&#39;product&#39;</span><span class="ot">),</span></span>
<span id="cb4-37"><a href="#cb4-37" aria-hidden="true"></a>        <span class="st">&#39;capability_type&#39;</span> =&gt; <span class="st">&#39;post&#39;</span><span class="ot">,</span></span>
<span id="cb4-38"><a href="#cb4-38" aria-hidden="true"></a>        <span class="st">&#39;has_archive&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb4-39"><a href="#cb4-39" aria-hidden="true"></a>        <span class="st">&#39;hierarchical&#39;</span> =&gt; <span class="kw">false</span><span class="ot">,</span></span>
<span id="cb4-40"><a href="#cb4-40" aria-hidden="true"></a>        <span class="st">&#39;menu_position&#39;</span> =&gt; <span class="dv">5</span><span class="ot">,</span></span>
<span id="cb4-41"><a href="#cb4-41" aria-hidden="true"></a>        <span class="st">&#39;menu_icon&#39;</span> =&gt; <span class="st">&#39;dashicons-products&#39;</span><span class="ot">,</span></span>
<span id="cb4-42"><a href="#cb4-42" aria-hidden="true"></a>        <span class="st">&#39;supports&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span><span class="st">&#39;title&#39;</span><span class="ot">,</span> <span class="st">&#39;editor&#39;</span><span class="ot">,</span> <span class="st">&#39;thumbnail&#39;</span><span class="ot">,</span> <span class="st">&#39;excerpt&#39;</span><span class="ot">,</span> <span class="st">&#39;custom-fields&#39;</span><span class="ot">),</span></span>
<span id="cb4-43"><a href="#cb4-43" aria-hidden="true"></a>        <span class="st">&#39;show_in_rest&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb4-44"><a href="#cb4-44" aria-hidden="true"></a>        <span class="st">&#39;rest_base&#39;</span> =&gt; <span class="st">&#39;products&#39;</span><span class="ot">,</span></span>
<span id="cb4-45"><a href="#cb4-45" aria-hidden="true"></a>        <span class="st">&#39;rest_controller_class&#39;</span> =&gt; <span class="st">&#39;WP_REST_Posts_Controller&#39;</span><span class="ot">,</span></span>
<span id="cb4-46"><a href="#cb4-46" aria-hidden="true"></a>    <span class="ot">);</span></span>
<span id="cb4-47"><a href="#cb4-47" aria-hidden="true"></a></span>
<span id="cb4-48"><a href="#cb4-48" aria-hidden="true"></a>    register_post_type<span class="ot">(</span><span class="st">&#39;product&#39;</span><span class="ot">,</span> <span class="kw">$args</span><span class="ot">);</span></span>
<span id="cb4-49"><a href="#cb4-49" aria-hidden="true"></a>}</span>
<span id="cb4-50"><a href="#cb4-50" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;init&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_register_products&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<h2 id="custom-taxonomies-for-cpt">Custom Taxonomies for CPT</h2>
<p><strong>Category-Style Taxonomy (Hierarchical)</strong>:</p>
<div class="sourceCode" id="cb5">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true"></a><span class="kw">function</span> dprt_register_product_category<span class="ot">()</span> {</span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true"></a>    register_taxonomy<span class="ot">(</span><span class="st">&#39;product_category&#39;</span><span class="ot">,</span> <span class="st">&#39;product&#39;</span><span class="ot">,</span> <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true"></a>        <span class="st">&#39;labels&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true"></a>            <span class="st">&#39;name&#39;</span> =&gt; <span class="st">&#39;Product Categories&#39;</span><span class="ot">,</span></span>
<span id="cb5-5"><a href="#cb5-5" aria-hidden="true"></a>            <span class="st">&#39;singular_name&#39;</span> =&gt; <span class="st">&#39;Product Category&#39;</span><span class="ot">,</span></span>
<span id="cb5-6"><a href="#cb5-6" aria-hidden="true"></a>            <span class="st">&#39;search_items&#39;</span> =&gt; <span class="st">&#39;Search Categories&#39;</span><span class="ot">,</span></span>
<span id="cb5-7"><a href="#cb5-7" aria-hidden="true"></a>            <span class="st">&#39;all_items&#39;</span> =&gt; <span class="st">&#39;All Categories&#39;</span><span class="ot">,</span></span>
<span id="cb5-8"><a href="#cb5-8" aria-hidden="true"></a>            <span class="st">&#39;parent_item&#39;</span> =&gt; <span class="st">&#39;Parent Category&#39;</span><span class="ot">,</span></span>
<span id="cb5-9"><a href="#cb5-9" aria-hidden="true"></a>            <span class="st">&#39;parent_item_colon&#39;</span> =&gt; <span class="st">&#39;Parent Category:&#39;</span><span class="ot">,</span></span>
<span id="cb5-10"><a href="#cb5-10" aria-hidden="true"></a>            <span class="st">&#39;edit_item&#39;</span> =&gt; <span class="st">&#39;Edit Category&#39;</span><span class="ot">,</span></span>
<span id="cb5-11"><a href="#cb5-11" aria-hidden="true"></a>            <span class="st">&#39;update_item&#39;</span> =&gt; <span class="st">&#39;Update Category&#39;</span><span class="ot">,</span></span>
<span id="cb5-12"><a href="#cb5-12" aria-hidden="true"></a>            <span class="st">&#39;add_new_item&#39;</span> =&gt; <span class="st">&#39;Add New Category&#39;</span><span class="ot">,</span></span>
<span id="cb5-13"><a href="#cb5-13" aria-hidden="true"></a>            <span class="st">&#39;new_item_name&#39;</span> =&gt; <span class="st">&#39;New Category Name&#39;</span><span class="ot">,</span></span>
<span id="cb5-14"><a href="#cb5-14" aria-hidden="true"></a>            <span class="st">&#39;menu_name&#39;</span> =&gt; <span class="st">&#39;Categories&#39;</span><span class="ot">,</span></span>
<span id="cb5-15"><a href="#cb5-15" aria-hidden="true"></a>        <span class="ot">),</span></span>
<span id="cb5-16"><a href="#cb5-16" aria-hidden="true"></a>        <span class="st">&#39;hierarchical&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span> <span class="co">// Like categories</span></span>
<span id="cb5-17"><a href="#cb5-17" aria-hidden="true"></a>        <span class="st">&#39;show_ui&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb5-18"><a href="#cb5-18" aria-hidden="true"></a>        <span class="st">&#39;show_admin_column&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span> <span class="co">// Show in admin post list</span></span>
<span id="cb5-19"><a href="#cb5-19" aria-hidden="true"></a>        <span class="st">&#39;query_var&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb5-20"><a href="#cb5-20" aria-hidden="true"></a>        <span class="st">&#39;rewrite&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span><span class="st">&#39;slug&#39;</span> =&gt; <span class="st">&#39;product-category&#39;</span><span class="ot">),</span></span>
<span id="cb5-21"><a href="#cb5-21" aria-hidden="true"></a>        <span class="st">&#39;show_in_rest&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb5-22"><a href="#cb5-22" aria-hidden="true"></a>    <span class="ot">));</span></span>
<span id="cb5-23"><a href="#cb5-23" aria-hidden="true"></a>}</span>
<span id="cb5-24"><a href="#cb5-24" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;init&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_register_product_category&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<p><strong>Tag-Style Taxonomy (Non-Hierarchical)</strong>:</p>
<div class="sourceCode" id="cb6">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true"></a><span class="kw">function</span> dprt_register_product_tag<span class="ot">()</span> {</span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true"></a>    register_taxonomy<span class="ot">(</span><span class="st">&#39;product_tag&#39;</span><span class="ot">,</span> <span class="st">&#39;product&#39;</span><span class="ot">,</span> <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true"></a>        <span class="st">&#39;labels&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true"></a>            <span class="st">&#39;name&#39;</span> =&gt; <span class="st">&#39;Product Tags&#39;</span><span class="ot">,</span></span>
<span id="cb6-5"><a href="#cb6-5" aria-hidden="true"></a>            <span class="st">&#39;singular_name&#39;</span> =&gt; <span class="st">&#39;Product Tag&#39;</span><span class="ot">,</span></span>
<span id="cb6-6"><a href="#cb6-6" aria-hidden="true"></a>            <span class="st">&#39;search_items&#39;</span> =&gt; <span class="st">&#39;Search Tags&#39;</span><span class="ot">,</span></span>
<span id="cb6-7"><a href="#cb6-7" aria-hidden="true"></a>            <span class="st">&#39;all_items&#39;</span> =&gt; <span class="st">&#39;All Tags&#39;</span><span class="ot">,</span></span>
<span id="cb6-8"><a href="#cb6-8" aria-hidden="true"></a>            <span class="st">&#39;edit_item&#39;</span> =&gt; <span class="st">&#39;Edit Tag&#39;</span><span class="ot">,</span></span>
<span id="cb6-9"><a href="#cb6-9" aria-hidden="true"></a>            <span class="st">&#39;update_item&#39;</span> =&gt; <span class="st">&#39;Update Tag&#39;</span><span class="ot">,</span></span>
<span id="cb6-10"><a href="#cb6-10" aria-hidden="true"></a>            <span class="st">&#39;add_new_item&#39;</span> =&gt; <span class="st">&#39;Add New Tag&#39;</span><span class="ot">,</span></span>
<span id="cb6-11"><a href="#cb6-11" aria-hidden="true"></a>            <span class="st">&#39;new_item_name&#39;</span> =&gt; <span class="st">&#39;New Tag Name&#39;</span><span class="ot">,</span></span>
<span id="cb6-12"><a href="#cb6-12" aria-hidden="true"></a>            <span class="st">&#39;menu_name&#39;</span> =&gt; <span class="st">&#39;Tags&#39;</span><span class="ot">,</span></span>
<span id="cb6-13"><a href="#cb6-13" aria-hidden="true"></a>        <span class="ot">),</span></span>
<span id="cb6-14"><a href="#cb6-14" aria-hidden="true"></a>        <span class="st">&#39;hierarchical&#39;</span> =&gt; <span class="kw">false</span><span class="ot">,</span> <span class="co">// Like tags</span></span>
<span id="cb6-15"><a href="#cb6-15" aria-hidden="true"></a>        <span class="st">&#39;show_ui&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb6-16"><a href="#cb6-16" aria-hidden="true"></a>        <span class="st">&#39;show_admin_column&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb6-17"><a href="#cb6-17" aria-hidden="true"></a>        <span class="st">&#39;query_var&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb6-18"><a href="#cb6-18" aria-hidden="true"></a>        <span class="st">&#39;rewrite&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span><span class="st">&#39;slug&#39;</span> =&gt; <span class="st">&#39;product-tag&#39;</span><span class="ot">),</span></span>
<span id="cb6-19"><a href="#cb6-19" aria-hidden="true"></a>        <span class="st">&#39;show_in_rest&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb6-20"><a href="#cb6-20" aria-hidden="true"></a>    <span class="ot">));</span></span>
<span id="cb6-21"><a href="#cb6-21" aria-hidden="true"></a>}</span>
<span id="cb6-22"><a href="#cb6-22" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;init&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_register_product_tag&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<h2 id="template-files-for-custom-post-types">Template Files for Custom Post Types</h2>
<p>WordPress looks for these template files (in order):</p>
<p><strong>Single Post</strong>:</p>
<ol type="1">
<li>single-{post-type}.php (single-portfolio.php)</li>
<li>single.php</li>
<li>singular.php</li>
<li>index.php</li>
</ol>
<p><strong>Archive</strong>:</p>
<ol type="1">
<li>archive-{post-type}.php (archive-portfolio.php)</li>
<li>archive.php</li>
<li>index.php</li>
</ol>
<p><strong>Taxonomy</strong>:</p>
<ol type="1">
<li>taxonomy-{taxonomy}-{term}.php</li>
<li>taxonomy-{taxonomy}.php</li>
<li>taxonomy.php</li>
<li>archive.php</li>
</ol>
<p><strong>Single Portfolio Template</strong> (single-portfolio.php):</p>
<div class="sourceCode" id="cb7">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true"></a><span class="kw">&lt;?php</span> get_header<span class="ot">();</span> <span class="kw">?&gt;</span></span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true"></a></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true"></a>&lt;main id=<span class="st">&quot;primary&quot;</span> <span class="kw">class</span>=<span class="st">&quot;site-main&quot;</span>&gt;</span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true"></a>    &lt;<span class="ot">?</span>php</span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true"></a>    <span class="kw">while</span> <span class="ot">(</span>have_posts<span class="ot">())</span> <span class="ot">:</span></span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true"></a>        the_post<span class="ot">();</span></span>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true"></a>        <span class="kw">?&gt;</span></span>
<span id="cb7-8"><a href="#cb7-8" aria-hidden="true"></a>        &lt;article id=<span class="st">&quot;post-&lt;?php the_ID(); ?&gt;&quot;</span> &lt;<span class="ot">?</span>php post_class<span class="ot">();</span> <span class="kw">?&gt;</span>&gt;</span>
<span id="cb7-9"><a href="#cb7-9" aria-hidden="true"></a>            &lt;<span class="fu">header</span> <span class="kw">class</span>=<span class="st">&quot;entry-header&quot;</span>&gt;</span>
<span id="cb7-10"><a href="#cb7-10" aria-hidden="true"></a>                &lt;h1 <span class="kw">class</span>=<span class="st">&quot;entry-title&quot;</span>&gt;&lt;<span class="ot">?</span>php the_title<span class="ot">();</span> <span class="kw">?&gt;</span>&lt;/h1&gt;</span>
<span id="cb7-11"><a href="#cb7-11" aria-hidden="true"></a>            &lt;/<span class="fu">header</span>&gt;</span>
<span id="cb7-12"><a href="#cb7-12" aria-hidden="true"></a></span>
<span id="cb7-13"><a href="#cb7-13" aria-hidden="true"></a>            &lt;<span class="ot">?</span>php <span class="kw">if</span> <span class="ot">(</span>has_post_thumbnail<span class="ot">())</span> <span class="ot">:</span> <span class="kw">?&gt;</span></span>
<span id="cb7-14"><a href="#cb7-14" aria-hidden="true"></a>                &lt;div <span class="kw">class</span>=<span class="st">&quot;post-thumbnail&quot;</span>&gt;</span>
<span id="cb7-15"><a href="#cb7-15" aria-hidden="true"></a>                    &lt;<span class="ot">?</span>php the_post_thumbnail<span class="ot">(</span><span class="st">&#39;large&#39;</span><span class="ot">);</span> <span class="kw">?&gt;</span></span>
<span id="cb7-16"><a href="#cb7-16" aria-hidden="true"></a>                &lt;/div&gt;</span>
<span id="cb7-17"><a href="#cb7-17" aria-hidden="true"></a>            &lt;<span class="ot">?</span>php <span class="kw">endif</span><span class="ot">;</span> <span class="kw">?&gt;</span></span>
<span id="cb7-18"><a href="#cb7-18" aria-hidden="true"></a></span>
<span id="cb7-19"><a href="#cb7-19" aria-hidden="true"></a>            &lt;div <span class="kw">class</span>=<span class="st">&quot;entry-content&quot;</span>&gt;</span>
<span id="cb7-20"><a href="#cb7-20" aria-hidden="true"></a>                &lt;<span class="ot">?</span>php the_content<span class="ot">();</span> <span class="kw">?&gt;</span></span>
<span id="cb7-21"><a href="#cb7-21" aria-hidden="true"></a>            &lt;/div&gt;</span>
<span id="cb7-22"><a href="#cb7-22" aria-hidden="true"></a></span>
<span id="cb7-23"><a href="#cb7-23" aria-hidden="true"></a>            &lt;<span class="ot">?</span>php</span>
<span id="cb7-24"><a href="#cb7-24" aria-hidden="true"></a>            <span class="co">// Display custom taxonomy terms</span></span>
<span id="cb7-25"><a href="#cb7-25" aria-hidden="true"></a>            <span class="kw">$categories</span> = get_the_terms<span class="ot">(</span>get_the_ID<span class="ot">(),</span> <span class="st">&#39;portfolio_category&#39;</span><span class="ot">);</span></span>
<span id="cb7-26"><a href="#cb7-26" aria-hidden="true"></a>            <span class="kw">if</span> <span class="ot">(</span><span class="kw">$categories</span> &amp;&amp; !is_wp_error<span class="ot">(</span><span class="kw">$categories</span><span class="ot">))</span> <span class="ot">:</span></span>
<span id="cb7-27"><a href="#cb7-27" aria-hidden="true"></a>                <span class="kw">?&gt;</span></span>
<span id="cb7-28"><a href="#cb7-28" aria-hidden="true"></a>                &lt;div <span class="kw">class</span>=<span class="st">&quot;portfolio-categories&quot;</span>&gt;</span>
<span id="cb7-29"><a href="#cb7-29" aria-hidden="true"></a>                    &lt;strong&gt;Categories:&lt;/strong&gt;</span>
<span id="cb7-30"><a href="#cb7-30" aria-hidden="true"></a>                    &lt;<span class="ot">?</span>php</span>
<span id="cb7-31"><a href="#cb7-31" aria-hidden="true"></a>                    <span class="kw">foreach</span> <span class="ot">(</span><span class="kw">$categories</span> <span class="kw">as</span> <span class="kw">$category</span><span class="ot">)</span> {</span>
<span id="cb7-32"><a href="#cb7-32" aria-hidden="true"></a>                        <span class="kw">echo</span> <span class="st">&#39;&lt;span&gt;&#39;</span> . esc_html<span class="ot">(</span><span class="kw">$category</span>-&gt;name<span class="ot">)</span> . <span class="st">&#39;&lt;/span&gt; &#39;</span><span class="ot">;</span></span>
<span id="cb7-33"><a href="#cb7-33" aria-hidden="true"></a>                    }</span>
<span id="cb7-34"><a href="#cb7-34" aria-hidden="true"></a>                    <span class="kw">?&gt;</span></span>
<span id="cb7-35"><a href="#cb7-35" aria-hidden="true"></a>                &lt;/div&gt;</span>
<span id="cb7-36"><a href="#cb7-36" aria-hidden="true"></a>            &lt;<span class="ot">?</span>php <span class="kw">endif</span><span class="ot">;</span> <span class="kw">?&gt;</span></span>
<span id="cb7-37"><a href="#cb7-37" aria-hidden="true"></a>        &lt;/article&gt;</span>
<span id="cb7-38"><a href="#cb7-38" aria-hidden="true"></a>    &lt;<span class="ot">?</span>php <span class="kw">endwhile</span><span class="ot">;</span> <span class="kw">?&gt;</span></span>
<span id="cb7-39"><a href="#cb7-39" aria-hidden="true"></a>&lt;/main&gt;</span>
<span id="cb7-40"><a href="#cb7-40" aria-hidden="true"></a></span>
<span id="cb7-41"><a href="#cb7-41" aria-hidden="true"></a>&lt;<span class="ot">?</span>php get_footer<span class="ot">();</span> <span class="kw">?&gt;</span></span></code></pre>
</div>
<p><strong>Portfolio Archive Template</strong> (archive-portfolio.php):</p>
<div class="sourceCode" id="cb8">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true"></a><span class="kw">&lt;?php</span> get_header<span class="ot">();</span> <span class="kw">?&gt;</span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true"></a></span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true"></a>&lt;main id=<span class="st">&quot;primary&quot;</span> <span class="kw">class</span>=<span class="st">&quot;site-main&quot;</span>&gt;</span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true"></a>    &lt;<span class="fu">header</span> <span class="kw">class</span>=<span class="st">&quot;page-header&quot;</span>&gt;</span>
<span id="cb8-5"><a href="#cb8-5" aria-hidden="true"></a>        &lt;h1 <span class="kw">class</span>=<span class="st">&quot;page-title&quot;</span>&gt;Portfolio&lt;/h1&gt;</span>
<span id="cb8-6"><a href="#cb8-6" aria-hidden="true"></a>    &lt;/<span class="fu">header</span>&gt;</span>
<span id="cb8-7"><a href="#cb8-7" aria-hidden="true"></a></span>
<span id="cb8-8"><a href="#cb8-8" aria-hidden="true"></a>    &lt;<span class="ot">?</span>php <span class="kw">if</span> <span class="ot">(</span>have_posts<span class="ot">())</span> <span class="ot">:</span> <span class="kw">?&gt;</span></span>
<span id="cb8-9"><a href="#cb8-9" aria-hidden="true"></a>        &lt;div <span class="kw">class</span>=<span class="st">&quot;portfolio-grid&quot;</span>&gt;</span>
<span id="cb8-10"><a href="#cb8-10" aria-hidden="true"></a>            &lt;<span class="ot">?</span>php</span>
<span id="cb8-11"><a href="#cb8-11" aria-hidden="true"></a>            <span class="kw">while</span> <span class="ot">(</span>have_posts<span class="ot">())</span> <span class="ot">:</span></span>
<span id="cb8-12"><a href="#cb8-12" aria-hidden="true"></a>                the_post<span class="ot">();</span></span>
<span id="cb8-13"><a href="#cb8-13" aria-hidden="true"></a>                <span class="kw">?&gt;</span></span>
<span id="cb8-14"><a href="#cb8-14" aria-hidden="true"></a>                &lt;article id=<span class="st">&quot;post-&lt;?php the_ID(); ?&gt;&quot;</span> &lt;<span class="ot">?</span>php post_class<span class="ot">(</span><span class="st">&#39;portfolio-item&#39;</span><span class="ot">);</span> <span class="kw">?&gt;</span>&gt;</span>
<span id="cb8-15"><a href="#cb8-15" aria-hidden="true"></a>                    &lt;<span class="ot">?</span>php <span class="kw">if</span> <span class="ot">(</span>has_post_thumbnail<span class="ot">())</span> <span class="ot">:</span> <span class="kw">?&gt;</span></span>
<span id="cb8-16"><a href="#cb8-16" aria-hidden="true"></a>                        &lt;a href=<span class="st">&quot;&lt;?php the_permalink(); ?&gt;&quot;</span>&gt;</span>
<span id="cb8-17"><a href="#cb8-17" aria-hidden="true"></a>                            &lt;<span class="ot">?</span>php the_post_thumbnail<span class="ot">(</span><span class="st">&#39;medium&#39;</span><span class="ot">);</span> <span class="kw">?&gt;</span></span>
<span id="cb8-18"><a href="#cb8-18" aria-hidden="true"></a>                        &lt;/a&gt;</span>
<span id="cb8-19"><a href="#cb8-19" aria-hidden="true"></a>                    &lt;<span class="ot">?</span>php <span class="kw">endif</span><span class="ot">;</span> <span class="kw">?&gt;</span></span>
<span id="cb8-20"><a href="#cb8-20" aria-hidden="true"></a></span>
<span id="cb8-21"><a href="#cb8-21" aria-hidden="true"></a>                    &lt;h2 <span class="kw">class</span>=<span class="st">&quot;entry-title&quot;</span>&gt;</span>
<span id="cb8-22"><a href="#cb8-22" aria-hidden="true"></a>                        &lt;a href=<span class="st">&quot;&lt;?php the_permalink(); ?&gt;&quot;</span>&gt;&lt;<span class="ot">?</span>php the_title<span class="ot">();</span> <span class="kw">?&gt;</span>&lt;/a&gt;</span>
<span id="cb8-23"><a href="#cb8-23" aria-hidden="true"></a>                    &lt;/h2&gt;</span>
<span id="cb8-24"><a href="#cb8-24" aria-hidden="true"></a></span>
<span id="cb8-25"><a href="#cb8-25" aria-hidden="true"></a>                    &lt;div <span class="kw">class</span>=<span class="st">&quot;entry-excerpt&quot;</span>&gt;</span>
<span id="cb8-26"><a href="#cb8-26" aria-hidden="true"></a>                        &lt;<span class="ot">?</span>php the_excerpt<span class="ot">();</span> <span class="kw">?&gt;</span></span>
<span id="cb8-27"><a href="#cb8-27" aria-hidden="true"></a>                    &lt;/div&gt;</span>
<span id="cb8-28"><a href="#cb8-28" aria-hidden="true"></a>                &lt;/article&gt;</span>
<span id="cb8-29"><a href="#cb8-29" aria-hidden="true"></a>            &lt;<span class="ot">?</span>php <span class="kw">endwhile</span><span class="ot">;</span> <span class="kw">?&gt;</span></span>
<span id="cb8-30"><a href="#cb8-30" aria-hidden="true"></a>        &lt;/div&gt;</span>
<span id="cb8-31"><a href="#cb8-31" aria-hidden="true"></a></span>
<span id="cb8-32"><a href="#cb8-32" aria-hidden="true"></a>        &lt;<span class="ot">?</span>php the_posts_pagination<span class="ot">();</span> <span class="kw">?&gt;</span></span>
<span id="cb8-33"><a href="#cb8-33" aria-hidden="true"></a></span>
<span id="cb8-34"><a href="#cb8-34" aria-hidden="true"></a>    &lt;<span class="ot">?</span>php <span class="kw">else</span> <span class="ot">:</span> <span class="kw">?&gt;</span></span>
<span id="cb8-35"><a href="#cb8-35" aria-hidden="true"></a>        &lt;p&gt;No portfolio items found.&lt;/p&gt;</span>
<span id="cb8-36"><a href="#cb8-36" aria-hidden="true"></a>    &lt;<span class="ot">?</span>php <span class="kw">endif</span><span class="ot">;</span> <span class="kw">?&gt;</span></span>
<span id="cb8-37"><a href="#cb8-37" aria-hidden="true"></a>&lt;/main&gt;</span>
<span id="cb8-38"><a href="#cb8-38" aria-hidden="true"></a></span>
<span id="cb8-39"><a href="#cb8-39" aria-hidden="true"></a>&lt;<span class="ot">?</span>php get_footer<span class="ot">();</span> <span class="kw">?&gt;</span></span></code></pre>
</div>
<h2 id="querying-custom-post-types">Querying Custom Post Types</h2>
<p><strong>WP_Query Examples</strong>:</p>
<div class="sourceCode" id="cb9">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true"></a><span class="co">// Get all portfolio items</span></span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true"></a><span class="kw">$portfolio</span> = <span class="kw">new</span> WP_Query<span class="ot">(</span><span class="kw">array</span><span class="ot">(</span></span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true"></a>    <span class="st">&#39;post_type&#39;</span> =&gt; <span class="st">&#39;portfolio&#39;</span><span class="ot">,</span></span>
<span id="cb9-4"><a href="#cb9-4" aria-hidden="true"></a>    <span class="st">&#39;posts_per_page&#39;</span> =&gt; <span class="dv">10</span><span class="ot">,</span></span>
<span id="cb9-5"><a href="#cb9-5" aria-hidden="true"></a><span class="ot">));</span></span>
<span id="cb9-6"><a href="#cb9-6" aria-hidden="true"></a></span>
<span id="cb9-7"><a href="#cb9-7" aria-hidden="true"></a><span class="co">// Get portfolio by category</span></span>
<span id="cb9-8"><a href="#cb9-8" aria-hidden="true"></a><span class="kw">$featured_portfolio</span> = <span class="kw">new</span> WP_Query<span class="ot">(</span><span class="kw">array</span><span class="ot">(</span></span>
<span id="cb9-9"><a href="#cb9-9" aria-hidden="true"></a>    <span class="st">&#39;post_type&#39;</span> =&gt; <span class="st">&#39;portfolio&#39;</span><span class="ot">,</span></span>
<span id="cb9-10"><a href="#cb9-10" aria-hidden="true"></a>    <span class="st">&#39;posts_per_page&#39;</span> =&gt; <span class="dv">6</span><span class="ot">,</span></span>
<span id="cb9-11"><a href="#cb9-11" aria-hidden="true"></a>    <span class="st">&#39;tax_query&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb9-12"><a href="#cb9-12" aria-hidden="true"></a>        <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb9-13"><a href="#cb9-13" aria-hidden="true"></a>            <span class="st">&#39;taxonomy&#39;</span> =&gt; <span class="st">&#39;portfolio_category&#39;</span><span class="ot">,</span></span>
<span id="cb9-14"><a href="#cb9-14" aria-hidden="true"></a>            <span class="st">&#39;field&#39;</span> =&gt; <span class="st">&#39;slug&#39;</span><span class="ot">,</span></span>
<span id="cb9-15"><a href="#cb9-15" aria-hidden="true"></a>            <span class="st">&#39;terms&#39;</span> =&gt; <span class="st">&#39;featured&#39;</span><span class="ot">,</span></span>
<span id="cb9-16"><a href="#cb9-16" aria-hidden="true"></a>        <span class="ot">),</span></span>
<span id="cb9-17"><a href="#cb9-17" aria-hidden="true"></a>    <span class="ot">),</span></span>
<span id="cb9-18"><a href="#cb9-18" aria-hidden="true"></a><span class="ot">));</span></span>
<span id="cb9-19"><a href="#cb9-19" aria-hidden="true"></a></span>
<span id="cb9-20"><a href="#cb9-20" aria-hidden="true"></a><span class="co">// Multiple post types</span></span>
<span id="cb9-21"><a href="#cb9-21" aria-hidden="true"></a><span class="kw">$mixed</span> = <span class="kw">new</span> WP_Query<span class="ot">(</span><span class="kw">array</span><span class="ot">(</span></span>
<span id="cb9-22"><a href="#cb9-22" aria-hidden="true"></a>    <span class="st">&#39;post_type&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span><span class="st">&#39;post&#39;</span><span class="ot">,</span> <span class="st">&#39;portfolio&#39;</span><span class="ot">,</span> <span class="st">&#39;product&#39;</span><span class="ot">),</span></span>
<span id="cb9-23"><a href="#cb9-23" aria-hidden="true"></a>    <span class="st">&#39;posts_per_page&#39;</span> =&gt; <span class="dv">10</span><span class="ot">,</span></span>
<span id="cb9-24"><a href="#cb9-24" aria-hidden="true"></a><span class="ot">));</span></span>
<span id="cb9-25"><a href="#cb9-25" aria-hidden="true"></a></span>
<span id="cb9-26"><a href="#cb9-26" aria-hidden="true"></a><span class="co">// Custom field query</span></span>
<span id="cb9-27"><a href="#cb9-27" aria-hidden="true"></a><span class="kw">$expensive_products</span> = <span class="kw">new</span> WP_Query<span class="ot">(</span><span class="kw">array</span><span class="ot">(</span></span>
<span id="cb9-28"><a href="#cb9-28" aria-hidden="true"></a>    <span class="st">&#39;post_type&#39;</span> =&gt; <span class="st">&#39;product&#39;</span><span class="ot">,</span></span>
<span id="cb9-29"><a href="#cb9-29" aria-hidden="true"></a>    <span class="st">&#39;meta_query&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb9-30"><a href="#cb9-30" aria-hidden="true"></a>        <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb9-31"><a href="#cb9-31" aria-hidden="true"></a>            <span class="st">&#39;key&#39;</span> =&gt; <span class="st">&#39;price&#39;</span><span class="ot">,</span></span>
<span id="cb9-32"><a href="#cb9-32" aria-hidden="true"></a>            <span class="st">&#39;value&#39;</span> =&gt; <span class="dv">100</span><span class="ot">,</span></span>
<span id="cb9-33"><a href="#cb9-33" aria-hidden="true"></a>            <span class="st">&#39;compare&#39;</span> =&gt; <span class="st">&#39;&gt;&#39;</span><span class="ot">,</span></span>
<span id="cb9-34"><a href="#cb9-34" aria-hidden="true"></a>            <span class="st">&#39;type&#39;</span> =&gt; <span class="st">&#39;NUMERIC&#39;</span><span class="ot">,</span></span>
<span id="cb9-35"><a href="#cb9-35" aria-hidden="true"></a>        <span class="ot">),</span></span>
<span id="cb9-36"><a href="#cb9-36" aria-hidden="true"></a>    <span class="ot">),</span></span>
<span id="cb9-37"><a href="#cb9-37" aria-hidden="true"></a><span class="ot">));</span></span></code></pre>
</div>
<h2 id="adding-custom-columns-to-admin-list">Adding Custom Columns to Admin List</h2>
<div class="sourceCode" id="cb10">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true"></a><span class="co">// Add custom columns</span></span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true"></a><span class="kw">function</span> dprt_portfolio_columns<span class="ot">(</span><span class="kw">$columns</span><span class="ot">)</span> {</span>
<span id="cb10-3"><a href="#cb10-3" aria-hidden="true"></a>    <span class="kw">$new_columns</span> = <span class="kw">array</span><span class="ot">();</span></span>
<span id="cb10-4"><a href="#cb10-4" aria-hidden="true"></a>    <span class="kw">$new_columns</span><span class="ot">[</span><span class="st">&#39;cb&#39;</span><span class="ot">]</span> = <span class="kw">$columns</span><span class="ot">[</span><span class="st">&#39;cb&#39;</span><span class="ot">];</span></span>
<span id="cb10-5"><a href="#cb10-5" aria-hidden="true"></a>    <span class="kw">$new_columns</span><span class="ot">[</span><span class="st">&#39;thumbnail&#39;</span><span class="ot">]</span> = <span class="st">&#39;Image&#39;</span><span class="ot">;</span></span>
<span id="cb10-6"><a href="#cb10-6" aria-hidden="true"></a>    <span class="kw">$new_columns</span><span class="ot">[</span><span class="st">&#39;title&#39;</span><span class="ot">]</span> = <span class="kw">$columns</span><span class="ot">[</span><span class="st">&#39;title&#39;</span><span class="ot">];</span></span>
<span id="cb10-7"><a href="#cb10-7" aria-hidden="true"></a>    <span class="kw">$new_columns</span><span class="ot">[</span><span class="st">&#39;portfolio_category&#39;</span><span class="ot">]</span> = <span class="st">&#39;Category&#39;</span><span class="ot">;</span></span>
<span id="cb10-8"><a href="#cb10-8" aria-hidden="true"></a>    <span class="kw">$new_columns</span><span class="ot">[</span><span class="st">&#39;date&#39;</span><span class="ot">]</span> = <span class="kw">$columns</span><span class="ot">[</span><span class="st">&#39;date&#39;</span><span class="ot">];</span></span>
<span id="cb10-9"><a href="#cb10-9" aria-hidden="true"></a>    <span class="kw">return</span> <span class="kw">$new_columns</span><span class="ot">;</span></span>
<span id="cb10-10"><a href="#cb10-10" aria-hidden="true"></a>}</span>
<span id="cb10-11"><a href="#cb10-11" aria-hidden="true"></a>add_filter<span class="ot">(</span><span class="st">&#39;manage_portfolio_posts_columns&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_portfolio_columns&#39;</span><span class="ot">);</span></span>
<span id="cb10-12"><a href="#cb10-12" aria-hidden="true"></a></span>
<span id="cb10-13"><a href="#cb10-13" aria-hidden="true"></a><span class="co">// Populate custom columns</span></span>
<span id="cb10-14"><a href="#cb10-14" aria-hidden="true"></a><span class="kw">function</span> dprt_portfolio_column_content<span class="ot">(</span><span class="kw">$column</span><span class="ot">,</span> <span class="kw">$post_id</span><span class="ot">)</span> {</span>
<span id="cb10-15"><a href="#cb10-15" aria-hidden="true"></a>    <span class="kw">switch</span> <span class="ot">(</span><span class="kw">$column</span><span class="ot">)</span> {</span>
<span id="cb10-16"><a href="#cb10-16" aria-hidden="true"></a>        <span class="kw">case </span><span class="st">&#39;thumbnail&#39;</span><span class="ot">:</span></span>
<span id="cb10-17"><a href="#cb10-17" aria-hidden="true"></a>            <span class="kw">echo</span> get_the_post_thumbnail<span class="ot">(</span><span class="kw">$post_id</span><span class="ot">,</span> <span class="kw">array</span><span class="ot">(</span><span class="dv">60</span><span class="ot">,</span> <span class="dv">60</span><span class="ot">));</span></span>
<span id="cb10-18"><a href="#cb10-18" aria-hidden="true"></a>            <span class="kw">break</span><span class="ot">;</span></span>
<span id="cb10-19"><a href="#cb10-19" aria-hidden="true"></a></span>
<span id="cb10-20"><a href="#cb10-20" aria-hidden="true"></a>        <span class="kw">case </span><span class="st">&#39;portfolio_category&#39;</span><span class="ot">:</span></span>
<span id="cb10-21"><a href="#cb10-21" aria-hidden="true"></a>            <span class="kw">$terms</span> = get_the_terms<span class="ot">(</span><span class="kw">$post_id</span><span class="ot">,</span> <span class="st">&#39;portfolio_category&#39;</span><span class="ot">);</span></span>
<span id="cb10-22"><a href="#cb10-22" aria-hidden="true"></a>            <span class="kw">if</span> <span class="ot">(</span><span class="kw">$terms</span> &amp;&amp; !is_wp_error<span class="ot">(</span><span class="kw">$terms</span><span class="ot">))</span> {</span>
<span id="cb10-23"><a href="#cb10-23" aria-hidden="true"></a>                <span class="kw">$term_names</span> = wp_list_pluck<span class="ot">(</span><span class="kw">$terms</span><span class="ot">,</span> <span class="st">&#39;name&#39;</span><span class="ot">);</span></span>
<span id="cb10-24"><a href="#cb10-24" aria-hidden="true"></a>                <span class="kw">echo</span> <span class="fu">implode</span><span class="ot">(</span><span class="st">&#39;, &#39;</span><span class="ot">,</span> <span class="kw">$term_names</span><span class="ot">);</span></span>
<span id="cb10-25"><a href="#cb10-25" aria-hidden="true"></a>            } <span class="kw">else</span> {</span>
<span id="cb10-26"><a href="#cb10-26" aria-hidden="true"></a>                <span class="kw">echo</span> <span class="st">&#39;—&#39;</span><span class="ot">;</span></span>
<span id="cb10-27"><a href="#cb10-27" aria-hidden="true"></a>            }</span>
<span id="cb10-28"><a href="#cb10-28" aria-hidden="true"></a>            <span class="kw">break</span><span class="ot">;</span></span>
<span id="cb10-29"><a href="#cb10-29" aria-hidden="true"></a>    }</span>
<span id="cb10-30"><a href="#cb10-30" aria-hidden="true"></a>}</span>
<span id="cb10-31"><a href="#cb10-31" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;manage_portfolio_posts_custom_column&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_portfolio_column_content&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb10-32"><a href="#cb10-32" aria-hidden="true"></a></span>
<span id="cb10-33"><a href="#cb10-33" aria-hidden="true"></a><span class="co">// Make columns sortable</span></span>
<span id="cb10-34"><a href="#cb10-34" aria-hidden="true"></a><span class="kw">function</span> dprt_sortable_columns<span class="ot">(</span><span class="kw">$columns</span><span class="ot">)</span> {</span>
<span id="cb10-35"><a href="#cb10-35" aria-hidden="true"></a>    <span class="kw">$columns</span><span class="ot">[</span><span class="st">&#39;portfolio_category&#39;</span><span class="ot">]</span> = <span class="st">&#39;portfolio_category&#39;</span><span class="ot">;</span></span>
<span id="cb10-36"><a href="#cb10-36" aria-hidden="true"></a>    <span class="kw">return</span> <span class="kw">$columns</span><span class="ot">;</span></span>
<span id="cb10-37"><a href="#cb10-37" aria-hidden="true"></a>}</span>
<span id="cb10-38"><a href="#cb10-38" aria-hidden="true"></a>add_filter<span class="ot">(</span><span class="st">&#39;manage_edit-portfolio_sortable_columns&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_sortable_columns&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<h2 id="custom-permalink-structure">Custom Permalink Structure</h2>
<div class="sourceCode" id="cb11">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true"></a><span class="kw">function</span> dprt_custom_permalinks<span class="ot">(</span><span class="kw">$post_link</span><span class="ot">,</span> <span class="kw">$post</span><span class="ot">)</span> {</span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span><span class="kw">$post</span>-&gt;post_type === <span class="st">&#39;portfolio&#39;</span><span class="ot">)</span> {</span>
<span id="cb11-3"><a href="#cb11-3" aria-hidden="true"></a>        <span class="kw">$terms</span> = get_the_terms<span class="ot">(</span><span class="kw">$post</span>-&gt;<span class="kw">ID</span><span class="ot">,</span> <span class="st">&#39;portfolio_category&#39;</span><span class="ot">);</span></span>
<span id="cb11-4"><a href="#cb11-4" aria-hidden="true"></a>        <span class="kw">if</span> <span class="ot">(</span><span class="kw">$terms</span> &amp;&amp; !is_wp_error<span class="ot">(</span><span class="kw">$terms</span><span class="ot">))</span> {</span>
<span id="cb11-5"><a href="#cb11-5" aria-hidden="true"></a>            <span class="kw">$category</span> = <span class="fu">array_shift</span><span class="ot">(</span><span class="kw">$terms</span><span class="ot">);</span></span>
<span id="cb11-6"><a href="#cb11-6" aria-hidden="true"></a>            <span class="kw">return</span> <span class="fu">str_replace</span><span class="ot">(</span><span class="st">&#39;%portfolio_category%&#39;</span><span class="ot">,</span> <span class="kw">$category</span>-&gt;slug<span class="ot">,</span> <span class="kw">$post_link</span><span class="ot">);</span></span>
<span id="cb11-7"><a href="#cb11-7" aria-hidden="true"></a>        }</span>
<span id="cb11-8"><a href="#cb11-8" aria-hidden="true"></a>    }</span>
<span id="cb11-9"><a href="#cb11-9" aria-hidden="true"></a>    <span class="kw">return</span> <span class="kw">$post_link</span><span class="ot">;</span></span>
<span id="cb11-10"><a href="#cb11-10" aria-hidden="true"></a>}</span>
<span id="cb11-11"><a href="#cb11-11" aria-hidden="true"></a>add_filter<span class="ot">(</span><span class="st">&#39;post_type_link&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_custom_permalinks&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb11-12"><a href="#cb11-12" aria-hidden="true"></a></span>
<span id="cb11-13"><a href="#cb11-13" aria-hidden="true"></a><span class="co">// Register rewrite with taxonomy</span></span>
<span id="cb11-14"><a href="#cb11-14" aria-hidden="true"></a>register_post_type<span class="ot">(</span><span class="st">&#39;portfolio&#39;</span><span class="ot">,</span> <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb11-15"><a href="#cb11-15" aria-hidden="true"></a>    <span class="st">&#39;rewrite&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb11-16"><a href="#cb11-16" aria-hidden="true"></a>        <span class="st">&#39;slug&#39;</span> =&gt; <span class="st">&#39;portfolio/%portfolio_category%&#39;</span><span class="ot">,</span></span>
<span id="cb11-17"><a href="#cb11-17" aria-hidden="true"></a>        <span class="st">&#39;with_front&#39;</span> =&gt; <span class="kw">false</span></span>
<span id="cb11-18"><a href="#cb11-18" aria-hidden="true"></a>    <span class="ot">),</span></span>
<span id="cb11-19"><a href="#cb11-19" aria-hidden="true"></a>    <span class="co">// ... other args</span></span>
<span id="cb11-20"><a href="#cb11-20" aria-hidden="true"></a><span class="ot">));</span></span></code></pre>
</div>
<h2 id="best-practices">Best Practices</h2>
<p><strong>Use Descriptive Slugs</strong>: ‘portfolio’ better than ‘pf’.</p>
<p><strong>Translation Ready</strong>: Use _x() and __() for labels.</p>
<p><strong>Namespace Functions</strong>: Prefix functions to avoid conflicts.</p>
<p><strong>Flush Permalinks</strong>: After registration changes, visit Settings → Permalinks.</p>
<p><strong>show_in_rest</strong>: Always true for Gutenberg support.</p>
<p><strong>Separate Files</strong>: Keep CPT registration in dedicated file (inc/post-types.php).</p>
<p><strong>Documentation</strong>: Comment complex registrations explaining purpose.</p>
<h2 id="conclusion">Conclusion</h2>
<p>WordPress custom post types extend content structure beyond posts and pages without plugins. Register CPTs using register_post_type(), create custom taxonomies with register_taxonomy(), build template files following WordPress hierarchy, and query content with WP_Query. Manual CPT registration provides complete control, better performance, and deeper platform understanding compared to plugin-based approaches.</p>
<h2 id="external-links">External Links</h2>
<ol type="1">
<li><a href="https://developer.wordpress.org/reference/functions/register_post_type/">WordPress register_post_type() Reference</a></li>
<li><a href="https://developer.wordpress.org/reference/functions/register_taxonomy/">WordPress register_taxonomy() Reference</a></li>
<li><a href="https://developer.wordpress.org/themes/basics/template-hierarchy/">Template Hierarchy</a></li>
<li><a href="https://generatewp.com/post-type/">GenerateWP Post Type Generator</a></li>
<li><a href="https://developer.wordpress.org/plugins/post-types/">WordPress CPT Documentation</a></li>
</ol>
<h2 id="call-to-action">Call to Action</h2>
<p>Custom post types need protection. <a href="https://backupcopilotplugin.com/">Backup Copilot Pro</a> safeguards your WordPress custom configurations and content. Protect your CPT implementations—start your free 30-day trial today!</p>
<p>The post <a href="https://developryplugins.com/how-to-add-custom-post-types-to-wordpress-without-plugins/">How to Add Custom Post Types to WordPress Without Plugins</a> appeared first on <a href="https://developryplugins.com">Developry Plugins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
