Ограничение видимости сообщений в WordPress через имена пользователей

Самый простой способ заставить эту систему работать, чтобы получатели информации “подписчиков” (так как они не должны быть в состоянии разместить) и распространителей информации “авторов” (так как они должны иметь возможность только для необходимости изменить свои собственные сообщения). Эта система устраняет несколько головных болей для владельца веб-сайта, управляя, кто имеет доступ к конкретнымдолжностям. Имя пользователя будет использоваться для определения того, кому разрешено просматривать определенные публикации, поскольку оно является уникальным и, по большей части, постоянным.

Основы

Что вам нужно?

  • WordPress 3.1 или позже
  • Члены различных ролей
  • Возможность изменять файлы вашей темы
  • Основные знания PHP и MyS’L

Что такое имя пользователя?

Как правило, имя пользователя является средством идентификации и проверки пользователя. Это не единственный способ идентифицировать пользователя, но запоминать имя пользователя проще для человека, вскакивающего в систему, чем запоминать случайный идентификатор пользователя. Имя пользователя может быть уникальным для человека, в отличие от имени человека или адреса электронной почты (члены семьи могут иметь одно и то же имя или даже тот же адрес электронной почты). Эта простота использования и уникальность, почему имена пользователей используются на большинстве веб-сайтов, которые требуют, чтобы люди зарегистрироваться для того, чтобы получить доступ к веб-сайту или некоторые из его функций.

Дальнейшее чтение на SmashingMag:

Для WordPress имя пользователя является средством идентификации пользователя. В сочетании с паролем, имя пользователя позволяет кому-то получить доступ к их профилю и, в зависимости от их разрешений в WordPress, доступ к административным страницам веб-сайта. Имя пользователя может быть использовано для многих функций в эксплуатации и управлении веб-сайтом, таких как карма, престиж, роли пользователя и изгнание.

Имя пользователя WordPress является уникальным и невозможным для среднего пользователя, чтобы изменить. Таким образом, система является потенциально надежным средством идентификации лиц. Эта надежность важна для системы, в которой сообщение должно быть видно лишь нескольким людям. Разрешения на публикацию не должны изменяться только потому, что кто-то изменил свое имя или адрес электронной почты.

Screenshot of a WordPress single user page
Страница пользователя в установке WordPress. Обратите внимание, что “Имена пользователей не могут быть изменены”.

Настройка задней части

Для того, чтобы автор мог установить разрешения для видимости, метод выбора пользователей должен быть настроен на странице редактирования публикаций. Мы могли бы достичь этого одним из нескольких методов, один из самых простых и эффективных из которых заключается в создании мета-бокса (или виджета) на странице редактирования поста, что позволяет автору добавлять пользовательскую информацию, как того требует тема или плагин. Эта информация позволяет нам рассказать тему, какие члены должны иметь права просмотра конкретных сообщений.

Базовая пользовательская мета-коробка

Статья Джастина Тэдлока“Как создать пользовательские почтовые метакоробки в WordPress” объясняет, как создать мета-коробки, и мы будем повторно использовать этот код здесь.

Давайте предположим, что мы имеем дело с веб-сайт для музыкальной школы под названием “Smashing Magazine’s Fancy Flautists”. Мы будем использовать имя smashing_flautist_access в коде для задней части, чтобы отличить его от других пользовательских функций. Код Джастина является отличной отправной точкой для этого проекта, но он нуждается в небольшой настройке для нашей цели. Поместите следующий код в тему functions.php и измените различные метки в соответствии с вашим проектом.

/* Fire our meta box setup function on the post editor screen. */
add_action( 'load-post.php', 'smashing_post_meta_boxes_setup' );
add_action( 'load-post-new.php', 'smashing_post_meta_boxes_setup' );

/* Meta box setup function. */
function smashing_post_meta_boxes_setup() {

   /* Add meta boxes on the 'add_meta_boxes' hook. */
   add_action( 'add_meta_boxes', 'smashing_add_post_meta_boxes' );

   /* Save post meta on the 'save_post' hook. */
   add_action( 'save_post', 'smashing_flautist_access_save_meta', 10, 2 );
}

/* Create one or more meta boxes to be displayed on the post editor screen. */
function smashing_add_post_meta_boxes() {

   add_meta_box(
      'smashing-flautist-access',         // Unique ID
      esc_html__( 'Post Viewing Permission', 'smashing_flautist' ),     // Title
      'smashing_flautist_access_meta_box',      // Callback function
      'post',              // Admin page (or post type)
      'normal',               // Context
      'default'               // Priority
   );
}

/* Display the post meta box. */
function smashing_flautist_access_meta_box( $object, $box ) { ?>

   <?php wp_nonce_field( basename( __FILE__ ), 'smashing_flautist_access_nonce' ); ?>

   <p>
      <label for="smashing-flautist-access"><?php _e( "Enter the username of the subscriber that you want to view this content.", 'smashing_flautist' ); ?></label>
      <br />
      <input class="widefat" type="text" name="smashing-flautist-access" id="smashing-flautist-access" value="<?php echo esc_attr( get_post_meta( $object->ID, 'smashing_flautist_access', true ) ); ?>" size="30" />
   </p>
<?php }

