Shortcode в WordPress — это удобный способ добавлять динамический контент в записи и страницы. Однако в стандартном виде shortcode доступен всем пользователям и для всех записей. В этой статье мы разберёмся, как создать владельческий shortcode, который будет выводить содержимое или функциональность только для владельца записи или определённой роли. Это полезно для сайтов с закрытым контентом или персонализированными данными.
Что такое владельческий shortcode и зачем он нужен
Владельческий shortcode — это shortcode, который проверяет, является ли текущий пользователь владельцем конкретной записи или обладает нужными правами, и только тогда отображает контент. Например, можно показывать дополнительные данные, редактировать информацию или закрывать часть контента для других посетителей.
Основные сценарии использования:
- Вывод персональной информации только автору публикации
- Показ скрытого контента для подписчиков или определённых ролей
- Добавление функционала редактирования записи прямо на странице
Реализация такой логики требует проверки ID пользователя и ID автора записи, а также правильного использования хуков WordPress.
Создание простого владельческого shortcode
Начнём с базового примера, который покажет контент внутри shortcode только если текущий пользователь — автор текущей записи. Для этого зарегистрируем shortcode и реализуем проверку:
function wpma_owner_shortcode($atts, $content = null) {
if (!is_user_logged_in()) {
return 'Пожалуйста, авторизуйтесь для просмотра этого содержимого.';
}
global $post;
$current_user_id = get_current_user_id();
if ($post->post_author == $current_user_id) {
return do_shortcode($content);
}
return 'Это содержимое доступно только владельцу записи.';
}
add_shortcode('owner_only', 'wpma_owner_shortcode');
Используйте так в записи или странице:
[owner_only]Этот текст увидит только автор записи.[/owner_only]
Если пользователь не авторизован или не автор записи, он увидит соответствующее сообщение.
Расширение функционала: проверка ролей и условное содержание
Часто нужно не просто проверять автора, а учитывать роли пользователей. Например, разрешить просмотр владельцу и редакторам.
function wpma_owner_role_shortcode($atts, $content = null) {
if (!is_user_logged_in()) {
return 'Пожалуйста, авторизуйтесь для просмотра этого содержимого.';
}
global $post;
$current_user_id = get_current_user_id();
$user = wp_get_current_user();
$allowed_roles = ['editor', 'administrator'];
if ($post->post_author == $current_user_id || array_intersect($allowed_roles, $user->roles)) {
return do_shortcode($content);
}
return 'Доступ ограничен: вы не автор записи и не обладаете нужными правами.';
}
add_shortcode('owner_or_role', 'wpma_owner_role_shortcode');
Такой shortcode позволит гибко настраивать доступ к контенту.
Интеграция с плагинами WPSHOP
Если на вашем сайте установлен плагин WPRemark для управления отзывами, можно использовать владельческий shortcode для отображения отзывов только автору товара или записи.
Пример использования:
[owner_only][wpremark_reviews post_id="123"][/owner_only]
Так вы скроете отзывы от посторонних и покажете их только владельцу записи.
Практические советы по безопасности и производительности
При создании владельческих shortcode важно учесть следующие моменты:
- Проверяйте, что глобальный объект
$postдоступен — в некоторых контекстах он может отсутствовать. - Используйте функцию
do_shortcode()для вложенных шорткодов внутри контента. - Минимизируйте количество запросов к базе данных — лучше кешируйте данные пользователя.
- Для сложных проверок прав используйте стандартные WordPress-функции
current_user_can()иuser_can().
Примеры дополнительных функций для владельческих шорткодов
Можно создать функцию, которая возвращает true/false, проверяя владельца и роли, для повторного использования:
function wpma_is_owner_or_allowed_role($post_id) {
if (!is_user_logged_in()) {
return false;
}
$post = get_post($post_id);
if (!$post) {
return false;
}
$current_user_id = get_current_user_id();
$user = wp_get_current_user();
$allowed_roles = ['editor', 'administrator'];
if ($post->post_author == $current_user_id) {
return true;
}
if (array_intersect($allowed_roles, $user->roles)) {
return true;
}
return false;
}
Используйте её внутри шорткода:
function wpma_owner_role_shortcode_refactored($atts, $content = null) {
global $post;
if (wpma_is_owner_or_allowed_role($post->ID)) {
return do_shortcode($content);
}
return 'Доступ ограничен.';
}
add_shortcode('owner_or_role_ref', 'wpma_owner_role_shortcode_refactored');
Выводы и рекомендации
Создание владельческих shortcode — отличный способ персонализировать контент и обеспечить безопасность доступа. При этом важно тщательно продумывать логику проверки прав и тестировать на разных ролях и сценариях.
Для удобства и расширения возможностей можно использовать плагины из WPShop и адаптировать примеры под свои задачи.