array( 'name' => __( 'Form entries', 'reactwoo-atomic' ), 'singular_name' => __( 'Form entry', 'reactwoo-atomic' ), ), 'public' => false, 'show_ui' => true, 'show_in_menu' => 'tools.php', 'show_in_rest' => false, 'supports' => array( 'title' ), 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => 'do_not_allow' ), 'map_meta_cap' => true, ) ); } /** * @param array $entry {form_id, form_name, page_id, path, answers, labels, tracking, geo, ip_hash, ua_hash, email}. * @return int Entry id (0 on failure). */ public static function insert( array $entry ) { $title = sprintf( '%s — %s', isset( $entry['form_name'] ) ? $entry['form_name'] : '', wp_date( 'Y-m-d H:i' ) ); $id = wp_insert_post( array( 'post_type' => self::POST_TYPE, 'post_status' => 'private', 'post_title' => sanitize_text_field( $title ), ), true ); if ( is_wp_error( $id ) || ! $id ) { return 0; } foreach ( array( 'form_id', 'page_id', 'path', 'answers', 'labels', 'tracking', 'geo', 'ip_hash', 'ua_hash', 'email', 'tags' ) as $k ) { if ( isset( $entry[ $k ] ) ) { update_post_meta( $id, self::META_PREFIX . $k, $entry[ $k ] ); } } return (int) $id; } /** * @param int $entry_id Entry id. * @return array|null */ public static function get( $entry_id ) { $post = get_post( (int) $entry_id ); if ( ! $post || self::POST_TYPE !== $post->post_type ) { return null; } $out = array( 'id' => (int) $post->ID ); foreach ( array( 'form_id', 'page_id', 'path', 'answers', 'labels', 'tracking', 'geo', 'email', 'tags' ) as $k ) { $out[ $k ] = self::read_meta( $post->ID, $k ); } return $out; } public static function register_eraser( $erasers ) { $erasers['reactwoo-atomic-forms'] = array( 'eraser_friendly_name' => __( 'ReactWoo form entries', 'reactwoo-atomic' ), 'callback' => array( __CLASS__, 'erase' ), ); return $erasers; } public static function register_exporter( $exporters ) { $exporters['reactwoo-atomic-forms'] = array( 'exporter_friendly_name' => __( 'ReactWoo form entries', 'reactwoo-atomic' ), 'callback' => array( __CLASS__, 'export' ), ); return $exporters; } private static function ids_for_email( $email ) { $email = strtolower( (string) $email ); return self::ids_for_meta( self::META_PREFIX . 'email', $email ); } /** * @param string $meta_key Meta key. * @param string $email Email. * @return array */ private static function ids_for_meta( $meta_key, $email ) { return get_posts( array( 'post_type' => self::POST_TYPE, 'post_status' => 'any', 'fields' => 'ids', 'posts_per_page' => 100, 'meta_key' => $meta_key, // phpcs:ignore WordPress.DB.SlowDBQuery 'meta_value' => $email, // phpcs:ignore WordPress.DB.SlowDBQuery ) ); } /** * @param int $post_id Post id. * @param string $key Meta suffix. * @return mixed */ private static function read_meta( $post_id, $key ) { return get_post_meta( $post_id, self::META_PREFIX . $key, true ); } public static function erase( $email, $page = 1 ) { $ids = self::ids_for_email( $email ); foreach ( $ids as $id ) { wp_delete_post( $id, true ); } return array( 'items_removed' => count( $ids ), 'items_retained' => false, 'messages' => array(), 'done' => count( $ids ) < 100 ); } public static function export( $email, $page = 1 ) { $data = array(); foreach ( self::ids_for_email( $email ) as $id ) { $labels = (array) self::read_meta( $id, 'labels' ); $items = array(); foreach ( $labels as $k => $v ) { $items[] = array( 'name' => (string) $k, 'value' => is_scalar( $v ) ? (string) $v : wp_json_encode( $v ) ); } $data[] = array( 'group_id' => 'rwa-form-entries', 'group_label' => __( 'Form entries', 'reactwoo-atomic' ), 'item_id' => 'rwa-entry-' . $id, 'data' => $items ); } return array( 'data' => $data, 'done' => true ); } }