This is how I managed a similar situation – to allow logged in authors access to a topics pitch form – using these steps (I’ll add my code examples below):
-
I put the form in a Hidden Div that was visible only to logged in users, if a site visitor was not logged in, instead they see a “login or apply” message – in my case the “login” displayed the login form in an overlay (fancybox style) but you could also link it directly to the wp-login.php page and then add a bit more code to redirect them back to where they were….in my case the “apply” link leads to a Page where they can apply to register as an authorized user, but they’re not automatically approved so after applying they go to a “thanks we’ll be in touch” page.
-
I created the shortcode to display only the login form, not the wp-login.php page and show it in an overlay so my site visitors didn’t leave the page they were on.
Here’s the code I used:
-
Hiding a form from non-logged in users – 2 possible methods:
a) the easy way is to use a forms plugin that has the option to hide/show a form base on logged in status, I use GravityForms and this is easy to accomplish and allows for an HTML notice (but not PHP) to show in place of the form if a user is not logged in, the “no PHP” rule is why I created a shortcode:
b) IF you’re manually creating the review form OR using a plugin that doesn’t have the option to hide/show the form based on logged-in status, then simply wrap your form in some code like this:
if ( is_user_logged_in() ) { display your form code or shortcode here; } else { echo 'You must be logged in to access our pitch form, please <a class="fancybox-inline" href="#fancyboxID-2">Login</a> or <a href="https://(mysite-redacted-for-privacy)/Apply">Apply</a>'; echo '<div style="display:none;"><div id="fancyboxID-2">'; echo do_shortcode('[displayLogin]'); echo '</div></div>'; }
Note the “echo do_shortcode” – that’s the shortcode below to display just the login form, not the login page. If someone is logged in, they’ll see your form….if not, they’ll see a link to “login” or “apply”, if they click on login, it will show the login form in an overlay, fancybox style (I use Easy FancyBox plugin).
-
Shortcode to display login form in the overlay:
add_shortcode( 'displayLogin', 'display_loginForm' ); function display_loginForm() { $args = array( 'echo' => false, 'value_remember' => true,); $loginForm = wp_login_form($args); $html=""; $html.= '<div id="popupLogin" class="bordered rounded">'; $html.= $loginForm; $html.='</div>'; $html.='<span class="popupLoginFPWD"><a href="https://(mysite-redacted-for-privacy)/wp-login.php?action=lostpassword" target="_self">Lost Your Password?</a></span>'; return $html; }
NOTE: I default the “remember me” checkbox to true because all my authors complained about being logged out, so I added code to extend their login duration to a year if they check the box, you may not want to do that, just change the value for “value_remember” to false if you want the normal 2-day login duration.
I went with this method because redirecting users after logging in can be tricky, the default WP behavior is generally to take users to the WP Admin back end with whatever menu items their role allows, for the lowest role (subscriber) it usually only gives them their own profile page.
You certainly CAN redirect them elsewhere – such as back to your reviews page – but that’s not always the best user experience, especially if they didn’t want to go back to that page but had decided instead to maybe edit their profile. I would give thought to all considerations of handling this – for example, you might want to create a new class of User – say “reviewer” for example – and that class never gets to the back-end. For those who already have a higher role, you might offer an interstitial page or message offering them the option of going to the reviews page OR the back end.
Good luck with this! I’ll be interested in whatever final solutions you land on. 🙂