WordPress шорткоды. Секретное содержимое

Шорткод. Общие сведения и пример.

Уже повсеместно в Сети рассказано о шорткодах.

Краткий экскурс: шорткод это, дословно, короткий код. Вместо [soft_shortcode] выполниться функция, которая зарегистрирована в add_shortcode.

Т.е. если у нас шорткод [soft_shortcode], то и регистрировать будем его с тем же названием.

Откроем файл functions.php или в коде нашего плагина напишем:

add_shortcode( 'soft_shortcode', 'my_soft_shortcode_callback' );
 function my_soft_shortcode_callback(){
   echo "
<h2>Этот код выполнен вместо шорткода <b>['soft_shortcode']</b></h2>
"; }

Создадим страницу или пост, и в текстовом редакторе TinyMCE, введем следующее:

echo shortcode

Посмотрим на результат

before shoretcode

Почему код шоркода выполнился в начале страницы, а не там где нам нужно?

Причина проста

add_shortcode( 'soft_shortcode', 'my_soft_shortcode_callback' );
 function my_soft_shortcode_callback(){
   return /* echo необходимо заменить на return*/"
<h2>Этот код выполнен вместо шорткода <b>['soft_shortcode']</b></h2>
"; }

Попробуем еще раз c исправленным кодом:

return shortcode

Теперь полный порядок!

Вместо надписи можете выводить результаты своих функций.

Секретное содержимое

О том, как выводить шорткоды с параметрами можете ознакомиться на замечательном ресурсе для разработчиков WordPress, понимающих русский язык, WP-Kama.

Я бы хотел остановиться на следующем вопросе: а как ограничить доступ к определенным фрагментам страницы. Не банальным Javascript, CSS

.secret-block{ display:none; }

Содержимое которого будет все равно видно при получении исходного кода страницы CTRL + U.

А скрыть именно на сервере, в коде PHP.

Здесь нам поможет шорткод. Только составной, как HTML тэг. Открывающий и закрывающий. А между ними можно расположить скрываемое содержимое.

Откроем снова нашу страницу на редакцию и напишем:

для залогиненых

Далее в functions.php напишем:

add_shortcode( 'sec_content', 'secret_content' );
 
function secret_content( $atts, $content = null ) {
 	if( is_user_logged_in() ) 	return $content; //если залогинен, видишь ограниченный контент
 	$args = array(
	'echo'           => false, // форму не выводим !!!
	'redirect'       => site_url( $_SERVER['REQUEST_URI'] ), 
	'form_id'        => 'loginform',
	'label_username' => __( 'Username' ),
	'label_password' => __( 'Password' ),
	'label_remember' => __( 'Remember Me' ),
	'label_log_in'   => __( 'Log In' ),
	'id_username'    => 'user_login',
	'id_password'    => 'user_pass',
	'id_remember'    => 'rememberme',
	'id_submit'      => 'wp-submit',
	'remember'       => true,
	'value_username' => NULL,
	'value_remember' => false 
);
 return wp_login_form( $args ); если не залогинен - вот форма логина
}

Посмотрим на результат

logged-in-only-result

Запустим другой или тот же браузер в режиме Инкогнито, и посетим нашу страницу:

wordpress-login-form

Обратите внимание, выделенные строки указывающие на границу нашего шорткода на месте, и только содержимое в них меняется в зависимости от статуса пользователя.

Как вы догадались, такой способ ограничения доступа можно усложнить проверкой роли пользователя.

Но в таком способе есть один ньюанс…

Ограничить доступ к шоркодам других плагинов

К примеру я не хочу, чтобы незалогиненый(  или пользователь с ограниченной ролью ) видел какие либо новости, выведенные шорткодом плагина PostGrid, или форму ContactForm7.

Код который я описал выше имеет недостаток. А именно

add_shortcode( 'sec_content', 'secret_content' );
 
function secret_content( $atts, $content = null ) {
 	if( is_user_logged_in() ) 	return $content; //если залогинен, видишь ограниченный контент
...................................

Если мы между нашими [sec_content] и [/sec_content] поместим сторонний шорткод например

, то и результат будет

contact form7 не работает

Функция обработчик вернет в строке return $content; шорткод просто как обычный текст. Как-будто плагин ContactForm7 деактивирован или удален.

Исправим это

add_shortcode( 'sec_content', 'secret_content' );
 
function secret_content( $atts, $content = null ) {
 	if( is_user_logged_in() ) 	return do_shortcode( $content ); //шорткод контакт формы распознается
...................................

И теперь, результат будет именно тот, какой нам нужен.

do_shortcode()

Спасибо за внимание!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *