Appearance
Visibility Rules
Visibility rules control when an element is rendered on the page. Unlike display: none (which hides the element but still renders it), visibility rules prevent the element from being included in the HTML output entirely.
Visibility Modes
Always Visible (default)
The element is always rendered. This is the default for all elements.
Expression
The element is rendered only when a custom expression evaluates to true.
Example expressions:
row.status == 'active'Only show when the current row's status is "active".
row.price > 0Only show when the price is positive.
count(row.items) > 0Only show when items array is not empty.
row.type == 'premium' and user_can('read')Show only for premium items to logged-in users.
row.image_url != ''Only show the image element when an image URL exists.
Logged In
The element is rendered only for authenticated WordPress users. Anonymous visitors do not see it.
Use cases:
- User profile menus
- "My Account" links
- Edit/delete buttons
- Personalized content sections
Logged Out
The element is rendered only for anonymous (not logged-in) visitors. Authenticated users do not see it.
Use cases:
- Login/register buttons
- "Sign up" call-to-action banners
- Guest welcome messages
How It Works
Visibility rules are evaluated on the server during rendering:
always-- Element is always included in HTML output.expression-- The expression is evaluated using the current data context (row). If truthy, the element is rendered; if falsy, it is skipped entirely.logged_in-- Checksis_user_logged_in(). Renders only iftrue.logged_out-- Checksis_user_logged_in(). Renders only iffalse.
Because this is server-side rendering, hidden elements are never sent to the browser. This is more secure than client-side hiding (CSS display: none) because the HTML and data are not exposed.
Expression Context
In expression-based visibility rules, the following variables are available:
| Variable | Description |
|---|---|
row | The current data context (e.g., the current repeater row). |
You can use all expression functions:
user_can('manage_options')
user_has_role('subscriber')
in_store('favorites', row.id)
row.quantity > 0 and row.status == 'active'Common Patterns
Show edit button only for the item's author
row.user_id == user_meta('ID')Show "sold out" badge when quantity is zero
row.quantity <= 0Show admin toolbar only for administrators
user_can('manage_options')Show "no results" message when data is empty
Set on a text element:
count(row.items) == 0Show premium content only for subscribers
user_has_role('subscriber') or user_has_role('administrator')Best Practices
- Use visibility for security-sensitive content. Elements hidden by visibility rules are never sent to the browser, making them safe for hiding admin controls and sensitive data.
- Prefer visibility over If/Else for simple show/hide. If you just need to show or hide a widget based on a condition, a visibility rule is simpler than building a conditional pipeline.
- Combine with auth functions. Use
user_can()anduser_has_role()for permission-based visibility. - Keep expressions simple. Complex logic is better handled in the pipeline with If/Else or Switch nodes.