Intereting Posts
Выдвиньте дополнительные пользовательские поля в Связанный плагин post Почему мой шаблон подкатегории показывает неправильные записи Бесплатная доставка только для определенных товаров – или получить местный пикап в качестве опции, если элемент установлен на виртуальный Шаблон страницы, который использует лайтбокс для отображения изображений Показать последние сообщения x из всех категорий в Custom Post Type / Taxonomy Как изменить текст автоматических электронных писем, например, после смены пароля? (Немецкая локализация) Изображение не отображается в переопределенном адресе woocommerce Номер месяца месяца обмена сообщениями Как загрузить все страницы на одну страницу с помощью своих шаблонов Проверьте, успешно ли получен фид разрешить только регистрацию нижнего регистра Проблема с обновлением плагина Запрашиваются ли запросы get_bloginfo для кеширования или их кеширование? WP_Filesystem в пользовательском настройке управления Показать DISQUS на главной странице

Как показать сообщение категории конкретному зарегистрированному пользователю

Я работаю в частном блоге, и я хотел бы знать, можно ли это сделать с любым другим плагином или любым другим способом: Допустим, у нас есть 3 категории: CA, CB и CC и 3 пользователя, UA, UB и UC , все они могут публиковать, но только в определенной категории, UA в CA и так далее. Теперь, когда один из них регистрируется в блоге, это будет отображать только категорию сообщений, которые ему разрешили для этого пользователя. Любое предложение?

PD: Разрешить плагины категорий должен был это делать, но он вообще не работает в wp 3.4.2, и он не обновлялся давно.

Solutions Collecting From Web of "Как показать сообщение категории конкретному зарегистрированному пользователю"

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

Перед тем, как мы начнем, реальное мясо находится на четвертом шаге (путь внизу). Пропустите это, если вам не нужен способ связать категории с пользователями.

Итак, в первую очередь, давайте обернем все в классе. Наш класс со статическим методом init который добавляет действия, а также несколько констант класса.

 <?php WPSE65959_User_One_Cat::init(); class WPSE65959_User_One_Cat { /** * Nonce name. * */ const NONCE = 'wpse65959_nonce'; /** * The user meta key we'll use * */ const KEY = 'wpse65959_category'; /** * The taxonomy we'll use. Just 'category' in this case. * */ const TAX = 'category'; public static function init() { // add actions here } } 

Шаг первый: добавьте поле в страницу редактирования пользователя

Мы подключимся к edit_user_profile который будет отображаться только при редактировании других профилей пользователей. Вы никогда не увидите его при редактировании собственного профиля, но вы увидите его при редактировании других пользователей. Наше поле будет захватывать все текущие категории и помещать их в раскрывающееся меню. Мы также выведем поле nonce, которое мы проверим позже при сохранении пользователя.

 <?php class WPSE65959_User_One_Cat { // snip snip public static function init() { add_action( 'edit_user_profile', array(__CLASS__, 'show_field') ); } public static function show_field($user) { $terms = get_terms(self::TAX, array('hide_empty' => false)); wp_nonce_field(self::NONCE . $user->ID, self::NONCE, false); echo '<h4>'; esc_html_e('User Category', 'wpse65959'); echo '</h4>'; printf('<select name="%1$s" id="%1$s">', esc_attr(self::KEY)); echo '<option value="">----</option>'; foreach($terms as $t) { printf( '<option value="%1$s" %2$s>%3$s</option>', esc_attr($t->term_id), selected(get_user_meta($user->ID, self::KEY, true), $t->term_id, false), esc_html($t->name) ); } echo '</select>'; } } 

Другая сторона этого поля заключается в том, что нам нужно его сохранить. Сделайте это, подключитесь к edit_user_profile_update . Функция проверит nonce и убедитесь, что у текущего пользователя есть разрешение на редактирование пользователя.

 <?php class WPSE65959_User_One_Cat { // snip snip public static function init() { // snip snip add_action( 'edit_user_profile_update', array(__CLASS__, 'save') ); } public static function save($user_id) { if( !isset($_POST[self::NONCE]) || !wp_verify_nonce($_POST[self::NONCE], self::NONCE . $user_id) ) return; if(!current_user_can('edit_user', $user_id)) return; if(isset($_POST[self::KEY]) && $_POST[self::KEY]) update_user_meta($user_id, self::KEY, absint($_POST[self::KEY])); else delete_user_meta($user_id, self::KEY); } } 

Теперь у нас есть способ связать пользователя с категорией.

Шаг второй: удалите мета-поле категории

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

 <?php class WPSE65959_User_One_Cat { // snip snip public static function init() { // snip snip add_action( 'add_meta_boxes_post', array(__CLASS__, 'remove_metabox') ); } public static function remove_metabox() { if(current_user_can('manage_options')) return; // this is an admin. Admins can do what they want. remove_meta_box( 'categorydiv', 'post', 'side' ); } } 

Шаг третий: измените категорию по умолчанию для не-админов

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

 <?php class WPSE65959_User_One_Cat { // snip snip public static function init() { // snip snip add_filter( 'pre_option_default_category', array(__CLASS__, 'default_cat') ); } public static function default_cat($false) { if(current_user_can('manage_options')) return $false; // don't change default category for admins if($cat = get_user_meta(wp_get_current_user()->ID, self::KEY, true)) return $cat; // we have a default category for this user. return $false; // no default category, return the original value } } 

Шаг четвертый: измените запрос

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

Подцепите request . Проверьте, является ли пользователь администратором, и измените запрос, чтобы включить только свою категорию, если нет.

 <?php class WPSE65959_User_One_Cat { // snip snip public static function init() { // snip snip add_filter( 'request', array(__CLASS__, 'request') ); } public static function request($vars) { if(current_user_can('manage_options')) return $vars; // admins can view whatever // if the user has a default category, make sure they only see that category if($cat = get_user_meta(wp_get_current_user()->ID, self::KEY, true)) $vars['cat'] = $cat; // handle not having a category associated with them here return $vars; } } 

Все вышеперечисленное как плагин

На самом деле это довольно легко с функциями WP на борту и « Иерархией шаблонов» .

Вы можете – в зависимости от ваших потребностей – нацеливать single.php и category-*.php .

Инструментарий: Необходимые данные

Во-первых, нам нужно wp_get_current_user() . Затем мы можем выполнить несколько проверок, в зависимости от того, что вы хотите проверить. Для получения дополнительной информации выполните var_dump( wp_get_current_user() ); и сравнить своих пользователей, чтобы узнать, какие данные доступны и что вы можете проверить с надежностью. Совет. Идентификатор пользователя и user_login всегда требуются и не могут быть изменены.

Эффект блокировки и перенаправление

Затем вам нужно просто выполнить проверку поверх вашего шаблона, прямо под вызовом get_header(); например.

 // redirect all users, except the one with the ID of 5 to the index.php page if ( 5 != wp_get_current_user()->ID ) { wp_redirect( home_url( '/' ) ); exit; } 

Вы также можете перенаправить его на свою страницу автора и перечислить все его разрешенные категории.

Изменить запрос

Другим вариантом было бы перехват запроса, прежде чем сообщения будут извлечены из БД с проверкой на идентификатор пользователя – см. Подробности в других вопросах, используя posts_clauses -filter .

Различные шаблоны для разных пользователей

Вы также можете просто перехватить hook_redirect, как описано в этом ответе .