Таксономия для пользователей WordPress

Ромчик
0

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

И, так. Для примера я буду использовать стандартную тему WordPress «Twentyfifteen». И первое, что мы сделаем это в каталог inc нашей темы поместим файл user-category-taxonomy.php, в котором и будем описывать наш функционал. И подключим наш файл в functions.php нашей темы:


require ( 'inc/user-category-taxonomy.php' );

Определим имя и ключ для нашей таксономии:


define( 'USER_CATEGORY_NAME', 'user_category');

define( 'USER_CATEGORY_META_KEY', '_user_category');

Еще раз напомню, что весь код для реализации таксономии для пользователей мы будем писать в файле user-category-taxonomy.php

Теперь зарегистрируем таксономию пользователя с помощью хука «init», который будет вызывать функцию zloykolobok_register_user_category_taxonomy и создадим эту функцию


add_action( 'init', 'zloykolobok_register_user_category_taxonomy' );

function zloykolobok_register_user_category_taxonomy() {

register_taxonomy(

USER_CATEGORY_NAME, //taxonomy name

'user', //object for which the taxonomy is created

array( //taxonomy details

'public' => true,

'labels' => array(

'name'                  => 'User Tag',

'singular_name'               => 'User Tag',

'menu_name'   => 'User Tags',

'search_items'  => 'Search User Tag',

'popular_items' => 'Popular User Tag',

'all_items'           => 'All User Tag',

'edit_item'         => 'Edit User Tag',

'update_item'   => 'Update User Tag',

'add_new_item'              => 'Add New User Tag',

'new_item_name'          => 'New User Tag Name',

),

'update_count_callback' => function() {

return; //important

}

)

);

}

О функции register_taxonomy вы можете прочитать тут

Следующим шагом нам необходимо добавить страницу в админке для управления таксономией пользователя. Для этого воспользуемся хуком «admin_menu», который вызовет функцию zloykolobok_add_user_categories_admin_page.


add_action( 'admin_menu', 'zloykolobok_add_user_categories_admin_page' );

function zloykolobok_add_user_categories_admin_page() {

$taxonomy = get_taxonomy( USER_CATEGORY_NAME );

add_users_page(

esc_attr( $taxonomy->labels->menu_name ),//page title

esc_attr( $taxonomy->labels->menu_name ),//menu title

$taxonomy->cap->manage_terms,//capability

'edit-tags.php?taxonomy=' . $taxonomy->name//menu slug

);

}

Тут мы использовали функцию get_taxonomy  и функцию add_users_page .

Теперь, если мы перейдем в админку, то увидим:

Поправим немножко ссылку с помощью фильтра «submenu_file»


add_filter( 'submenu_file', 'zloykolobok_set_user_category_submenu_active' );

function zloykolobok_set_user_category_submenu_active( $submenu_file ) {

global $parent_file;

if( 'edit-tags.php?taxonomy=' . USER_CATEGORY_NAME == $submenu_file ) {

$parent_file = 'users.php';

}

return $submenu_file;

}

Все. Теперь при переходе по ссылке мы попадем на страницу управления таксономией пользователя.

Отлично. Теперь мы можем добавить несколько тегов для теста.

Следующим шагом мы отобразим поле с тегами на странице пользователя. Но тут нюанс это поле должно отображаться только на странице автора или на странице, если оно редактируется автором или администратором.

Для этого мы будем использовать два хука «show_user_profile» и «edit_user_profile».


add_action( 'show_user_profile', 'zloykolobok_admin_user_profile_category_select' );

add_action( 'edit_user_profile', 'zloykolobok_admin_user_profile_category_select' );

function zloykolobok_admin_user_profile_category_select( $user ) {

$taxonomy = get_taxonomy( USER_CATEGORY_NAME );

if ( !user_can( $user, 'author' ) ) {

return;

}

?>

<table class="form-table">

<tr>

<th>

<label for="<?php echo USER_CATEGORY_META_KEY ?>">User Tag</label>

</th>

<td>

<?php

$user_category_terms = get_terms( array(

'taxonomy' => USER_CATEGORY_NAME,

'hide_empty' => 0

) );

$select_options = array();

foreach ( $user_category_terms as $term ) {

$select_options[$term->term_id] = $term->name;

}

$meta_values = get_user_meta( $user->ID, USER_CATEGORY_META_KEY, true );

echo zloykolobok_custom_form_select(

USER_CATEGORY_META_KEY,

$meta_values,

$select_options,

'',

array( 'multiple' =>'multiple' )

);

?>

</td>

</tr>

</table>

<?php

}