С кодом Джастина, измененным для этого проекта, мы должны иметь пользовательский мета-бокс, который выглядит следующим образом:

Screenshot of a basic meta box
Основной мета-бокс, расположенный под окном редактирования поста.

Добавление простоты выбора

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

<table class="smashing-flautist-access">
<tr align="left">
<th>Username</th>
<th>    </th>
<th>Visiblity</th>
<th>    </th>
<th>Name</th>
</tr>
<?php
global $post;
   $users = get_users('role=subscriber');
   foreach ($users as $user) {
         $user_info = get_userdata( $user->ID );
         if(get_post_meta( $object->ID, 'smashing_flautist_access', true ) == $user->user_login) $ifchecked = 'checked="checked" ';
         echo "<tr>";
         echo "<td>$user->user_login</td><td>    </td>";
         echo "<td align="center"><input type="radio" name="smashing-flautist-access" id="smashing-flautist-access" value="$user->user_login" " . $ifchecked ."/></td><td>    </td>";
         echo "<td>$user_info->last_name, $user_info->first_name</td><td>    </td>";
         echo "</tr>";
         unset($ifchecked);

   } ?></table>

Если все идет хорошо, вы должны в конечном итоге с окном под почтовый редактор, который выглядит как изображение ниже. Форма, содержащая радио кнопки получает список пользователей, которые перечислены в качестве подписчиков и делает выбор студента с разрешениями просмотра, все без автора поста того, чтобы помнить какие-либо имена пользователей.

Screenshot of a meta box with user information
Мета-поле, содержащее метод выбора конкретного имени и информации каждого пользователя.

Сохранение списка

Теперь, когда мы создали список, который делает его легким для авторов, чтобы выбрать, какие члены они хотят иметь возможность просматривать конкретные должности, мы должны создать систему, чтобы добавить список в wordPress’ MyS’L базы данных, чтобы мы могли получить его позже. Нам также нужен способ сказать WordPress, чтобы обновить этот список имен пользователей в случае, если автор решит позже добавить или удалить кого-то из списка отдельных пост авторизованных зрителей. Код, предоставленный Джастином, отлично работает; поместите свой код ниже в вашей functions.php теме, сразу после функции, которая устанавливает пользовательские мета-поле.

/* Save post meta on the 'save_post' hook. */
add_action( 'save_post', 'smashing_flautist_access_save_meta', 10, 2 );

/* Save the meta box's post metadata. */
function smashing_flautist_access_save_meta( $post_id, $post ) {

   /* Make all $wpdb references within this function refer to this variable */
   global $wpdb;

   /* Verify the nonce before proceeding. */
   if ( !isset( $_POST['smashing_flautist_access_nonce'] ) || !wp_verify_nonce( $_POST['smashing_flautist_access_nonce'], basename( __FILE__ ) ) )
      return $post_id;

   /* Get the post type object. */
   $post_type = get_post_type_object( $post->post_type );

   /* Check if the current user has permission to edit the post. */
   if ( !current_user_can( $post_type->cap->edit_post, $post_id ) )
      return $post_id;

   /* Get the posted data and sanitize it for use as an HTML class. */
   $new_meta_value = ( isset( $_POST['smashing-flautist-access'] ) ? sanitize_html_class( $_POST['smashing-flautist-access'] ) : ’ );

   /* Get the meta key. */
   $meta_key = 'smashing_flautist_access';

   /* Get the meta value of the custom field key. */
   $meta_value = get_post_meta( $post_id, $meta_key, true );

   /* If a new meta value was added and there was no previous value, add it. */
   if ( $new_meta_value && ’ == $meta_value )
      {
      add_post_meta( $post_id, $meta_key, $new_meta_value, true );
      $wpdb->query($wpdb->prepare("UPDATE $wpdb->posts SET post_status = 'private' WHERE ID = ".$post_id." AND post_type ='post'"));
      }
   /* If the new meta value does not match the old value, update it. */
   elseif ( $new_meta_value && $new_meta_value != $meta_value )
      {
      update_post_meta( $post_id, $meta_key, $new_meta_value );
      $wpdb->query($wpdb->prepare("UPDATE $wpdb->posts SET post_status = 'private' WHERE ID = ".$post_id." AND post_type ='post'"));
      }
   /* If there is no new meta value but an old value exists, delete it. */
   elseif ( ’ == $new_meta_value && $meta_value )
      {
      delete_post_meta( $post_id, $meta_key, $meta_value );
      $wpdb->query($wpdb->prepare("UPDATE $wpdb->posts SET post_status = 'public' WHERE ID = ".$post_id." AND post_type ='post'"));
      }
}

