Добавить роль в сети в многопользовательском режиме

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

function civicrm_wp_set_capabilities() { global $wp_roles; if (!isset($wp_roles)) { $wp_roles = new WP_Roles(); } //Minimum capabilities (Civicrm permissions) arrays $min_capabilities = array( 'access_civimail_subscribe_unsubscribe_pages' => 1, 'access_all_custom_data' => 1, 'access_uploaded_files' => 1, 'make_online_contributions' => 1, 'profile_create' => 1, 'profile_edit' => 1, 'profile_view' => 1, 'register_for_events' => 1, 'view_event_info' => 1, 'sign_civicrm_petition' => 1, 'view_public_civimail_content' => 1, ); // Assign the Minimum capabilities (Civicrm permissions) to all WP roles foreach ( $wp_roles->role_names as $role => $name ) { $roleObj = $wp_roles->get_role($role); foreach ($min_capabilities as $capability_name => $capability_value) { $roleObj->add_cap($capability_name); } } //Add the 'anonymous_user' role with minimum capabilities. if (!in_array('anonymous_user' , $wp_roles->roles)) { add_role( 'anonymous_user', 'Anonymous User', $min_capabilities ); } } 

Solutions Collecting From Web of "Добавить роль в сети в многопользовательском режиме"

Это мой опыт.

Я должен был добавить роль для каждого сайта в WordPress, я разработал страницу добавления на панели управления, чтобы администратор сайта мог добавить определенную роль / возможности.

Но я нашел $wp_roles->add_role , add_cap работает только с дочерним сайтом. Поэтому я сделал некоторые исправления,

Я создал плагин, супер-админ (а не администратор сайта, но «администратор») может «Network Activate» на панели инструментов

ххх / WP-администратора / сети / plugins.php

самоопределяемая роль / возможности была сохранена в файле role.ini , плагин может создать две таблицы с именем wp_s_role и wp_s_cap . Предварительно определенные роли / возможности будут вставляться в таблицу.

Затем $wp_roles->add_rol e и add_cap могут add_cap через сеть и вставлять роль / возможности во все дочерние элементы.

Но администратор дополнительного сайта должен добавить самоопределяемую роль / возможности и заставить его работать во всех дочерних элементах, поэтому я создаю триггер для

  register_activation_hook(__FILE__, array($s_role, 'install')); register_deactivation_hook(__FILE__, array($s_role, 'uninstall')); 

Затем функция удаления будет работать, все данные двух таблиц будут снова сохранены в файле role.ini , после чего функция установки снова будет работать. и все самостоятельные роли / возможности были добавлены во всех дочерних элементах.

Как вы видите, я сделал триггер, чтобы добавить определенную роль во все дочерние элементы, но эффективность очень низкая, перезапуск плагина займет более 5 секунд. Поэтому я улучшил методы. На этот раз, когда функция add_role выполнена, я скопировал роль / возможности дочерних сайтов в другие дочерние элементы.

Некоторые шаги:

  • В дочерних сайтах, когда администратор добавляет эту роль, я использую $blog_id и $table_prefix для получения содержимого дочернего wp_2_options . (Мы предположили, что blog_id равно 2 а table_prefix – wp ).

  • Я выбираю option_name=wp_2_user_roles

     result($wpdb->get_row("select `option_value` from `wp_2_options` where `option_name`='wp_2_user_roles'", ARRAY_A);), 

затем я foreach блоги и получаю таблицу подсетей. Поэтому я вставляю результат выбора в каждую таблицу wp_n_options ( wp_n_options ) и основную таблицу ( wp_options ), muhaha, я достаточно умен? 🙂

Нижеследующая функция – это удаление самоопределяемых ролей во всех дочерних элементах. Я думаю, это будет полезно с вами.

 public function reset_subsite_role_cap() { //select * from `wp_options` where `option_name` = 'wp_user_roles'; //select * from `wp_options` where `option_name` = 'wp_backup_user_roles'; //select * from `wp_3_options` where `option_name` = 'wp_3_user_roles'; //select * from `wp_4_options` where `option_name` = 'wp_4_user_roles'; //select * from `wp_5_options` where `option_name` = 'wp_5_user_roles'; global $wpdb; $sql = "select * from ".$wpdb->blogs; $multisite_info = $wpdb->get_results($sql, ARRAY_A); $site_result = array(); if (!empty($multisite_info) && is_array($multisite_info)) { foreach ($multisite_info as $k => $v) { $site_result[$v['blog_id']] = trim($v['path'], '/'); } } global $table_prefix; $tp_arr = explode('_', $table_prefix); $table_arr = array(); foreach ($site_result as $blog_id => $site_name) { if ($blog_id !== 1) { $table_arr[$tp_arr[0].'_'.$blog_id.'_options'] = $tp_arr[0].'_'.$blog_id.'_user_roles'; } else { $table_arr[$tp_arr[0].'_options'] = $tp_arr[0].'_user_roles'; } } // get the backup user roles. $backup_roles_result = $wpdb->get_row("select `option_value` from `".$tp_arr[0]."_options` where `option_name`='wp_backup_user_roles'", ARRAY_A); // clean the others role cap if (isset($table_arr) && is_array($table_arr)) { foreach ($table_arr as $table_role_cap_name => $table_role_cap_filed) { $wpdb->update( $table_role_cap_name, array('option_value' => $backup_roles_result['option_value']), array('option_name' => $table_role_cap_filed) ); } } return true; } 

Для $ site_result у меня есть еще одна функция для получения всей точной информации о сайте.

 /** * Get the all site info. * * @param integer $id BlogID. * * @return array array('blog_id' => 'path', '1' => 'printsolv', '2' => 'govsolv') */ public function s_get_multisite_info($id = null) { global $wpdb; $where = '1=1'; if (isset($id)) { $sql = "select * from ".$wpdb->blogs." where `blog_id`="."'".$id."'"; } else { $sql = "select * from ".$wpdb->blogs." where 1=1 "; } $multisite_info = $wpdb->get_results($sql, ARRAY_A); $result = array(); if (!empty($multisite_info) && is_array($multisite_info)) { // clean the path, > 1 means not http://site_name/theme.php but http://site_name/path_name/theme.php if (isset($id)) { $site_info = $wpdb->get_row("select * from ".$wpdb->site." where `id`="."'".$multisite_info[0]['site_id']."'", ARRAY_A); } else { $site_info = $wpdb->get_row("select * from ".$wpdb->site, ARRAY_A); } $site_path_status = false; // path= / if (isset($site_info['path']) && strlen(trim($site_info['path'], '/')) > 1 ) { // site have path./xxx/ $site_path_status = true; } foreach ($multisite_info as $k => $v) { if (isset($site_info['domain']) && $site_info['domain'] == $v['domain']) { if ($site_path_status == true) { $result[$v['blog_id']] = trim(substr($v['path'], strlen(trim($site_info['path'], '/')) + 1), '/'); } else { $result[$v['blog_id']] = trim($v['path'], '/'); } } } } return $result; } 

Я только что закончил функцию, и она работает отлично. Вы можете использовать s_copy_site_role_cap () для вызова. Функция может скопировать роль в другие дочерние роли после add_role. Поскольку плагин может работать на основном сайте или на подсайте, в сети (субдомен, подпуть) есть два способа, поэтому я сделал еще одну функцию, чтобы получить нужное текущее имя_областной записи, поэтому я могу получить последнее содержимое ролей из информации из blog_name.

 /** * Copy the subsite role/caps to all subsites and main site.. * * @param string $subsite_name SubSite Name. * * @return boolean. */ public function s_copy_site_role_cap() { global $wpdb; // Get all site info $multisite_info = $this->s_get_multisite_info(); global $table_prefix; $tp_arr = explode('_', $table_prefix); // Get all site wp_x_options table. and table filed. $table_arr = array(); foreach ($multisite_info as $blog_id => $site_name) { if ($blog_id !== 1) { $table_arr[$tp_arr[0].'_'.$blog_id.'_options'] = $tp_arr[0].'_'.$blog_id.'_user_roles'; } else { $table_arr[$tp_arr[0].'_options'] = $tp_arr[0].'_user_roles'; } } // select the blog id by blog name. $subsite_name = $this->s_get_dashboard_site_name(); $subsite_id = array_search($subsite_name, $multisite_info); if ($subsite_id === false) { return false; } $current_site_table_pre = $tp_arr[0].'_'.$subsite_id; // get the current subsite roles. $subsite_roles = $wpdb->get_row("select `option_value` from `".$current_site_table_pre."_options` where `option_name`='".$current_site_table_pre."_user_roles'", ARRAY_A); if (isset($table_arr) && is_array($table_arr)) { foreach ($table_arr as $table_role_cap_name => $table_role_cap_filed) { if ($table_role_cap_name != $current_site_table_pre.'_options') { $wpdb->update( $table_role_cap_name, array('option_value' => $subsite_roles['option_value']), array('option_name' => $table_role_cap_filed) ); } } } return true; } /** * Get dashboard site name. * * @return string. SiteName */ public function s_get_dashboard_site_name() { $dashboard_url = admin_url(); //$dashboard_url = "http://xxx/wp-admin/"; //$dashboard_url = "http://subsite_name.xxx/wp-admin/"; //$dashboard_url = "http://xxx/subsite_name/wp-admin/"; // get main site name. $site_name = get_current_site()->domain; $parse_url = parse_url($dashboard_url); if (!is_subdomain_install()) { // base path http://xxx/wp-admin/ // subsite path http://xxx/subsite_name/wp-admin/ if ($parse_url['path'] == "/wp-admin/") { return $site_name; } else { $tmp_url = explode("/", trim($parse_url['path'], "/")); return $tmp_url[0]; } } else { // base domain http://xxx/wp-admin/ // subsite domain http://subsite_name.xxx/wp-admin/ if ($parse_url['host'] == $site_name) { return $site_name; } else { $tmp_url = explode(".", $parse_url['host']); return $tmp_url[0]; } } } 

Благодарю.