function zloykolobok_custom_form_select( $name, $value, $options, $default_var ='', $html_params = array() ) {

if( empty( $options ) ) {

$options = array( '' => '---choose---');

}

$html_params_string = '';

if( !empty( $html_params ) ) {

if ( array_key_exists( 'multiple', $html_params ) ) {

$name .= '[]';

}

foreach( $html_params as $html_params_key => $html_params_value ) {

$html_params_string .= " {$html_params_key}='{$html_params_value}'";

}

}

echo "<select name='{$name}'{$html_params_string}>";

foreach( $options as $options_value => $options_label ) {

if( ( is_array( $value ) && in_array( $options_value, $value ) )

|| $options_value == $value ) {

$selected = " selected='selected'";

} else {

$selected = '';

}

if( empty( $value ) && !empty( $default_var ) && $options_value == $default_var ) {

$selected = " selected='selected'";

}

echo "<option value='{$options_value}'{$selected}>{$options_label}</option>";

}

echo "</select>";

}

Смотрим, что получилось. Переходим в профиль пользователя.

Теперь мы должны реализовать механизм сохранения тегов. Для этого будем использовать два хука «personal_options_update» и «edit_user_profile_update»


add_action( 'personal_options_update', 'zloykolobok_admin_save_user_categories' );

add_action( 'edit_user_profile_update', 'zloykolobok_admin_save_user_categories' );

function zloykolobok_admin_save_user_categories( $user_id ) {

$tax = get_taxonomy( USER_CATEGORY_NAME );

$user = get_userdata( $user_id );

if ( !user_can( $user, 'author' ) ) {

return false;

}

$new_categories_ids = $_POST[USER_CATEGORY_META_KEY];

$user_meta = get_user_meta( $user_id, USER_CATEGORY_META_KEY, true );

$previous_categories_ids = array();

if( !empty( $user_meta ) ) {

$previous_categories_ids = (array)$user_meta;

}

if( ( current_user_can( 'administrator' ) && $_POST['role'] != 'author' ) ) {

delete_user_meta( $user_id, USER_CATEGORY_META_KEY );

zloykolobok_update_users_categories_count( $previous_categories_ids, array() );

} else {

update_user_meta( $user_id, USER_CATEGORY_META_KEY, $new_categories_ids );

zloykolobok_update_users_categories_count( $previous_categories_ids, $new_categories_ids );

}

}

function zloykolobok_update_users_categories_count( $previous_terms_ids, $new_terms_ids ) {

global $wpdb;

$terms_ids = array_unique( array_merge( (array)$previous_terms_ids, (array)$new_terms_ids ) );

if( count( $terms_ids ) < 1 ) { return; }

foreach ( $terms_ids as $term_id ) {

$count = $wpdb->get_var(

$wpdb->prepare(

"SELECT COUNT(*) FROM $wpdb->usermeta WHERE meta_key = %s AND meta_value LIKE %s",

USER_CATEGORY_META_KEY,

'%"' . $term_id . '"%'

)

);

$wpdb->update( $wpdb->term_taxonomy, array( 'count' => $count ), array( 'term_taxonomy_id' => $term_id ) );

}

}

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


function zloykolobok_show_authors_in_categories() {

$categories = get_terms(array(

'taxonomy' => USER_CATEGORY_NAME,

'hide_empty' => true

));

echo '<ul>';

foreach( $categories as $category ) {

echo '<li>';

echo $category->name;

echo " (#{$category->count})";

$args = array(

'role' => 'Author',

'meta_key'         => USER_CATEGORY_META_KEY,

'meta_value'     => '"' . $category->term_id . '"',

'meta_compare'              => 'LIKE'

);

$authors = new WP_User_Query( $args );

echo '<ul>';

foreach( $authors->results as $author ) {

echo '<li>';

echo $author->display_name;

echo '</li>';

}

echo '</ul>';

echo '</li>';

}

echo '</ul>';

}

Вот и все.

Заключение.

Мы с вами сделали добавление тегов для пользователей в административной части WordPress. После пользователям можно присваивать эти теги.

Понравилась статья? Поделись с друзьями.
  • Add to favorites
  • Добавить ВКонтакте заметку об этой странице
  • Twitter
  • Facebook
  • Мой Мир
  • LiveJournal
  • Одноклассники
  • Блог Я.ру
  • MySpace
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • Reddit
  • StumbleUpon
  • Technorati
  • del.icio.us
  • БобрДобр
  • LinkedIn
  • Memori.ru
  • Сто закладок
  • Blogger

©2012-2018 По всем вопросам обращайтесь через форму обратной связи

Яндекс.Метрика