Три запроса MyS’L используются для предотвращения несанкционированного просмотра несанкционированными сообщениями и сокрытия сообщений от RSS-каналов. Первый запрос выполняется только тогда, когда новые данные заполняются ранее пустым пользовательским полем, в то время как второй запрос выполняется только при изменении данных в пользовательском поле. Третий запрос выполняется только в том случае, если пользовательское поле опустело, и он возвращает видимость публикации в “Общественное”. Все три из них защищены от атак на впрыски с помощью с $wpdb->prepare() помощью для проверки данных, внесенных в поле формы имени пользователя.

Если вам не нравится, что WordPress предшествует название поста со словом “Частные”, а затем добавить следующий код в файл вашей functions.php темы. Эта пользовательская функция называется, когда ваша тема будет отображать название поста; он находит любой экземпляр слов “Защищенный” или “Частный” в начале заголовка и удаляет их. В ядре программирования WordPress функция get_the_title() добавляет эти слова, если видимость поста ограничена, и человек, просматривая не является администратором. Что следующий код делает, это отправить сообщение к действию, что get_the_title() крючки в, сказав ему, чтобы удалить термины “Защищенные:” и “Частные: ” из названия. Таким образом, вы можете установить название должности, чтобы начать с любого срока, и название не будет изменено; этот код влияет только на способность WordPress добавлять в свой заголовок.

function smashing_title_trim($title) {
   $title = attribute_escape($title);
   $needles = array(__('Protected: '),__('Private: '));
   $title = str_replace($needles,’,$title);
   return $title;
}
add_filter('protected_title_format','smashing_title_trim');
add_filter('private_title_format','smashing_title_trim');

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

$subRole = get_role( 'subscriber' );
$subRole->add_cap( 'read_private_posts' );

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

$subRole->add_cap( 'read_private_pages' );

Настройка передней части

Теперь, когда у нас есть способ добавить членов в список людей, которые могут просматривать конкретный пост, мы должны изменить нашу тему, чтобы использовать эти данные, и на самом деле контролировать видимость каждого поста на основе этого списка. Во-первых, нам нужен способ получить имя пользователя человека, который может просматривать публикацию. Во-вторых, мы сопоставим имя пользователя с разрешениями просмотра с пользователем, который в настоящее время входит в систему. Наконец, мы хотели бы сделать тему отображения либо сообщение в цикле или сообщение об ошибке (или, возможно, ничего вообще).

Поместите этот код сразу после начала цикла. Он идет в single.php , и если вы будете отображать сообщения на главной category.php index.php странице.

<?php
/* Get the post's acceptable viewer. */
      $flautist_access = get_post_meta($post->ID, 'smashing_flautist_access', true );
/* Get the post's current viewer, if he or she is logged in. */
      if(is_user_logged_in()) {$current_flautist = $current_user->user_login;}
/* See if the acceptable viewer and the current viewer are the same */
      if($flautist_access == $current_flautist || current_user_can('author') || current_user_can('editor') || current_user_can('administrator'))
         {echo ’; ?>

Поместите этот код непосредственно перед окончанием цикла. Здесь вы можете показать сообщение об ошибке, сообщающее пользователю, что он может не просматривать этот пост. Или вы можете оставить этот код, как это, чтобы сделать вид, как будто текущий посетитель не хватает ничего.

<?php } else { echo ’; } ?>

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

What the public sees when trying to view a protected post
Если человек не входит в систему и пытается просмотреть ограниченное сообщение, он получит сообщение об ошибке.

What an unauthorized user sees when trying to view a protected post
Если пользователь входит в систему, но не имеет права просматривать ограниченное сообщение, он не увидит либо ничего, либо сообщение об ошибке, специфичное для пользователей.

What an authorized user sees when trying to view a protected post
Если участник входит в систему и уполномочен просматривать защищенную публикацию, то он будет видеть саму публикацию.

Заключение

Возможность контролировать, кто может просматривать отдельные сообщения является полезной функцией с широким спектром приложений. Стороннее программное обеспечение может сделать это, но WordPress широко поддерживается и документируется, что означает, что любые дыры в безопасности, которые могут позволить неавторизованным пользователям просматривать ограниченные сообщения, будут закрыты в будущем обновлении. Кроме того, это позволяет запускать фактический блог рядом с должности с ограниченной видимостью. Эта система может быть использована администраторами для распространения персонализированного контента, профессионалами для отправки файлов клиентам или блоггерами для ограничения видимости определенных сообщений определенным членам.

Предоставление автору возможности контролировать, кто может просматривать их сообщения, может помочь ему адаптировать содержимое блога к потребностям или вкусам некоторых пользователей. В конечном счете, вам придется учитывать цель и содержание вашего сайта при принятии решения о том, следует ли использовать этот метод. Это не для всех, но это соответствует потребностям владельцев небольших веб-сайтов, которые хотят доставить определенный контент для определенных людей.

Ресурсы

Источник: smashingmagazine.com

Великолепный Журнал

Великолепный, сокрушительный, разящий (см. перевод smashing) независимый журнал о веб-разработке. Основан в 2006 году в Германии. Имеет няшный дизайн и кучу крутых авторов, которых читают 2 млн человек в месяц.

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

%d такие блоггеры, как: