Вопрос или проблема
Я создал простой плагин, который блокирует контент для пользователей, не вошедших в систему, и он работает нормально. Однако любой пользователь на сайте с несколькими авторами может использовать тот же шорткод в своем посте, чтобы заблокировать контент. Я не хочу, чтобы это происходило.
Как я могу ограничить эту функциональность только для администраторов? Этот текущий код вызывает фатальную ошибку: Фатальная ошибка: Вызов несуществующей функции wp_get_current_user()
public function check_user_role() {
if(current_user_can( 'activate_plugins' )) {
return true;
}
}
Я собирался использовать этот метод в конструкторе моего класса, чтобы определить, должна ли выполняться функция add_shortcode(). Буду признателен за любые подсказки о том, как мне следует реализовать это.
Фатальная ошибка: Вызов несуществующей функции wp_get_current_user()
Это можно исправить, объявив check_user_role
только когда WP готов, подцепившись к wp
(чтобы использовать функции и методы WordPress) или выполнив другие обходные пути.
Просто проверьте, есть ли у пользователя возможность manage_options
(или проверьте, есть ли администратор в списке ролей in_array( "administrator", $current_user->roles )
):
add_action("wp", function() {
function check_user_role() {
return current_user_can( "manage_options" ) && current_user_can( 'activate_plugins' );
}
});
Надеюсь, это поможет.
Чтобы ограничить использование шорткода только для постов, созданных администраторами, мне нужно проверить, является ли автор поста, который просматривается, администратором, как показано в коде if ( user_can( $post->post_author, 'activate_plugins' ) )
. Если нет, контент возвращается без выполнения функции do_shortcode($content)
.
Функция current_user_can()
не подходит, так как она проверяет текущего пользователя, а не автора поста.
public function check_login($atts, $content = null)
{
if (is_user_logged_in() && !is_null($content) && !is_feed())
{
return do_shortcode($content);
}
else
{
global $post;
if ($post instanceof \WP_Post) {
if ( user_can( $post->post_author, 'activate_plugins' ) ) {
return '<p>Вы должны быть зарегистрированы, чтобы просмотреть этот пост..</p>';
}
return $content;
}
}
}
Надеюсь, это поможет кому-то еще.
Ответ или решение
Чтобы ограничить использование шорткодов плагина WordPress только для администраторов, необходимо внести изменения в код вашего плагина, чтобы он проверял, имеет ли автор поста соответствующие права. Давайте рассмотрим, как это можно реализовать, избегая ошибок и эффективно контролируя доступ.
Проблема и ее решение
Ваш текущий подход, в котором проверяется возможность активировать плагины, работает, но ошибка "Call to undefined function wp_get_current_user()" указывает на то, что вы пытаетесь использовать функции WordPress, когда они еще не инициализированы. Это общая проблема, когда код выполняется до полной загрузки WordPress.
Шаг 1: Используйте правильный хук
Чтобы безопасно использовать функции WordPress, необходимо подождать, пока будет вызван нужный хук. В нашем случае мы можем использовать хук wp
для определения, имеет ли пользователь необходимые права.
Шаг 2: Проверка ролей пользователей
Поскольку current_user_can()
проверяет только текущего пользователя, вам необходимо использовать функцию user_can()
вместе с get_post()
для проверки прав автора данного поста. Это решение обеспечивает более точную проверку.
Пример кода
Вот пример кода, который вы можете использовать в вашем плагине:
add_action('wp', function() {
add_shortcode('your_shortcode', 'check_login');
});
function check_login($atts, $content = null) {
// Проверяем, залогинен ли пользователь и не является ли контент пустым
if (is_user_logged_in() && !is_null($content) && !is_feed()) {
return do_shortcode($content);
} else {
global $post;
if ($post instanceof WP_Post) {
// Проверяем, является ли автор поста администратором
if (user_can($post->post_author, 'activate_plugins')) {
return '<p>Вы должны быть залогинены для просмотра этого поста.</p>';
}
// Если автор не администратор, просто отображаем контент
return $content;
}
}
}
Объяснение кода
- Хук: Мы используем
add_action('wp', ...)
для регистрации шорткода после полной загрузки WordPress. - Функция
check_login
:- Сначала проверяем, залогинен ли пользователь и есть ли контент.
- Если пользователь не залогинен, мы извлекаем информацию о посте с помощью переменной
$post
. - Затем проверяем, имеет ли автор поста право активировать плагины с помощью функции
user_can()
. - Если он имеет соответствующее право, выводим сообщение о необходимости входа в систему. В противном случае просто отображаем контент.
Дополнительные рекомендации
- Безопасность: Убедитесь, что у вас реализованы необходимые меры безопасности, например, проверка прав доступа для всех критичных функций вашего плагина.
- SEO-оптимизация: Включите ключевые слова, такие как "WordPress", "плагины", "администраторы" и другие релевантные фразы, чтобы ваш контент был более видимым для поисковых систем.
- Документация: Обязательно документируйте изменения в коде, чтобы другие разработчики могли легко понять ваши решения.
Применяя эти изменения, вы можете обеспечить, что только администраторы на вашем многоавторском сайте смогут использовать заданный шорткод, тем самым защищая нужный контент от несанкционированного доступа.