I found a great post which shows how to easily use an if-else shortcode in WordPress.

[if is_user_logged_in]
    You are already logged in.
[else]
    Display registration form.
[/if]

A callable must be used in the [if] condition.

In the above example, is_user_logged_in is the callable. This is a built in WordPress function to check whether the current visitor is a logged in user. It’s a shortcode equivalent of this PHP code:

<?php
if ( is_user_logged_in() ) { echo "You are already logged in."; } else { echo "Display registration form."; }

The callable you use will likely be the name of a WordPress function, or function added by a plugin. It can also be an object method or a static class method.

Callables support parameters, just like functions.

[if is_singular book]
    Show related books
[/if]

What if you need to check more than one condition?

I needed to check two conditions:
1. Is user a “Member”
2. Is user logged in to WordPress

I needed support for if-elseif-else statements.

If a user was a member I needed to show, “You are already a member”.
If a user was logged in, I needed to show a signup form.
Otherwise, I needed to show a different signup form.

I modified the code in the article above and found a solution for doing if-elseif-else conditions.

I changed the code to return a string (error message) instead of an Exception. A thrown Exception will not allow you to access the WordPress editor, if a non-callable is used in the shortcode. We need access to the editor to resolve this.

Install the plugin

Clone the repo to your /wp-content/plugins/ folder and the activate the plugin.

git clone https://github.com/n8kowald/if-elseif-else-shortcode

This allows you to use the following shortcode:

[if is_admin]
    Hi God, you're up late
[elseif is_user_logged_in]
    Hi Zero Cool, welcome back
[else]
    Welcome to the website. Please register to continue.
[/if]

We can use multiple elseif statements for an unlimited amount of conditions.

[if is_admin]
    Hi Mr The Plague.
[elseif is_user_logged_in]
    Hi Zero Cool, hack the planet!
[elseif is_single]
   Pool on the roof must have a leak.
[else]
    Welcome an0n. Please look around but don't steal my fries.
[/if]

You can use if on its own

[if is_admin]
    Hi Mr The Plague.
[/if]

You can use if-else without the elseif

[if is_admin]
    Hi Mr The Plague.
[else]
    Welcome an0n. Please look around but don't steal my fries.
[/if]

Allowed callables

The following callable functions are allowed by default:

comments_open
get_field is_404 is_admin is_archive is_author is_category is_day is_feed is_front_page is_home is_month is_page is_search is_single is_singular is_sticky is_super_admin is_tag is_tax is_time is_user_logged_in is_year pings_open

Adding callables

To allow other callables you must use the if_elseif_else_shortcode_allowed_callables filter.

This “allow other functions” filter should be added to wherever you put your hooks. That could be in:

  • a custom plugin: wp-content/plugins/plugin/plugin.php
  • a child theme’s functions.php: wp-content/themes/theme-child/functions.php
  • or a theme’s functions.php: wp-content/themes/theme/functions.php
<?php
add_filter( 'if_elseif_else_shortcode_allowed_callables', function( $whitelist ) {
    $whitelist[] = 'your_callable_here';
   
    return $whitelist;
}); 

Supported callable types

  • Function names: is_user_logged_in
  • Static class method calls (>=PHP 5.2.3): MyClass::myCallbackMethod
[if is_user_logged_in]
    Hello user
[elseif User::is_member_logged_in]
    Hello member
[else]
    Hello, please log in
[/if]

Note: in the above example, you would need to add User::is_member_logged_in to the allowed callables list.

Passing parameters to callables

Parameters are passed as space separated strings

[if is_singular books]
    Related books here.
[/if] 

If your callable accepts multiple parameters

<?php
function is_garfield( $animal, $colour ) {
    return $animal === 'cat' && $colour === 'orange';
}
[if is_garfield cat orange]
     Yes, this is garfield.
[/if]

Testing

If you want to simplify the main function or fix a bug, the plugin includes WordPress tests for refactored code.

Install PHPUnit and PHPUnit Polyfills

composer install

Install the WordPress testing library and database

Run this from the plugin directory.
Replace mysql_username and mysql_password with your MySQL username and password:

./bin/install-wp-tests.sh wordpress_tests mysql_username mysql_password

You can then run tests with:

vendor/bin/phpunit