コード例 #1
0
ファイル: Ajax_Helper.php プロジェクト: rebeccayshen/kitlist
 /**
  * Saves Access settings by section
  */
 public static function wpcf_access_save_settings_section()
 {
     if (!current_user_can('manage_options')) {
         _e('There are security problems. You do not have permissions.', 'wpcf-access');
         die;
     }
     if (isset($_POST['_wpnonce']) && wp_verify_nonce($_POST['_wpnonce'], 'wpcf-access-edit')) {
         //taccess_log($_POST['types_access']);
         $model = TAccess_Loader::get('MODEL/Access');
         //$isTypesActive = Access_Helper::wpcf_access_is_wpcf_active();
         $access_bypass_template = "<div class='error'><p>" . __("<strong>Warning:</strong> The %s <strong>%s</strong> uses the same name for singular name and plural name. Access can't control access to this object. Please use a different name for the singular and plural names.", 'wpcf-access') . "</p></div>";
         $access_conflict_template = "<div class='error'><p>" . __("<strong>Warning:</strong> The %s <strong>%s</strong> uses capability names that conflict with default Wordpress capabilities. Access can not manage this entity, try changing entity's name and / or slug", 'wpcf-access') . "</p></div>";
         $access_notices = '';
         $_post_types = Access_Helper::wpcf_object_to_array($model->getPostTypes());
         $_taxonomies = Access_Helper::wpcf_object_to_array($model->getTaxonomies());
         //taccess_log($_taxonomies);
         // start empty
         $settings_access_types_previous = $model->getAccessTypes();
         $settings_access_taxs_previous = $model->getAccessTaxonomies();
         $settings_access_thirdparty_previous = $model->getAccessThirdParty();
         $settings_access_types = array();
         $settings_access_taxs = array();
         // Post Types
         $custom_data = array();
         $settings_access = $model->getAccessTypes();
         if (!empty($_POST['types_access_error_type']['types'])) {
             foreach ($_POST['types_access_error_type']['types'] as $type => $data) {
                 $type = sanitize_text_field($type);
                 $settings_access_types_previous['_custom_read_errors'][$type] = $data;
             }
             $model->updateAccessTypes($settings_access_types_previous);
         }
         if (!empty($_POST['types_access_error_value']['types'])) {
             foreach ($_POST['types_access_error_value']['types'] as $type => $data) {
                 $type = sanitize_text_field($type);
                 $settings_access_types_previous['_custom_read_errors_value'][$type] = $data;
             }
             $model->updateAccessTypes($settings_access_types_previous);
         }
         //Archives
         if (!empty($_POST['types_access_archive_error_type']['types'])) {
             foreach ($_POST['types_access_archive_error_type']['types'] as $type => $data) {
                 $type = sanitize_text_field($type);
                 $settings_access_types_previous['_archive_custom_read_errors'][$type] = $data;
             }
             $model->updateAccessTypes($settings_access_types_previous);
         }
         if (!empty($_POST['types_access_archive_error_value']['types'])) {
             foreach ($_POST['types_access_archive_error_value']['types'] as $type => $data) {
                 $type = sanitize_text_field($type);
                 $settings_access_types_previous['_archive_custom_read_errors_value'][$type] = $data;
             }
             $model->updateAccessTypes($settings_access_types_previous);
         }
         // Post Types
         if (!empty($_POST['types_access']['types'])) {
             $caps = Access_Helper::wpcf_access_types_caps_predefined();
             foreach ($_POST['types_access']['types'] as $type => $data) {
                 $mode = isset($data['mode']) ? $data['mode'] : 'not_managed';
                 // Use saved if any and not_managed
                 if (isset($data['mode']) && $data['mode'] == 'not_managed' && isset($settings_access_types_previous[$type])) {
                     $data = $settings_access_types_previous[$type];
                 }
                 $data['mode'] = $mode;
                 if (strpos($type, 'wpcf-custom-group-') === 0 && isset($_POST['groupvalue-' . $type])) {
                     $data['title'] = sanitize_text_field($_POST['groupvalue-' . $type]);
                 }
                 $data['permissions'] = Access_Helper::wpcf_access_parse_permissions($data, $caps);
                 //taccess_log($data['permissions']);
                 if (isset($_post_types[$type]['__accessIsNameValid']) && !$_post_types[$type]['__accessIsNameValid']) {
                     $data['mode'] = 'not_managed';
                     $access_notices .= sprintf($access_bypass_template, __('Post Type', 'wpcf-access'), $_post_types[$type]['labels']['singular_name']);
                 }
                 if (isset($_post_types[$type]['__accessIsCapValid']) && !$_post_types[$type]['__accessIsCapValid']) {
                     $data['mode'] = 'not_managed';
                     $access_notices .= sprintf($access_conflict_template, __('Post Type', 'wpcf-access'), $_post_types[$type]['labels']['singular_name']);
                 }
                 //$settings_access_types[$type] = $data;
                 $settings_access_types_previous[$type] = $data;
             }
             // update settings
             $model->updateAccessTypes($settings_access_types_previous);
             //unset($settings_access_types_previous);
         }
         // Taxonomies
         $caps = Access_Helper::wpcf_access_tax_caps();
         // when a taxonomy is unchecked, no $_POST data exist, so loop over all existing taxonomies, instead of $_POST data
         foreach ($_taxonomies as $tax => $_taxdata) {
             if (isset($_POST['types_access']['tax']) && isset($_POST['types_access']['tax'][$tax])) {
                 $data = $_POST['types_access']['tax'][$tax];
                 //foreach ($_POST['types_access']['tax'] as $tax => $data) {
                 if (!isset($data['not_managed'])) {
                     $data['mode'] = 'not_managed';
                 }
                 if (!isset($data['mode'])) {
                     $data['mode'] = 'permissions';
                 }
                 $data['mode'] = isset($data['mode']) ? $data['mode'] : 'not_managed';
                 //Checkthis
                 //$data['mode'] = Access_Helper::wpcf_access_get_taxonomy_mode($tax,  $data['mode']);
                 // Prevent overwriting
                 if ($data['mode'] == 'not_managed') {
                     if (isset($settings_access_taxs_previous[$tax])) {
                         //$data['permissions'] = $settings_access_taxs_previous[$tax]['permissions'];
                         $data = $settings_access_taxs_previous[$tax];
                         $data['mode'] = 'not_managed';
                     }
                 } elseif ($data['mode'] == 'follow') {
                     if (!isset($data['__permissions'])) {
                         // add this here since it is needed elsewhere
                         // and it is missing :P
                         $data['__permissions'] = Access_Helper::wpcf_get_taxs_caps_default();
                     }
                     //taccess_log($_taxdata);
                     $tax_post_type = '';
                     if (isset($tax_post_type)) {
                         $tax_arr = array_values($_taxdata['object_type']);
                         if (is_array($tax_arr)) {
                             $tax_post_type = array_shift($tax_arr);
                         }
                     }
                     //$tax_post_type = array_shift(array_values($_taxdata['object_type']));
                     $follow_caps = array();
                     // if parent post type managed by access, and tax is same as parent
                     // translate and hardcode the post type capabilities to associated tax capabilties
                     if (isset($settings_access_types_previous[$tax_post_type]) && 'permissions' == $settings_access_types_previous[$tax_post_type]['mode']) {
                         $follow_caps = Access_Helper::wpcf_types_to_tax_caps($tax, $_taxdata, $settings_access_types_previous[$tax_post_type]);
                     }
                     //taccess_log(array($tax, $follow_caps));
                     if (!empty($follow_caps)) {
                         $data['permissions'] = $follow_caps;
                     } else {
                         $data['mode'] = 'not_managed';
                     }
                     //taccess_log(array($tax_post_type, $follow_caps, $settings_access_types[$tax_post_type]['permissions']));
                     /*if (isset($settings_access_taxs[$tax]) && isset($settings_access_taxs[$tax]['permissions']))
                       $data['permissions'] = $settings_access_taxs[$tax]['permissions'];*/
                 }
                 //taccess_log($data['permissions']);
                 $data['permissions'] = Access_Helper::wpcf_access_parse_permissions($data, $caps);
                 //taccess_log(array($tax, $data));
                 if (isset($_taxonomies[$tax]['__accessIsNameValid']) && !$_taxonomies[$tax]['__accessIsNameValid']) {
                     $data['mode'] = 'not_managed';
                     $access_notices .= sprintf($access_bypass_template, __('Taxonomy', 'wpcf-access'), $_taxonomies[$tax]['labels']['singular_name']);
                 }
                 if (isset($_taxonomies[$tax]['__accessIsCapValid']) && !$_taxonomies[$tax]['__accessIsCapValid']) {
                     $data['mode'] = 'not_managed';
                     $access_notices .= sprintf($access_conflict_template, __('Taxonomy', 'wpcf-access'), $_taxonomies[$tax]['labels']['singular_name']);
                 }
                 //$settings_access_taxs[$tax] = $data;
                 $settings_access_taxs_previous[$tax] = $data;
             }
         }
         //taccess_log($settings_access_taxs);
         // update settings
         $model->updateAccessTaxonomies($settings_access_taxs_previous);
         unset($settings_access_taxs_previous);
         // 3rd-Party
         if (!empty($_POST['types_access'])) {
             // start empty
             //$settings_access_thirdparty_previous = $model->getAccessThirdParty();
             $third_party = $settings_access_thirdparty_previous;
             if (!is_array($third_party)) {
                 $third_party = array();
             }
             foreach ($_POST['types_access'] as $area_id => $area_data) {
                 // Skip Types
                 if ($area_id == 'types' || $area_id == 'tax') {
                     //unset($third_party[$area_id]);
                     continue;
                 }
                 if (!isset($third_party[$area_id]) || empty($third_party[$area_id])) {
                     $third_party[$area_id] = array();
                 }
                 foreach ($area_data as $group => $group_data) {
                     $group = sanitize_text_field($group);
                     // Set user IDs
                     $group_data['permissions'] = Access_Helper::wpcf_access_parse_permissions($group_data, $caps, true);
                     $third_party[$area_id][$group] = $group_data;
                     $third_party[$area_id][$group]['mode'] = 'permissions';
                 }
             }
             //taccess_log($third_party);
             // update settings
             $model->updateAccessThirdParty($third_party);
         }
         // Roles
         if (!empty($_POST['roles'])) {
             $access_roles = $model->getAccessRoles();
             foreach ($_POST['roles'] as $role => $level) {
                 $role = sanitize_text_field($role);
                 $level = sanitize_text_field($level);
                 $role_data = get_role($role);
                 if (!empty($role_data)) {
                     $level = intval($level);
                     for ($index = 0; $index < 11; $index++) {
                         if ($index <= $level) {
                             $role_data->add_cap('level_' . $index, 1);
                         } else {
                             $role_data->remove_cap('level_' . $index);
                         }
                         if (isset($access_roles[$role])) {
                             if (isset($access_roles[$role]['caps'])) {
                                 if ($index <= $level) {
                                     $access_roles[$role]['caps']['level_' . $index] = true;
                                 } else {
                                     unset($access_roles[$role]['caps']['level_' . $index]);
                                 }
                             }
                         }
                     }
                 }
             }
             //taccess_log(array($_POST['roles'], $access_roles));
             $model->updateAccessRoles($access_roles);
         }
         if (defined('DOING_AJAX')) {
             do_action('types_access_save_settings');
             echo "<div class='updated'><p>" . __('Access rules saved', 'wpcf-access') . "</p></div>";
             echo $access_notices;
             die;
         }
     }
 }