Останнім часом багато сайтів, що публікують новини та оригінальні статті, застосовують фріміум-модель доступу, відповідно до якої незареєстровані відвідувачі сайту обмежені певною кількістю публікацій, які вони можуть прочитати за певний час, зареєстровані користувачі мають необмежений доступ до публікацій:

У цій статті ми розглянемо, як зробити простий плагін, який дасть адміністраторам WordPress-сайту можливість обмежити доступ незареєстрованих користувачів до визначених статтями або частинами статей.

Код плагіна

При написанні плагіна насамперед потрібно внести в заголовок (блок коментарів всередині PHP-тега) такі дані про плагіні, як його назва, опис, авторство та URL сторінки з інформацією. Ось приклад заголовка плагіна:

Плагін також повинен мати сторінку налаштувань, містить поле форми. В це поле ми будемо вводити ідентифікатори статей чи сторінок, доступ до яких потрібно обмежити.

Код, наведений нижче, додасть в меню «Налаштування» (Settings) підменю під назвою «Обмежити доступ незареєстрованим користувачам» (Restrict content to registered users):

add_action(‘admin_menu’, ‘rcru_plugin_menu’);
// Adding Submenu settings to
function rcru_plugin_menu() {
add_options_page(
‘Restrict content To Registered User’,
‘Restrict content To Registered User’,
‘manage_options’,
‘rcru-restrict-content-user’,
‘rcru_content_user_settings’
);
}

П’ятий аргумент, rcru_content_user_settings, що передається функції add_options_page() – це функція, яка виводить вміст сторінки налаштувань плагіна. Її код:

function rcru_content_user_settings() {
echo’
‘;
screen_icon();
echo ‘

Restrict content To Registered User

‘;
echo «;
do_settings_sections(‘rcru-restrict-content-user’);
settings_fields(‘rcru_settings_group’);
submit_button();
}

Форма поки що не має поля для вводу і не може зберегти дані у базі, так як нам ще тільки належить реалізувати функцію Settings API WordPress.

Функція plugin_option() визначає секцію і поле для налаштувань:

