<?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>capabilities Archives - Developry Plugins</title>
	<atom:link href="https://developryplugins.com/tag/capabilities/feed/" rel="self" type="application/rss+xml" />
	<link>https://developryplugins.com/tag/capabilities/</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>capabilities Archives - Developry Plugins</title>
	<link>https://developryplugins.com/tag/capabilities/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How to Add Custom User Roles and Capabilities in WordPress</title>
		<link>https://developryplugins.com/how-to-add-custom-user-roles-and-capabilities-in-wordpress/</link>
		
		<dc:creator><![CDATA[Krasen Slavov]]></dc:creator>
		<pubDate>Sat, 15 Aug 2026 09:00:00 +0000</pubDate>
				<category><![CDATA[WordPress Tips Tricks & Hacks]]></category>
		<category><![CDATA[access control]]></category>
		<category><![CDATA[capabilities]]></category>
		<category><![CDATA[permissions]]></category>
		<category><![CDATA[user management]]></category>
		<category><![CDATA[user roles]]></category>
		<guid isPermaLink="false">https://developryplugins.com/?p=189</guid>

					<description><![CDATA[<p>WordPress user roles and capabilities system controls who accesses what functionality. Beyond default roles (Administrator, Editor, Author), custom roles enable precise permission management for clients, contributors, and specialized users. This...</p>
<p>The post <a href="https://developryplugins.com/how-to-add-custom-user-roles-and-capabilities-in-wordpress/">How to Add Custom User Roles and Capabilities in WordPress</a> appeared first on <a href="https://developryplugins.com">Developry Plugins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><!-- @format --></p>
<p>WordPress user roles and capabilities system controls who accesses what functionality. Beyond default roles (Administrator, Editor, Author), custom roles enable precise permission management for clients, contributors, and specialized users. This comprehensive guide teaches role creation, capability assignment, conditional content display, and advanced permission management for granular WordPress access control.</p>
<h2 id="understanding-roles-vs-capabilities">Understanding Roles vs Capabilities</h2>
<p><strong>Roles</strong>: Predefined permission sets assigned to users.</p>
<p><strong>Capabilities</strong>: Specific permissions (edit_posts, publish_pages, manage_options).</p>
<p><strong>Relationship</strong>: Roles contain multiple capabilities. Users assigned roles inherit those capabilities.</p>
<p>Example: Editor role includes edit_posts, publish_posts, edit_pages, but excludes manage_options.</p>
<h2 id="default-wordpress-roles">Default WordPress Roles</h2>
<p><strong>Super Admin</strong> (Multisite only):</p>
<ul>
<li>Network-level control</li>
<li>All capabilities across all sites</li>
</ul>
<p><strong>Administrator</strong>:</p>
<ul>
<li>Complete site control</li>
<li>User management</li>
<li>Plugin/theme installation</li>
<li>Settings modification</li>
</ul>
<p><strong>Editor</strong>:</p>
<ul>
<li>Manage and publish all posts</li>
<li>Moderate comments</li>
<li>Manage categories/tags</li>
</ul>
<p><strong>Author</strong>:</p>
<ul>
<li>Write and publish own posts</li>
<li>Upload files</li>
<li>Cannot edit others’ posts</li>
</ul>
<p><strong>Contributor</strong>:</p>
<ul>
<li>Write posts (cannot publish)</li>
<li>Edit own unpublished posts</li>
<li>No media upload</li>
</ul>
<p><strong>Subscriber</strong>:</p>
<ul>
<li>Read content</li>
<li>Manage own profile</li>
<li>No posting capabilities</li>
</ul>
<h2 id="creating-custom-user-roles">Creating Custom User Roles</h2>
<p><strong>Basic Role Creation</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_add_custom_role<span class="ot">()</span> {</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true"></a>    add_role<span class="ot">(</span></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true"></a>        <span class="st">&#39;client&#39;</span><span class="ot">,</span>                    <span class="co">// Role slug</span></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true"></a>        <span class="st">&#39;Client&#39;</span><span class="ot">,</span>                    <span class="co">// Display name</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true"></a>        <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true"></a>            <span class="st">&#39;read&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span>          <span class="co">// Capability</span></span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true"></a>            <span class="st">&#39;edit_posts&#39;</span> =&gt; <span class="kw">false</span><span class="ot">,</span></span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true"></a>            <span class="st">&#39;delete_posts&#39;</span> =&gt; <span class="kw">false</span><span class="ot">,</span></span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true"></a>        <span class="ot">)</span></span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true"></a>    <span class="ot">);</span></span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true"></a>}</span>
<span id="cb1-12"><a href="#cb1-12" 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_add_custom_role&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<p><strong>Run once</strong>: Use plugin activation hook or run manually then remove code.</p>
<p><strong>Plugin Activation Hook</strong>:</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>register_activation_hook<span class="ot">(</span><span class="kw">__FILE__</span><span class="ot">,</span> <span class="st">&#39;dprt_add_custom_role&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<h2 id="custom-role-with-specific-capabilities">Custom Role with Specific Capabilities</h2>
<p><strong>Content Manager Role</strong>:</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">function</span> dprt_add_content_manager_role<span class="ot">()</span> {</span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true"></a>    add_role<span class="ot">(</span><span class="st">&#39;content_manager&#39;</span><span class="ot">,</span> <span class="st">&#39;Content Manager&#39;</span><span class="ot">,</span> <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true"></a>        <span class="co">// Basic capabilities</span></span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true"></a>        <span class="st">&#39;read&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true"></a></span>
<span id="cb3-6"><a href="#cb3-6" aria-hidden="true"></a>        <span class="co">// Post capabilities</span></span>
<span id="cb3-7"><a href="#cb3-7" aria-hidden="true"></a>        <span class="st">&#39;edit_posts&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb3-8"><a href="#cb3-8" aria-hidden="true"></a>        <span class="st">&#39;edit_published_posts&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb3-9"><a href="#cb3-9" aria-hidden="true"></a>        <span class="st">&#39;publish_posts&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb3-10"><a href="#cb3-10" aria-hidden="true"></a>        <span class="st">&#39;delete_posts&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb3-11"><a href="#cb3-11" aria-hidden="true"></a>        <span class="st">&#39;delete_published_posts&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb3-12"><a href="#cb3-12" aria-hidden="true"></a></span>
<span id="cb3-13"><a href="#cb3-13" aria-hidden="true"></a>        <span class="co">// Page capabilities</span></span>
<span id="cb3-14"><a href="#cb3-14" aria-hidden="true"></a>        <span class="st">&#39;edit_pages&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb3-15"><a href="#cb3-15" aria-hidden="true"></a>        <span class="st">&#39;edit_published_pages&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb3-16"><a href="#cb3-16" aria-hidden="true"></a>        <span class="st">&#39;publish_pages&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb3-17"><a href="#cb3-17" aria-hidden="true"></a>        <span class="st">&#39;delete_pages&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb3-18"><a href="#cb3-18" aria-hidden="true"></a></span>
<span id="cb3-19"><a href="#cb3-19" aria-hidden="true"></a>        <span class="co">// Media</span></span>
<span id="cb3-20"><a href="#cb3-20" aria-hidden="true"></a>        <span class="st">&#39;upload_files&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb3-21"><a href="#cb3-21" aria-hidden="true"></a></span>
<span id="cb3-22"><a href="#cb3-22" aria-hidden="true"></a>        <span class="co">// Comments</span></span>
<span id="cb3-23"><a href="#cb3-23" aria-hidden="true"></a>        <span class="st">&#39;moderate_comments&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb3-24"><a href="#cb3-24" aria-hidden="true"></a></span>
<span id="cb3-25"><a href="#cb3-25" aria-hidden="true"></a>        <span class="co">// Categories/Tags</span></span>
<span id="cb3-26"><a href="#cb3-26" aria-hidden="true"></a>        <span class="st">&#39;manage_categories&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb3-27"><a href="#cb3-27" aria-hidden="true"></a></span>
<span id="cb3-28"><a href="#cb3-28" aria-hidden="true"></a>        <span class="co">// Excluded capabilities</span></span>
<span id="cb3-29"><a href="#cb3-29" aria-hidden="true"></a>        <span class="st">&#39;manage_options&#39;</span> =&gt; <span class="kw">false</span><span class="ot">,</span></span>
<span id="cb3-30"><a href="#cb3-30" aria-hidden="true"></a>        <span class="st">&#39;edit_theme_options&#39;</span> =&gt; <span class="kw">false</span><span class="ot">,</span></span>
<span id="cb3-31"><a href="#cb3-31" aria-hidden="true"></a>        <span class="st">&#39;install_plugins&#39;</span> =&gt; <span class="kw">false</span><span class="ot">,</span></span>
<span id="cb3-32"><a href="#cb3-32" aria-hidden="true"></a>        <span class="st">&#39;activate_plugins&#39;</span> =&gt; <span class="kw">false</span><span class="ot">,</span></span>
<span id="cb3-33"><a href="#cb3-33" aria-hidden="true"></a>    <span class="ot">));</span></span>
<span id="cb3-34"><a href="#cb3-34" aria-hidden="true"></a>}</span>
<span id="cb3-35"><a href="#cb3-35" aria-hidden="true"></a>register_activation_hook<span class="ot">(</span><span class="kw">__FILE__</span><span class="ot">,</span> <span class="st">&#39;dprt_add_content_manager_role&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<h2 id="adding-capabilities-to-existing-roles">Adding Capabilities to Existing Roles</h2>
<p><strong>Add Capability to Role</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_add_capabilities_to_editor<span class="ot">()</span> {</span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true"></a>    <span class="kw">$role</span> = get_role<span class="ot">(</span><span class="st">&#39;editor&#39;</span><span class="ot">);</span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true"></a>    <span class="kw">$role</span>-&gt;add_cap<span class="ot">(</span><span class="st">&#39;edit_theme_options&#39;</span><span class="ot">);</span>  <span class="co">// Access Appearance menu</span></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true"></a>    <span class="kw">$role</span>-&gt;add_cap<span class="ot">(</span><span class="st">&#39;manage_options&#39;</span><span class="ot">);</span>      <span class="co">// Access Settings</span></span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true"></a>}</span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;admin_init&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_add_capabilities_to_editor&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<p><strong>Run once then remove</strong> to avoid adding capability repeatedly.</p>
<h2 id="removing-capabilities">Removing Capabilities</h2>
<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_remove_capability<span class="ot">()</span> {</span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true"></a>    <span class="kw">$role</span> = get_role<span class="ot">(</span><span class="st">&#39;author&#39;</span><span class="ot">);</span></span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true"></a>    <span class="kw">$role</span>-&gt;remove_cap<span class="ot">(</span><span class="st">&#39;publish_posts&#39;</span><span class="ot">);</span>  <span class="co">// Authors can&#39;t publish, only draft</span></span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true"></a>}</span>
<span id="cb5-5"><a href="#cb5-5" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;admin_init&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_remove_capability&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<h2 id="custom-post-type-capabilities">Custom Post Type Capabilities</h2>
<p><strong>CPT with Custom Capabilities</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>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="cb6-2"><a href="#cb6-2" aria-hidden="true"></a>    <span class="st">&#39;capability_type&#39;</span> =&gt; <span class="kw">array</span><span class="ot">(</span><span class="st">&#39;portfolio_item&#39;</span><span class="ot">,</span> <span class="st">&#39;portfolio_items&#39;</span><span class="ot">),</span></span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true"></a>    <span class="st">&#39;map_meta_cap&#39;</span> =&gt; <span class="kw">true</span><span class="ot">,</span></span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true"></a>    <span class="co">// ... other args</span></span>
<span id="cb6-5"><a href="#cb6-5" aria-hidden="true"></a><span class="ot">));</span></span></code></pre>
</div>
<p>Generates capabilities:</p>
<ul>
<li>edit_portfolio_item</li>
<li>edit_portfolio_items</li>
<li>edit_published_portfolio_items</li>
<li>publish_portfolio_items</li>
<li>read_private_portfolio_items</li>
<li>delete_portfolio_items</li>
<li>etc.</li>
</ul>
<p><strong>Assign CPT Capabilities to Role</strong>:</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">function</span> dprt_add_portfolio_caps_to_editor<span class="ot">()</span> {</span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true"></a>    <span class="kw">$role</span> = get_role<span class="ot">(</span><span class="st">&#39;editor&#39;</span><span class="ot">);</span></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true"></a></span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true"></a>    <span class="kw">$caps</span> = <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true"></a>        <span class="st">&#39;edit_portfolio_item&#39;</span><span class="ot">,</span></span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true"></a>        <span class="st">&#39;edit_portfolio_items&#39;</span><span class="ot">,</span></span>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true"></a>        <span class="st">&#39;edit_others_portfolio_items&#39;</span><span class="ot">,</span></span>
<span id="cb7-8"><a href="#cb7-8" aria-hidden="true"></a>        <span class="st">&#39;publish_portfolio_items&#39;</span><span class="ot">,</span></span>
<span id="cb7-9"><a href="#cb7-9" aria-hidden="true"></a>        <span class="st">&#39;read_private_portfolio_items&#39;</span><span class="ot">,</span></span>
<span id="cb7-10"><a href="#cb7-10" aria-hidden="true"></a>        <span class="st">&#39;delete_portfolio_items&#39;</span><span class="ot">,</span></span>
<span id="cb7-11"><a href="#cb7-11" aria-hidden="true"></a>        <span class="st">&#39;delete_private_portfolio_items&#39;</span><span class="ot">,</span></span>
<span id="cb7-12"><a href="#cb7-12" aria-hidden="true"></a>        <span class="st">&#39;delete_published_portfolio_items&#39;</span><span class="ot">,</span></span>
<span id="cb7-13"><a href="#cb7-13" aria-hidden="true"></a>        <span class="st">&#39;delete_others_portfolio_items&#39;</span><span class="ot">,</span></span>
<span id="cb7-14"><a href="#cb7-14" aria-hidden="true"></a>        <span class="st">&#39;edit_private_portfolio_items&#39;</span><span class="ot">,</span></span>
<span id="cb7-15"><a href="#cb7-15" aria-hidden="true"></a>        <span class="st">&#39;edit_published_portfolio_items&#39;</span><span class="ot">,</span></span>
<span id="cb7-16"><a href="#cb7-16" aria-hidden="true"></a>    <span class="ot">);</span></span>
<span id="cb7-17"><a href="#cb7-17" aria-hidden="true"></a></span>
<span id="cb7-18"><a href="#cb7-18" aria-hidden="true"></a>    <span class="kw">foreach</span> <span class="ot">(</span><span class="kw">$caps</span> <span class="kw">as</span> <span class="kw">$cap</span><span class="ot">)</span> {</span>
<span id="cb7-19"><a href="#cb7-19" aria-hidden="true"></a>        <span class="kw">$role</span>-&gt;add_cap<span class="ot">(</span><span class="kw">$cap</span><span class="ot">);</span></span>
<span id="cb7-20"><a href="#cb7-20" aria-hidden="true"></a>    }</span>
<span id="cb7-21"><a href="#cb7-21" aria-hidden="true"></a>}</span>
<span id="cb7-22"><a href="#cb7-22" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;admin_init&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_add_portfolio_caps_to_editor&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<h2 id="removing-custom-roles">Removing Custom Roles</h2>
<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">function</span> dprt_remove_custom_role<span class="ot">()</span> {</span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true"></a>    remove_role<span class="ot">(</span><span class="st">&#39;client&#39;</span><span class="ot">);</span></span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true"></a>}</span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true"></a>register_deactivation_hook<span class="ot">(</span><span class="kw">__FILE__</span><span class="ot">,</span> <span class="st">&#39;dprt_remove_custom_role&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<h2 id="checking-user-capabilities">Checking User Capabilities</h2>
<p><strong>Check if User Can</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="kw">if</span> <span class="ot">(</span>current_user_can<span class="ot">(</span><span class="st">&#39;manage_options&#39;</span><span class="ot">))</span> {</span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true"></a>    <span class="co">// User is administrator or has manage_options capability</span></span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true"></a>    <span class="kw">echo</span> <span class="st">&#39;You have admin access&#39;</span><span class="ot">;</span></span>
<span id="cb9-4"><a href="#cb9-4" aria-hidden="true"></a>}</span>
<span id="cb9-5"><a href="#cb9-5" aria-hidden="true"></a></span>
<span id="cb9-6"><a href="#cb9-6" aria-hidden="true"></a><span class="kw">if</span> <span class="ot">(</span>current_user_can<span class="ot">(</span><span class="st">&#39;edit_posts&#39;</span><span class="ot">))</span> {</span>
<span id="cb9-7"><a href="#cb9-7" aria-hidden="true"></a>    <span class="kw">echo</span> <span class="st">&#39;You can edit posts&#39;</span><span class="ot">;</span></span>
<span id="cb9-8"><a href="#cb9-8" aria-hidden="true"></a>}</span></code></pre>
</div>
<p><strong>Check Specific User</strong>:</p>
<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="kw">$user</span> = get_userdata<span class="ot">(</span><span class="kw">$user_id</span><span class="ot">);</span></span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true"></a><span class="kw">if</span> <span class="ot">(</span><span class="kw">$user</span> &amp;&amp; <span class="kw">$user</span>-&gt;has_cap<span class="ot">(</span><span class="st">&#39;publish_posts&#39;</span><span class="ot">))</span> {</span>
<span id="cb10-3"><a href="#cb10-3" aria-hidden="true"></a>    <span class="co">// User can publish posts</span></span>
<span id="cb10-4"><a href="#cb10-4" aria-hidden="true"></a>}</span></code></pre>
</div>
<h2 id="conditional-content-display">Conditional Content Display</h2>
<p><strong>Show Content Based on Role</strong>:</p>
<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="co">// Show admin-only content</span></span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true"></a><span class="kw">if</span> <span class="ot">(</span>current_user_can<span class="ot">(</span><span class="st">&#39;administrator&#39;</span><span class="ot">))</span> {</span>
<span id="cb11-3"><a href="#cb11-3" aria-hidden="true"></a>    <span class="kw">echo</span> <span class="st">&#39;&lt;div class=&quot;admin-notice&quot;&gt;Admin-only message&lt;/div&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb11-4"><a href="#cb11-4" aria-hidden="true"></a>}</span>
<span id="cb11-5"><a href="#cb11-5" aria-hidden="true"></a></span>
<span id="cb11-6"><a href="#cb11-6" aria-hidden="true"></a><span class="co">// Show for multiple roles</span></span>
<span id="cb11-7"><a href="#cb11-7" aria-hidden="true"></a><span class="kw">if</span> <span class="ot">(</span>current_user_can<span class="ot">(</span><span class="st">&#39;edit_posts&#39;</span><span class="ot">)</span> || current_user_can<span class="ot">(</span><span class="st">&#39;edit_pages&#39;</span><span class="ot">))</span> {</span>
<span id="cb11-8"><a href="#cb11-8" aria-hidden="true"></a>    <span class="kw">echo</span> <span class="st">&#39;&lt;p&gt;You can edit content&lt;/p&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb11-9"><a href="#cb11-9" aria-hidden="true"></a>}</span></code></pre>
</div>
<p><strong>Shortcode for Role-Based Content</strong>:</p>
<div class="sourceCode" id="cb12">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true"></a><span class="kw">function</span> dprt_role_content_shortcode<span class="ot">(</span><span class="kw">$atts</span><span class="ot">,</span> <span class="kw">$content</span> = <span class="kw">null</span><span class="ot">)</span> {</span>
<span id="cb12-2"><a href="#cb12-2" aria-hidden="true"></a>    <span class="kw">$atts</span> = shortcode_atts<span class="ot">(</span><span class="kw">array</span><span class="ot">(</span></span>
<span id="cb12-3"><a href="#cb12-3" aria-hidden="true"></a>        <span class="st">&#39;role&#39;</span> =&gt; <span class="st">&#39;administrator&#39;</span><span class="ot">,</span></span>
<span id="cb12-4"><a href="#cb12-4" aria-hidden="true"></a>    <span class="ot">),</span> <span class="kw">$atts</span><span class="ot">);</span></span>
<span id="cb12-5"><a href="#cb12-5" aria-hidden="true"></a></span>
<span id="cb12-6"><a href="#cb12-6" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span>current_user_can<span class="ot">(</span><span class="kw">$atts</span><span class="ot">[</span><span class="st">&#39;role&#39;</span><span class="ot">]))</span> {</span>
<span id="cb12-7"><a href="#cb12-7" aria-hidden="true"></a>        <span class="kw">return</span> do_shortcode<span class="ot">(</span><span class="kw">$content</span><span class="ot">);</span></span>
<span id="cb12-8"><a href="#cb12-8" aria-hidden="true"></a>    }</span>
<span id="cb12-9"><a href="#cb12-9" aria-hidden="true"></a></span>
<span id="cb12-10"><a href="#cb12-10" aria-hidden="true"></a>    <span class="kw">return</span> <span class="st">&#39;&#39;</span><span class="ot">;</span></span>
<span id="cb12-11"><a href="#cb12-11" aria-hidden="true"></a>}</span>
<span id="cb12-12"><a href="#cb12-12" aria-hidden="true"></a>add_shortcode<span class="ot">(</span><span class="st">&#39;role_content&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_role_content_shortcode&#39;</span><span class="ot">);</span></span>
<span id="cb12-13"><a href="#cb12-13" aria-hidden="true"></a></span>
<span id="cb12-14"><a href="#cb12-14" aria-hidden="true"></a><span class="co">// Usage: [role_content role=&quot;editor&quot;]Content for editors only[/role_content]</span></span></code></pre>
</div>
<h2 id="admin-menu-restrictions">Admin Menu Restrictions</h2>
<p><strong>Hide Menu Items by Role</strong>:</p>
<div class="sourceCode" id="cb13">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true"></a><span class="kw">function</span> dprt_remove_menus<span class="ot">()</span> {</span>
<span id="cb13-2"><a href="#cb13-2" aria-hidden="true"></a>    <span class="co">// For non-administrators</span></span>
<span id="cb13-3"><a href="#cb13-3" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span>!current_user_can<span class="ot">(</span><span class="st">&#39;administrator&#39;</span><span class="ot">))</span> {</span>
<span id="cb13-4"><a href="#cb13-4" aria-hidden="true"></a>        remove_menu_page<span class="ot">(</span><span class="st">&#39;tools.php&#39;</span><span class="ot">);</span>        <span class="co">// Tools</span></span>
<span id="cb13-5"><a href="#cb13-5" aria-hidden="true"></a>        remove_menu_page<span class="ot">(</span><span class="st">&#39;plugins.php&#39;</span><span class="ot">);</span>      <span class="co">// Plugins</span></span>
<span id="cb13-6"><a href="#cb13-6" aria-hidden="true"></a>        remove_menu_page<span class="ot">(</span><span class="st">&#39;themes.php&#39;</span><span class="ot">);</span>       <span class="co">// Appearance</span></span>
<span id="cb13-7"><a href="#cb13-7" aria-hidden="true"></a>        remove_menu_page<span class="ot">(</span><span class="st">&#39;users.php&#39;</span><span class="ot">);</span>        <span class="co">// Users</span></span>
<span id="cb13-8"><a href="#cb13-8" aria-hidden="true"></a>    }</span>
<span id="cb13-9"><a href="#cb13-9" aria-hidden="true"></a></span>
<span id="cb13-10"><a href="#cb13-10" aria-hidden="true"></a>    <span class="co">// For editors (more restrictive)</span></span>
<span id="cb13-11"><a href="#cb13-11" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span>current_user_can<span class="ot">(</span><span class="st">&#39;editor&#39;</span><span class="ot">))</span> {</span>
<span id="cb13-12"><a href="#cb13-12" aria-hidden="true"></a>        remove_menu_page<span class="ot">(</span><span class="st">&#39;options-general.php&#39;</span><span class="ot">);</span> <span class="co">// Settings</span></span>
<span id="cb13-13"><a href="#cb13-13" aria-hidden="true"></a>    }</span>
<span id="cb13-14"><a href="#cb13-14" aria-hidden="true"></a>}</span>
<span id="cb13-15"><a href="#cb13-15" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;admin_menu&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_remove_menus&#39;</span><span class="ot">,</span> <span class="dv">999</span><span class="ot">);</span></span></code></pre>
</div>
<h2 id="dashboard-widget-restrictions">Dashboard Widget Restrictions</h2>
<div class="sourceCode" id="cb14">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true"></a><span class="kw">function</span> dprt_remove_dashboard_widgets<span class="ot">()</span> {</span>
<span id="cb14-2"><a href="#cb14-2" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span>!current_user_can<span class="ot">(</span><span class="st">&#39;administrator&#39;</span><span class="ot">))</span> {</span>
<span id="cb14-3"><a href="#cb14-3" aria-hidden="true"></a>        remove_meta_box<span class="ot">(</span><span class="st">&#39;dashboard_primary&#39;</span><span class="ot">,</span> <span class="st">&#39;dashboard&#39;</span><span class="ot">,</span> <span class="st">&#39;side&#39;</span><span class="ot">);</span>  <span class="co">// WordPress News</span></span>
<span id="cb14-4"><a href="#cb14-4" aria-hidden="true"></a>        remove_meta_box<span class="ot">(</span><span class="st">&#39;dashboard_quick_press&#39;</span><span class="ot">,</span> <span class="st">&#39;dashboard&#39;</span><span class="ot">,</span> <span class="st">&#39;side&#39;</span><span class="ot">);</span> <span class="co">// Quick Draft</span></span>
<span id="cb14-5"><a href="#cb14-5" aria-hidden="true"></a>    }</span>
<span id="cb14-6"><a href="#cb14-6" aria-hidden="true"></a>}</span>
<span id="cb14-7"><a href="#cb14-7" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;wp_dashboard_setup&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_remove_dashboard_widgets&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<h2 id="custom-capabilities-for-plugins">Custom Capabilities for Plugins</h2>
<p><strong>Create Plugin-Specific Capability</strong>:</p>
<div class="sourceCode" id="cb15">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true"></a><span class="kw">function</span> dprt_add_plugin_capability<span class="ot">()</span> {</span>
<span id="cb15-2"><a href="#cb15-2" aria-hidden="true"></a>    <span class="kw">$admin</span> = get_role<span class="ot">(</span><span class="st">&#39;administrator&#39;</span><span class="ot">);</span></span>
<span id="cb15-3"><a href="#cb15-3" aria-hidden="true"></a>    <span class="kw">$admin</span>-&gt;add_cap<span class="ot">(</span><span class="st">&#39;manage_custom_plugin&#39;</span><span class="ot">);</span></span>
<span id="cb15-4"><a href="#cb15-4" aria-hidden="true"></a></span>
<span id="cb15-5"><a href="#cb15-5" aria-hidden="true"></a>    <span class="kw">$editor</span> = get_role<span class="ot">(</span><span class="st">&#39;editor&#39;</span><span class="ot">);</span></span>
<span id="cb15-6"><a href="#cb15-6" aria-hidden="true"></a>    <span class="kw">$editor</span>-&gt;add_cap<span class="ot">(</span><span class="st">&#39;use_custom_plugin&#39;</span><span class="ot">);</span>  <span class="co">// Limited access</span></span>
<span id="cb15-7"><a href="#cb15-7" aria-hidden="true"></a>}</span>
<span id="cb15-8"><a href="#cb15-8" aria-hidden="true"></a>register_activation_hook<span class="ot">(</span><span class="kw">__FILE__</span><span class="ot">,</span> <span class="st">&#39;dprt_add_plugin_capability&#39;</span><span class="ot">);</span></span>
<span id="cb15-9"><a href="#cb15-9" aria-hidden="true"></a></span>
<span id="cb15-10"><a href="#cb15-10" aria-hidden="true"></a><span class="co">// Check capability before showing plugin features</span></span>
<span id="cb15-11"><a href="#cb15-11" aria-hidden="true"></a><span class="kw">if</span> <span class="ot">(</span>current_user_can<span class="ot">(</span><span class="st">&#39;manage_custom_plugin&#39;</span><span class="ot">))</span> {</span>
<span id="cb15-12"><a href="#cb15-12" aria-hidden="true"></a>    <span class="co">// Show advanced plugin settings</span></span>
<span id="cb15-13"><a href="#cb15-13" aria-hidden="true"></a>}</span></code></pre>
</div>
<h2 id="role-management-plugins">Role Management Plugins</h2>
<p><strong>Members Plugin</strong>:</p>
<ul>
<li>GUI for role/capability management</li>
<li>Clone existing roles</li>
<li>Create custom capabilities</li>
<li>User-friendly interface</li>
</ul>
<p><strong>User Role Editor</strong>:</p>
<ul>
<li>Edit role capabilities visually</li>
<li>Assign multiple roles to users</li>
<li>Capability filtering</li>
</ul>
<p><strong>PublishPress Capabilities</strong>:</p>
<ul>
<li>Role duplication</li>
<li>Capability management</li>
<li>Custom post type integration</li>
</ul>
<h2 id="advanced-multiple-roles-per-user">Advanced: Multiple Roles per User</h2>
<p>WordPress doesn’t natively support multiple roles well, but:</p>
<div class="sourceCode" id="cb16">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true"></a><span class="kw">function</span> dprt_add_secondary_role<span class="ot">(</span><span class="kw">$user_id</span><span class="ot">,</span> <span class="kw">$role</span><span class="ot">)</span> {</span>
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true"></a>    <span class="kw">$user</span> = get_userdata<span class="ot">(</span><span class="kw">$user_id</span><span class="ot">);</span></span>
<span id="cb16-3"><a href="#cb16-3" aria-hidden="true"></a>    <span class="kw">$user</span>-&gt;add_role<span class="ot">(</span><span class="kw">$role</span><span class="ot">);</span>  <span class="co">// Adds role without removing existing</span></span>
<span id="cb16-4"><a href="#cb16-4" aria-hidden="true"></a>}</span>
<span id="cb16-5"><a href="#cb16-5" aria-hidden="true"></a></span>
<span id="cb16-6"><a href="#cb16-6" aria-hidden="true"></a><span class="co">// Usage</span></span>
<span id="cb16-7"><a href="#cb16-7" aria-hidden="true"></a>dprt_add_secondary_role<span class="ot">(</span><span class="dv">5</span><span class="ot">,</span> <span class="st">&#39;editor&#39;</span><span class="ot">);</span>  <span class="co">// User 5 now has their original role + editor</span></span></code></pre>
</div>
<p><strong>Check Any of Multiple Roles</strong>:</p>
<div class="sourceCode" id="cb17">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true"></a><span class="kw">function</span> dprt_user_has_role<span class="ot">(</span><span class="kw">$user_id</span><span class="ot">,</span> <span class="kw">$roles</span><span class="ot">)</span> {</span>
<span id="cb17-2"><a href="#cb17-2" aria-hidden="true"></a>    <span class="kw">$user</span> = get_userdata<span class="ot">(</span><span class="kw">$user_id</span><span class="ot">);</span></span>
<span id="cb17-3"><a href="#cb17-3" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span>!<span class="kw">$user</span><span class="ot">)</span> <span class="kw">return</span> <span class="kw">false</span><span class="ot">;</span></span>
<span id="cb17-4"><a href="#cb17-4" aria-hidden="true"></a></span>
<span id="cb17-5"><a href="#cb17-5" aria-hidden="true"></a>    <span class="kw">foreach</span> <span class="ot">(</span><span class="kw">$roles</span> <span class="kw">as</span> <span class="kw">$role</span><span class="ot">)</span> {</span>
<span id="cb17-6"><a href="#cb17-6" aria-hidden="true"></a>        <span class="kw">if</span> <span class="ot">(</span><span class="fu">in_array</span><span class="ot">(</span><span class="kw">$role</span><span class="ot">,</span> <span class="dt">(array)</span> <span class="kw">$user</span>-&gt;roles<span class="ot">))</span> {</span>
<span id="cb17-7"><a href="#cb17-7" aria-hidden="true"></a>            <span class="kw">return</span> <span class="kw">true</span><span class="ot">;</span></span>
<span id="cb17-8"><a href="#cb17-8" aria-hidden="true"></a>        }</span>
<span id="cb17-9"><a href="#cb17-9" aria-hidden="true"></a>    }</span>
<span id="cb17-10"><a href="#cb17-10" aria-hidden="true"></a>    <span class="kw">return</span> <span class="kw">false</span><span class="ot">;</span></span>
<span id="cb17-11"><a href="#cb17-11" aria-hidden="true"></a>}</span>
<span id="cb17-12"><a href="#cb17-12" aria-hidden="true"></a></span>
<span id="cb17-13"><a href="#cb17-13" aria-hidden="true"></a><span class="co">// Usage</span></span>
<span id="cb17-14"><a href="#cb17-14" aria-hidden="true"></a><span class="kw">if</span> <span class="ot">(</span>dprt_user_has_role<span class="ot">(</span><span class="kw">$user_id</span><span class="ot">,</span> <span class="kw">array</span><span class="ot">(</span><span class="st">&#39;editor&#39;</span><span class="ot">,</span> <span class="st">&#39;administrator&#39;</span><span class="ot">)))</span> {</span>
<span id="cb17-15"><a href="#cb17-15" aria-hidden="true"></a>    <span class="co">// User is editor OR administrator</span></span>
<span id="cb17-16"><a href="#cb17-16" aria-hidden="true"></a>}</span></code></pre>
</div>
<h2 id="security-best-practices">Security Best Practices</h2>
<p><strong>Principle of Least Privilege</strong>: Grant minimum necessary capabilities.</p>
<p><strong>Avoid Capability Checks by Role Name</strong>:</p>
<div class="sourceCode" id="cb18">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true"></a><span class="co">// BAD</span></span>
<span id="cb18-2"><a href="#cb18-2" aria-hidden="true"></a><span class="kw">if</span> <span class="ot">(</span><span class="fu">in_array</span><span class="ot">(</span><span class="st">&#39;administrator&#39;</span><span class="ot">,</span> <span class="kw">$user</span>-&gt;roles<span class="ot">))</span> { }</span>
<span id="cb18-3"><a href="#cb18-3" aria-hidden="true"></a></span>
<span id="cb18-4"><a href="#cb18-4" aria-hidden="true"></a><span class="co">// GOOD</span></span>
<span id="cb18-5"><a href="#cb18-5" aria-hidden="true"></a><span class="kw">if</span> <span class="ot">(</span>current_user_can<span class="ot">(</span><span class="st">&#39;manage_options&#39;</span><span class="ot">))</span> { }</span></code></pre>
</div>
<p>Capability checks are more flexible and future-proof.</p>
<p><strong>Escape Output</strong>:</p>
<div class="sourceCode" id="cb19">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb19-1"><a href="#cb19-1" aria-hidden="true"></a><span class="co">// When displaying user-submitted content based on roles</span></span>
<span id="cb19-2"><a href="#cb19-2" aria-hidden="true"></a><span class="kw">if</span> <span class="ot">(</span>current_user_can<span class="ot">(</span><span class="st">&#39;edit_posts&#39;</span><span class="ot">))</span> {</span>
<span id="cb19-3"><a href="#cb19-3" aria-hidden="true"></a>    <span class="kw">echo</span> <span class="st">&#39;&lt;p&gt;&#39;</span> . esc_html<span class="ot">(</span><span class="kw">$user_content</span><span class="ot">)</span> . <span class="st">&#39;&lt;/p&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb19-4"><a href="#cb19-4" aria-hidden="true"></a>}</span></code></pre>
</div>
<h2 id="debugging-roles-and-capabilities">Debugging Roles and Capabilities</h2>
<p><strong>View User Capabilities</strong>:</p>
<div class="sourceCode" id="cb20">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb20-1"><a href="#cb20-1" aria-hidden="true"></a><span class="kw">function</span> dprt_show_user_capabilities<span class="ot">()</span> {</span>
<span id="cb20-2"><a href="#cb20-2" aria-hidden="true"></a>    <span class="kw">$user</span> = wp_get_current_user<span class="ot">();</span></span>
<span id="cb20-3"><a href="#cb20-3" aria-hidden="true"></a>    <span class="kw">echo</span> <span class="st">&#39;&lt;pre&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb20-4"><a href="#cb20-4" aria-hidden="true"></a>    <span class="fu">print_r</span><span class="ot">(</span><span class="kw">$user</span>-&gt;allcaps<span class="ot">);</span>  <span class="co">// All capabilities</span></span>
<span id="cb20-5"><a href="#cb20-5" aria-hidden="true"></a>    <span class="fu">print_r</span><span class="ot">(</span><span class="kw">$user</span>-&gt;roles<span class="ot">);</span>     <span class="co">// Assigned roles</span></span>
<span id="cb20-6"><a href="#cb20-6" aria-hidden="true"></a>    <span class="kw">echo</span> <span class="st">&#39;&lt;/pre&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb20-7"><a href="#cb20-7" aria-hidden="true"></a>}</span>
<span id="cb20-8"><a href="#cb20-8" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;admin_notices&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_show_user_capabilities&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<p><strong>List All Roles</strong>:</p>
<div class="sourceCode" id="cb21">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb21-1"><a href="#cb21-1" aria-hidden="true"></a><span class="kw">global</span> <span class="kw">$wp_roles</span><span class="ot">;</span></span>
<span id="cb21-2"><a href="#cb21-2" aria-hidden="true"></a><span class="kw">$all_roles</span> = <span class="kw">$wp_roles</span>-&gt;roles<span class="ot">;</span></span>
<span id="cb21-3"><a href="#cb21-3" aria-hidden="true"></a><span class="fu">print_r</span><span class="ot">(</span><span class="kw">$all_roles</span><span class="ot">);</span></span></code></pre>
</div>
<h2 id="programmatic-role-assignment">Programmatic Role Assignment</h2>
<p><strong>Assign Role to User on Registration</strong>:</p>
<div class="sourceCode" id="cb22">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb22-1"><a href="#cb22-1" aria-hidden="true"></a><span class="kw">function</span> dprt_set_default_user_role<span class="ot">(</span><span class="kw">$user_id</span><span class="ot">)</span> {</span>
<span id="cb22-2"><a href="#cb22-2" aria-hidden="true"></a>    <span class="kw">$user</span> = get_userdata<span class="ot">(</span><span class="kw">$user_id</span><span class="ot">);</span></span>
<span id="cb22-3"><a href="#cb22-3" aria-hidden="true"></a>    <span class="kw">$user</span>-&gt;set_role<span class="ot">(</span><span class="st">&#39;client&#39;</span><span class="ot">);</span>  <span class="co">// Change from default &#39;subscriber&#39;</span></span>
<span id="cb22-4"><a href="#cb22-4" aria-hidden="true"></a>}</span>
<span id="cb22-5"><a href="#cb22-5" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;user_register&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_set_default_user_role&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<p><strong>Change Role Based on Conditions</strong>:</p>
<div class="sourceCode" id="cb23">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb23-1"><a href="#cb23-1" aria-hidden="true"></a><span class="kw">function</span> dprt_upgrade_user_role<span class="ot">(</span><span class="kw">$user_id</span><span class="ot">)</span> {</span>
<span id="cb23-2"><a href="#cb23-2" aria-hidden="true"></a>    <span class="co">// Example: Upgrade to author after 10 published comments</span></span>
<span id="cb23-3"><a href="#cb23-3" aria-hidden="true"></a>    <span class="kw">$comment_count</span> = get_comments<span class="ot">(</span><span class="kw">array</span><span class="ot">(</span></span>
<span id="cb23-4"><a href="#cb23-4" aria-hidden="true"></a>        <span class="st">&#39;user_id&#39;</span> =&gt; <span class="kw">$user_id</span><span class="ot">,</span></span>
<span id="cb23-5"><a href="#cb23-5" aria-hidden="true"></a>        <span class="st">&#39;status&#39;</span> =&gt; <span class="st">&#39;approve&#39;</span><span class="ot">,</span></span>
<span id="cb23-6"><a href="#cb23-6" aria-hidden="true"></a>        <span class="st">&#39;count&#39;</span> =&gt; <span class="kw">true</span></span>
<span id="cb23-7"><a href="#cb23-7" aria-hidden="true"></a>    <span class="ot">));</span></span>
<span id="cb23-8"><a href="#cb23-8" aria-hidden="true"></a></span>
<span id="cb23-9"><a href="#cb23-9" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span><span class="kw">$comment_count</span> &gt;= <span class="dv">10</span><span class="ot">)</span> {</span>
<span id="cb23-10"><a href="#cb23-10" aria-hidden="true"></a>        <span class="kw">$user</span> = get_userdata<span class="ot">(</span><span class="kw">$user_id</span><span class="ot">);</span></span>
<span id="cb23-11"><a href="#cb23-11" aria-hidden="true"></a>        <span class="kw">$user</span>-&gt;set_role<span class="ot">(</span><span class="st">&#39;author&#39;</span><span class="ot">);</span></span>
<span id="cb23-12"><a href="#cb23-12" aria-hidden="true"></a>    }</span>
<span id="cb23-13"><a href="#cb23-13" aria-hidden="true"></a>}</span></code></pre>
</div>
<h2 id="woocommerce-custom-roles">WooCommerce Custom Roles</h2>
<p><strong>Customer Role Modifications</strong>:</p>
<div class="sourceCode" id="cb24">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb24-1"><a href="#cb24-1" aria-hidden="true"></a><span class="kw">function</span> dprt_modify_customer_role<span class="ot">()</span> {</span>
<span id="cb24-2"><a href="#cb24-2" aria-hidden="true"></a>    <span class="kw">$customer</span> = get_role<span class="ot">(</span><span class="st">&#39;customer&#39;</span><span class="ot">);</span></span>
<span id="cb24-3"><a href="#cb24-3" aria-hidden="true"></a>    <span class="kw">$customer</span>-&gt;add_cap<span class="ot">(</span><span class="st">&#39;read&#39;</span><span class="ot">);</span></span>
<span id="cb24-4"><a href="#cb24-4" aria-hidden="true"></a>    <span class="kw">$customer</span>-&gt;add_cap<span class="ot">(</span><span class="st">&#39;view_order_history&#39;</span><span class="ot">);</span>  <span class="co">// Custom capability</span></span>
<span id="cb24-5"><a href="#cb24-5" aria-hidden="true"></a>}</span>
<span id="cb24-6"><a href="#cb24-6" 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_modify_customer_role&#39;</span><span class="ot">);</span></span></code></pre>
</div>
<h2 id="conclusion">Conclusion</h2>
<p>WordPress custom user roles and capabilities enable precise permission management beyond default role limitations. Create custom roles with add_role(), assign specific capabilities via add_cap(), check permissions using current_user_can(), and implement role-based content visibility. Programmatic role management provides granular access control for clients, contributors, and specialized users, ensuring security through least-privilege principles while maintaining workflow flexibility.</p>
<h2 id="external-links">External Links</h2>
<ol type="1">
<li><a href="https://wordpress.org/support/article/roles-and-capabilities/">WordPress Roles and Capabilities</a></li>
<li><a href="https://developer.wordpress.org/reference/functions/add_role/">add_role() Reference</a></li>
<li><a href="https://developer.wordpress.org/reference/functions/current_user_can/">current_user_can() Reference</a></li>
<li><a href="https://wordpress.org/plugins/members/">Members Plugin</a></li>
<li><a href="https://wordpress.org/plugins/user-role-editor/">User Role Editor</a></li>
</ol>
<h2 id="call-to-action">Call to Action</h2>
<p>User management configurations need protection. <a href="https://backupcopilotplugin.com/">Backup Copilot Pro</a> safeguards your WordPress user roles and permissions. Protect your access control setup—start your free 30-day trial today!</p>
<p>The post <a href="https://developryplugins.com/how-to-add-custom-user-roles-and-capabilities-in-wordpress/">How to Add Custom User Roles and Capabilities in WordPress</a> appeared first on <a href="https://developryplugins.com">Developry Plugins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
