Skip to content

Instantly share code, notes, and snippets.

@vylesk vylesk/show_if.php
Last active May 27, 2019

Embed
What would you like to do?
WordPress Shortcode: "Show If" for conditional content display
<?php
/**
* Plugin Name: "Show If" Shortcode
* Plugin URI: https://jsnelders.com/
* Description: Shortcode to conditionally display content if the user is in a specified role or has a specified username.
* Author: Jason Snelders
* Author URI: http://jsnelders.com
* Version: 190529.1
**/
namespace JasonSnelders\Shortcodes;
/*
* Show the content only if the current user is one of the specified username(s) or in one ofthe role(s).
*
* Attributes:
* role: comma separated list of allowed roles to view the content.
* username: comma separated list of allowed usernames to view the content.
*
* Attrubtes combine as an OR expressess - content is displayed if they user is in the "role" list OR the "username" list.
*/
add_shortcode('show_if', 'JasonSnelders\Shortcodes\show_if_handler');
function show_if_handler($atts = [], $content = null)
{
// Get supplied shortcode attributes.
$show_if_role = "";
$show_if_username = "";
if(isset($atts["role"])) $show_if_role = $atts["role"];
if(isset($atts["username"])) $show_if_username = $atts["username"];
$show_if_role = explode(',', $show_if_role);
$show_if_username = explode(',', $show_if_username);
// Get the current user.
$wp_user = \wp_get_current_user();
$wp_user_roles = $wp_user->roles;
$wp_user_username = $wp_user->user_login;
// Check if current user can view content/
$show_to_user = false;
foreach ($wp_user_roles as $role_slug)
{
if ($role_slug != "" && in_array_case_insensitive($atts, $role_slug))
{
$show_to_user = true;
break;
}
}
if ($show_to_user == false)
{
foreach ($show_if_username as $show_username)
{
if ($show_username != "" && strtolower($show_username) == strtolower($wp_user_username))
{
$show_to_user = true;
break;
}
}
}
ob_start();
if ($show_to_user == true)
{
// Show the content
$content = do_shortcode($content);
echo $content;
}
else
{
// Hide the content
echo "";
}
return ob_get_clean();
}
/*
* Case-insensitive check if a value is in the array.
* (Source: https://gist.github.com/sepehr/6351397)
*/
function in_array_case_insensitive($array, $check_value)
{
return in_array(strtolower($check_value), array_map('strtolower', $array));
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.