// plugin field and sections
function plugin_option() {
add_settings_section(
‘rcru_settings_section’,
‘Plugin Options’,
null,
‘rcru-restrict-content-user
‘);
add_settings_field(
‘post-page-id’,
‘Post and page ID to be restricted.’,
‘post_page_field’,
‘rcru-restrict-content-user’,
‘rcru_settings_section’
);
// register settings
register_setting(‘rcru_settings_group’, ‘rcru_post-id-option’);

Аналогічно попередньому прикладу, третій аргумент, що передається функції
add_settings_field(), – post_page_field – функція, що виводить поля форми :

function post_page_field() {
echo «Enter Post or Page ID comma separated by.
«;
echo «;
}

Нарешті, функція plugin_option() прив’язується до admin_init, щоб наша форма почала працювати:

add_action(‘admin_init’, ‘plugin_option’);

Ми розібралися зі сторінкою налаштування плагіна, але дані, які ми зберігаємо на цьому етапі, поки ніяк не використовуються.

Тепер нам потрібно написати функцію restrict_content_register_user(), яка буде витягувати з бази даних ідентифікаторів статей чи сторінок, які були збережені на попередньому етапі.

Ці дані будуть використовуватися для того, щоб переконатися в тому, що користувач зареєстрований, інакше буде виводитися попередження з пропозицією зареєструватися.

Нарешті, ця функція буде прив’язана до фільтру content, щоб реагувати на зміну сторінки (статті):

function restrict_content_register_user($content) {
global $post;
$post_database = get_option(‘rcru_post-id-option’);
$post_database = explode(‘,’, $post_database);
$current_user = wp_get_current_user();
/* If there is no content, return. */
if (is_null($content))
return $content;
foreach ($post_database as $posts) {
$posts = trim($posts);
if ($posts == $post -> ID) {
if (username_exists($current_user -> user_login)) {
/* Return the private content. */
return $content;
} else {
/* Return an alternate message. */
return’
You must be a registered user to read this content.

Register Here
‘;
}
}
}
return $content;
}
add_filter(‘the_content’, ‘restrict_content_register_user’);

Ми закінчили з реалізацією основного функціоналу нашого плагіна: через сторінку налаштувань. Тепер залишилося додати метабокс і шорткод.

Додавання метабокса

Додавання панелі-метабокса на сторінки редагування контенту дозволить обмежувати доступ до контенту прямо при його створенні або редагуванні, без необхідності звертатися до сторінки налаштувань. Для цього функцію rcru_mb_create(), яка буде створювати наш метабокс, потрібно прив’язати до події add_meta_boxes:

function rcru_mb_create() {
/**
* @array $screens Write screen on which to show the meta box
* @values post page, dashboard, link, attachment, custom_post_type
*/
$screens = array(
‘post’,
‘page’
);
foreach ($screens as $screen) {
add_meta_box(‘rcru-meta’,
‘Restrict Post / Page’,
‘rcru_mb_function’,
$screen,
‘normal’,
‘high’);
}
}
add_action(‘add_meta_boxes’, ‘rcru_mb_create’);

Функція rcru_mn_function() містить чекбокс і опис метабокса:

function rcru_mb_function($post) {
//retrieve the metadata values if they exist
$restrict_post = get_post_meta($post -> ID, ‘_rcru_restrict_content’, true);
// Add an nonce field so we can check for it later when validating
wp_nonce_field(‘rcru_inner_custom_box’, ‘rcru_inner_custom_box_nonce’);
echo’

Restrict content? Checking this setting will restrict this post to only registered users.

‘;
}

Функція rcru_mb_save_data() зберігає значення, задані в метабоксе, в базу даних згідно налаштувань безпеки:

function rcru_mb_save_data($post_id) {
/*
* We need to verify this came from the our screen and with proper authorization,
* because save_post can be triggered at other times.
*/
// Check if our nonce is set.
if (!isset($_POST[‘rcru_inner_custom_box_nonce’]))
return $post_id;
$nonce = $_POST[‘rcru_inner_custom_box_nonce’];
// Verify that the nonce is valid.
if (!wp_verify_nonce($nonce, ‘rcru_inner_custom_box’))
return $post_id;
// If this is an autosave, our form has not been submitted, so we don’t want to do anything.
if (defined(‘DOING_AUTOSAVE’) && DOING_AUTOSAVE)
return $post_id;
// Check the user’s permissions.
if (‘page’ == $_POST[‘post_type’]) {
if (!current_user_can(‘edit_page’, $post_id))
return $post_id;
} else {
if (!current_user_can(‘edit_post’, $post_id))
return $post_id;
}
/* OK, its safe for us to save the data now. */
// If old entries exist, retrieve them
$old_restrict_post = get_post_meta($post_id, ‘_rcru_restrict_content’, true);
// Sanitize user input.
$restrict_post = sanitize_text_field($_POST[‘rcru_restrict_content’]);
// Update the meta field in the database.
update_post_meta($post_id, ‘_rcru_restrict_content’, $restrict_post, $old_restrict_post);
}
//hook to save the meta data box
add_action(‘save_post’, ‘rcru_mb_save_data’);

Функція restrict_content_metabox() перевірить статтю або сторінку на вже наявні обмеження, перевірить реєстрацію користувача та при необхідності видасть незареєстрованим користувачам попередження:

function restrict_content_metabox($content) {
global $post;
//retrieve the metadata values if they exist
$post_restricted = get_post_meta($post -> ID, ‘_rcru_restrict_content’, true);
// if the post or page has restriction and the user isn’t registered
// display the error notice
if ($post_restricted == 1 && (!username_exists(wp_get_current_user()->user_login)) ) {
return’
You must be a registered user to read this content.

Register Here
‘;
}
return $content;
}
// hook the function to the post content to effect the change
add_filter(‘the_content’, ‘restrict_content_metabox’);

Додавання шорткода

За допомогою шорткода можна обмежити доступ до частини статті.

Функція rcru_user_shortcodes() містить виклик add_shortcode(), який здійснює прив’язку нашої Callback-функції до шорткод-тегу [rcru-private]. Callback-функція передається у другому параметрі add_shortcode(), як в попередніх прикладах:

/* Function for registering the shortcode. */
function rcru_user_shortcodes() {
/* Adds the [rcru-private] shortcode. */
add_shortcode(‘rcru-private’, ‘rcru_shortcode’);
}

Потім ця функція реєструється в події init, щоб WordPress пустив її у справу:

/* Register shortcodes in ‘init’. */
add_action(‘init’, ‘rcru_user_shortcodes’);
Нарешті, наш callback – rcru_shortcode() – виводить результат роботи шорткода.
/* Function for handling shortcode output. */
function rcru_shortcode($attr, $content = «) {
/* Check if the current user has the ‘read_private_content’ capability. */
$current_reader = wp_get_current_user();
if (!username_exists($current_reader -> user_login)) {
/* Return an alternate message. */
return’
You must be a registered user to read this content.

Register Here
‘;
}
}

Робота плагіна

Так виглядає сторінка налаштувань плагіна з полем, яке можна ввести ідентифікатори статей чи сторінок, розділені комами:

Як обмежити доступ до контенту незареєстрованим користувачам

Щоб дізнатися ідентифікатор статті або сторінки, перейдіть на сторінку редагування цікавить вас контенту (наприклад, з використанням TinyMCE) і зверніть увагу на поточний адресу сторінки. Цифри, які відображаються в адресі після «?post=», і є ідентифікатор статті (сторінки).

Наприклад, для адреси «http://wordpress.dev/wp-admin/post.php?post=88&action=edit» ідентифікатор статті або сторінки – 88.

Метабокс на сторінці редагування вмісту

Переглянути сторінки або статті може бути обмежено, якщо відзначити чекбокс «Обмежити перегляд» («Restrict content») в метабоксе, який додається плагіном:

Як обмежити доступ до контенту незареєстрованим користувачам

Шорткод

Помістивши в текст статті шорткод плагіна, можна обмежити для перегляду незареєстрованими користувачами не всю статтю, а лише певну її частину.

[rcru-private]Частину запису або сторінки, яка доступна тільки зареєстрованим користувачам.[/rcru-private]

Весь код, використаний у статті, можна знайти тут. Удачі!

Переклад статті «How To Restrict Content To Registered Users [WP Plugin Tutorial]» був підготовлений дружною командою проекту Сайтостроение від А до Я.