metabox(), 'load_metabox_form' ), 'um_form', 'side', 'default' ); } /** * */ function init_fields() { $this->meta_associations = array( 'account_status' => __( 'Account Status', 'ultimate-member' ), 'submitted' => __( 'Submitted data on Registration', 'ultimate-member' ), 'form_id' => __( 'Registration Form ID', 'ultimate-member' ), 'timestamp' => __( 'Registration Timestamp', 'ultimate-member' ), 'request' => __( 'Registration Request', 'ultimate-member' ), '_wpnonce' => __( 'Registration Nonce', 'ultimate-member' ), '_wp_http_referer' => __( 'Registration HTTP referer', 'ultimate-member' ), 'role' => __( 'Community Role', 'ultimate-member' ), 'um_user_profile_url_slug_user_login' => __( 'Profile Slug "Username"', 'ultimate-member' ), 'um_user_profile_url_slug_name' => __( 'Profile Slug "First and Last Name with \'.\'"', 'ultimate-member' ), 'um_user_profile_url_slug_name_dash' => __( 'Profile Slug "First and Last Name with \'-\'"', 'ultimate-member' ), 'um_user_profile_url_slug_name_plus' => __( 'Profile Slug "First and Last Name with \'+\'"', 'ultimate-member' ), 'um_user_profile_url_slug_user_id' => __( 'Profile Slug "User ID"', 'ultimate-member' ), '_um_last_login' => __( 'Last Login date', 'ultimate-member' ), //Private content extension '_um_private_content_post_id' => __( 'Private Content Post ID', 'ultimate-member' ), //Verified Users extension '_um_verified' => __( 'Verified Account', 'ultimate-member' ), //Terms & Conditions extension 'use_terms_conditions_agreement' => __( 'Terms&Conditions Agreement', 'ultimate-member' ), //GDPR extension 'use_gdpr_agreement' => __( 'Privacy Policy Agreement', 'ultimate-member' ), ); $all_fields = UM()->builtin()->all_user_fields( null, true ); unset( $all_fields[0] ); $all_fields = array_map( function( $value ) { return $value['title']; }, $all_fields ); $this->meta_associations = array_merge( $this->meta_associations, $all_fields ); /** * UM hook * * @type filter * @title um_gdpr_meta_associations * @description Exclude taxonomies for UM * @input_vars * [{"var":"$meta_associations","type":"array","desc":"Meta Keys Titles"}] * @change_log * ["Since: 2.0.14"] * @usage * * @example * */ $this->meta_associations = apply_filters( 'um_gdpr_meta_associations', $this->meta_associations ); } /** * Return the default suggested privacy policy content. * * @return string The default policy content. */ function plugin_get_default_privacy_content() { ob_start(); include UM()->admin()->templates_path . 'gdpr.php'; return ob_get_clean(); } /** * Add the suggested privacy policy text to the policy postbox. */ function plugin_add_suggested_privacy_content() { $content = $this->plugin_get_default_privacy_content(); wp_add_privacy_policy_content( UM_PLUGIN_NAME, $content ); } /** * Register exporter for Plugin user data. * * @see https://github.com/allendav/wp-privacy-requests/blob/master/EXPORT.md * * @param $exporters * * @return array */ function plugin_register_exporters( $exporters ) { $exporters[] = array( 'exporter_friendly_name' => UM_PLUGIN_NAME, 'callback' => array( &$this, 'data_exporter' ) ); return $exporters; } /** * Get user metadata in key => value array * * * @param $user_id * * @return array */ function get_metadata( $user_id ) { global $wpdb; $metadata = $wpdb->get_results( $wpdb->prepare( "SELECT meta_key, meta_value FROM {$wpdb->usermeta} WHERE user_id = %d", $user_id ), ARRAY_A ); $filtered = array(); foreach ( $metadata as $data ) { if ( in_array( $data['meta_key'], array_keys( $this->meta_associations ) ) ) { $filtered[] = array( 'key' => $data['meta_key'], 'name' => $this->meta_associations[ $data['meta_key'] ], //'value' => maybe_unserialize( $data['meta_value'] ), 'value' => $data['meta_value'], ); } } return $filtered; } /** * Exporter for Plugin user data. * * @see https://github.com/allendav/wp-privacy-requests/blob/master/EXPORT.md * * @param $email_address * @param int $page * * @return array */ function data_exporter( $email_address, $page = 1 ) { $export_items = array(); $user = get_user_by( 'email', $email_address ); if ( $user && $user->ID ) { // Most item IDs should look like postType-postID // If you don't have a post, comment or other ID to work with, // use a unique value to avoid having this item's export // combined in the final report with other items of the same id $item_id = "ultimate-member-{$user->ID}"; // Core group IDs include 'comments', 'posts', etc. // But you can add your own group IDs as needed $group_id = 'ultimate-member'; // Optional group label. Core provides these for core groups. // If you define your own group, the first exporter to // include a label will be used as the group label in the // final exported report $group_label = UM_PLUGIN_NAME; // Plugins can add as many items in the item data array as they want //$data = array(); $data = $this->get_metadata( $user->ID ); if ( ! empty( $data ) ) { // Add this group of items to the exporters data array. $export_items[] = array( 'group_id' => $group_id, 'group_label' => $group_label, 'item_id' => $item_id, 'data' => $data, ); } } // Returns an array of exported items for this pass, but also a boolean whether this exporter is finished. //If not it will be called again with $page increased by 1. return array( 'data' => $export_items, 'done' => true, ); } /** * Register eraser for Plugin user data. * * @param array $erasers * * @return array */ function plugin_register_erasers( $erasers = array() ) { $erasers[] = array( 'eraser_friendly_name' => UM_PLUGIN_NAME, 'callback' => array( &$this, 'data_eraser' ) ); return $erasers; } /** * Eraser for Plugin user data. * * @param $email_address * @param int $page * * @return array */ function data_eraser( $email_address, $page = 1 ) { if ( empty( $email_address ) ) { return array( 'items_removed' => false, 'items_retained' => false, 'messages' => array(), 'done' => true, ); } $user = get_user_by( 'email', $email_address ); $messages = array(); $items_removed = false; $items_retained = false; if ( $user && $user->ID ) { $data = $this->get_metadata( $user->ID ); foreach ( $data as $metadata ) { $deleted = delete_user_meta( $user->ID, $metadata['key'] ); if ( $deleted ) { $items_removed = true; } else { // translators: %s: metadata name. $messages[] = sprintf( __( 'Your %s was unable to be removed at this time.', 'ultimate-member' ), $metadata['name'] ); $items_retained = true; } } } // Returns an array of exported items for this pass, but also a boolean whether this exporter is finished. //If not it will be called again with $page increased by 1. return array( 'items_removed' => $items_removed, 'items_retained' => $items_retained, 'messages' => $messages, 'done' => true, ); } } }