WordPress.org

Make WordPress Core

Changeset 43084


Ignore:
Timestamp:
05/02/2018 01:03:53 AM (22 months ago)
Author:
SergeyBiryukov
Message:

Privacy: update and enhance the method to confirm user requests by email. Introduce WP_User_Request to hold all request vars similarly to WP_Post.

Props mikejolley, desrosj.
Merges [43011] and [43014] to the 4.9 branch.
See #43443.

Location:
branches/4.9
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/4.9

  • branches/4.9/src/wp-admin/includes/ajax-actions.php

    r43083 r43084  
    41554155
    41564156    // Find the request CPT
    4157     $request = get_post( $request_id );
    4158     if ( 'remove_personal_data' !== $request->post_title ) {
     4157    $request = wp_get_user_request_data( $request_id );
     4158
     4159    if ( ! $request || 'remove_personal_data' !== $request->action_name ) {
    41594160        wp_send_json_error( __( 'Error: Invalid request ID.' ) );
    41604161    }
    41614162
    4162     $email_address = get_post_meta( $request_id, '_wp_user_request_user_email', true );
     4163    $email_address = $request->email;
    41634164
    41644165    if ( ! is_email( $email_address ) ) {
  • branches/4.9/src/wp-admin/includes/user.php

    r43083 r43084  
    586586
    587587    update_post_meta( $request_id, '_wp_user_request_confirmed_timestamp', time() );
     588
    588589    $request = wp_update_post( array(
    589         'ID'          => $request_data['request_id'],
     590        'ID'          => $request_id,
    590591        'post_status' => 'request-confirmed',
    591592    ) );
     593
    592594    return $request;
    593595}
     
    732734
    733735/**
     736 * Cleans up failed and expired requests before displaying the list table.
     737 *
     738 * @since 4.9.6
     739 * @access private
     740 */
     741function _wp_personal_data_cleanup_requests() {
     742    $expires        = (int) apply_filters( 'user_request_key_expiration', DAY_IN_SECONDS );
     743    $requests_query = new WP_Query( array(
     744        'post_type'      => 'user_request',
     745        'posts_per_page' => -1,
     746        'post_status'    => 'request-pending',
     747        'fields'         => 'ids',
     748        'date_query' => array(
     749            array(
     750                'column' => 'post_modified_gmt',
     751                'before' => $expires . ' seconds ago',
     752            ),
     753        ),
     754    ) );
     755
     756    $request_ids = $requests_query->posts;
     757
     758    foreach ( $request_ids as $request_id ) {
     759        wp_update_post( array(
     760            'ID'            => $request_id,
     761            'post_status'   => 'request-failed',
     762            'post_password' => '',
     763        ) );
     764    }
     765}
     766
     767/**
    734768 * Personal data export.
    735769 *
     
    743777
    744778    _wp_personal_data_handle_actions();
     779    _wp_personal_data_cleanup_requests();
    745780
    746781    $requests_table = new WP_Privacy_Data_Export_Requests_Table( array(
     
    804839
    805840    _wp_personal_data_handle_actions();
     841    _wp_personal_data_cleanup_requests();
    806842
    807843    // "Borrow" xfn.js for now so we don't have to create new files.
     
    842878        <form class="search-form wp-clearfix">
    843879            <?php $requests_table->search_box( __( 'Search Requests' ), 'requests' ); ?>
    844             <input type="hidden" name="page" value="export_personal_data" />
     880            <input type="hidden" name="page" value="remove_personal_data" />
    845881            <input type="hidden" name="filter-status" value="<?php echo isset( $_REQUEST['filter-status'] ) ? esc_attr( sanitize_text_field( $_REQUEST['filter-status'] ) ) : ''; ?>" />
    846882            <input type="hidden" name="orderby" value="<?php echo isset( $_REQUEST['orderby'] ) ? esc_attr( sanitize_text_field( $_REQUEST['orderby'] ) ) : ''; ?>" />
     
    908944    public function get_columns() {
    909945        $columns = array(
    910             'cb'                  => '<input type="checkbox" />',
    911             'email'               => __( 'Requester' ),
    912             'status'              => __( 'Status' ),
    913             'requested_timestamp' => __( 'Requested' ),
    914             'next_steps'          => __( 'Next Steps' ),
     946            'cb'                => '<input type="checkbox" />',
     947            'email'             => __( 'Requester' ),
     948            'status'            => __( 'Status' ),
     949            'created_timestamp' => __( 'Requested' ),
     950            'next_steps'        => __( 'Next Steps' ),
    915951        );
    916952        return $columns;
     
    960996            FROM {$wpdb->posts}
    961997            WHERE post_type = %s
    962             AND post_title = %s
     998            AND post_name = %s
    963999            GROUP BY post_status";
    9641000
     
    10481084                foreach ( $request_ids as $request_id ) {
    10491085                    $resend = _wp_privacy_resend_request( $request_id );
    1050                    
     1086
    10511087                    if ( $resend && ! is_wp_error( $resend ) ) {
    10521088                        $count++;
     
    10841120        $args           = array(
    10851121            'post_type'      => $this->post_type,
    1086             'title'          => $this->request_type,
     1122            'post_name__in'  => array( $this->request_type ),
    10871123            'posts_per_page' => $posts_per_page,
    10881124            'offset'         => isset( $_REQUEST['paged'] ) ? max( 0, absint( $_REQUEST['paged'] ) - 1 ) * $posts_per_page: 0,
    10891125            'post_status'    => 'any',
     1126            's'              => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ) : '',
    10901127        );
    10911128
     
    10951132        }
    10961133
    1097         if ( ! empty( $_REQUEST['s'] ) ) {
    1098             $args['meta_query'] = array(
    1099                 $name_query,
    1100                 'relation'  => 'AND',
    1101                 array(
    1102                     'key'     => '_wp_user_request_user_email',
    1103                     'value'   => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ): '',
    1104                     'compare' => 'LIKE',
    1105                 ),
    1106             );
    1107         }
    1108 
    11091134        $requests_query = new WP_Query( $args );
    11101135        $requests       = $requests_query->posts;
     
    11131138            $this->items[] = wp_get_user_request_data( $request->ID );
    11141139        }
     1140
     1141        $this->items = array_filter( $this->items );
    11151142
    11161143        $this->set_pagination_args(
     
    11271154     * @since 4.9.6
    11281155     *
    1129      * @param array $item Item being shown.
     1156     * @param WP_User_Request $item Item being shown.
    11301157     * @return string
    11311158     */
    11321159    public function column_cb( $item ) {
    1133         return sprintf( '<input type="checkbox" name="request_id[]" value="%1$s" /><span class="spinner"></span>', esc_attr( $item['request_id'] ) );
     1160        return sprintf( '<input type="checkbox" name="request_id[]" value="%1$s" /><span class="spinner"></span>', esc_attr( $item->ID ) );
    11341161    }
    11351162
     
    11391166     * @since 4.9.6
    11401167     *
    1141      * @param array $item Item being shown.
     1168     * @param WP_User_Request $item Item being shown.
    11421169     * @return string
    11431170     */
    11441171    public function column_status( $item ) {
    1145         $status        = get_post_status( $item['request_id'] );
     1172        $status        = get_post_status( $item->ID );
    11461173        $status_object = get_post_status_object( $status );
    11471174
     
    11541181        switch ( $status ) {
    11551182            case 'request-confirmed':
    1156                 $timestamp = $item['confirmed_timestamp'];
     1183                $timestamp = $item->confirmed_timestamp;
    11571184                break;
    11581185            case 'request-completed':
    1159                 $timestamp = $item['completed_timestamp'];
     1186                $timestamp = $item->completed_timestamp;
    11601187                break;
    11611188        }
     
    11981225     * @since 4.9.6
    11991226     *
    1200      * @param array $item         Item being shown.
    1201      * @param string $column_name Name of column being shown.
     1227     * @param WP_User_Request $item         Item being shown.
     1228     * @param string          $column_name Name of column being shown.
    12021229     * @return string
    12031230     */
    12041231    public function column_default( $item, $column_name ) {
    1205         $cell_value = $item[ $column_name ];
    1206 
    1207         if ( in_array( $column_name, array( 'requested_timestamp' ), true ) ) {
     1232        $cell_value = $item->$column_name;
     1233
     1234        if ( in_array( $column_name, array( 'created_timestamp' ), true ) ) {
    12081235            return $this->get_timestamp_as_date( $cell_value );
    12091236        }
     
    12171244     * @since 4.9.6
    12181245     *
    1219      * @param array $item Item being shown.
     1246     * @param WP_User_Request $item Item being shown.
    12201247     * @return string
    12211248     */
    12221249    public function column_email( $item ) {
    1223         return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( array() ) );
     1250        return sprintf( '%1$s %2$s', $item->email, $this->row_actions( array() ) );
    12241251    }
    12251252
     
    12291256     * @since 4.9.6
    12301257     *
    1231      * @param array $item Item being shown.
     1258     * @param WP_User_Request $item Item being shown.
    12321259     */
    12331260    public function column_next_steps( $item ) {}
     
    12381265     * @since 4.9.6
    12391266     *
    1240      * @param object $item The current item
     1267     * @param WP_User_Request $item The current item
    12411268     */
    12421269    public function single_row( $item ) {
    1243         $status = get_post_status( $item['request_id'] );
     1270        $status = $item->status;
    12441271
    12451272        echo '<tr class="status-' . esc_attr( $status ) . '">';
     
    12851312     * @since 4.9.6
    12861313     *
    1287      * @param array $item Item being shown.
     1314     * @param WP_User_Request $item Item being shown.
    12881315     * @return string
    12891316     */
     
    12911318        $exporters       = apply_filters( 'wp_privacy_personal_data_exporters', array() );
    12921319        $exporters_count = count( $exporters );
    1293         $request_id      = $item['request_id'];
     1320        $request_id      = $item->ID;
    12941321        $nonce           = wp_create_nonce( 'wp-privacy-export-personal-data-' . $request_id );
    12951322
     
    13081335        );
    13091336
    1310         return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( $row_actions ) );
     1337        return sprintf( '%1$s %2$s', $item->email, $this->row_actions( $row_actions ) );
    13111338    }
    13121339
     
    13161343     * @since 4.9.6
    13171344     *
    1318      * @param array $item Item being shown.
     1345     * @param WP_User_Request $item Item being shown.
    13191346     */
    13201347    public function column_next_steps( $item ) {
    1321         $status = get_post_status( $item['request_id'] );
     1348        $status = $item->status;
    13221349
    13231350        switch ( $status ) {
     
    13291356                break;
    13301357            case 'request-failed':
    1331                 submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item['request_id'] . ']', false );
     1358                submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item->ID . ']', false );
    13321359                break;
    13331360            case 'request-completed':
    13341361                echo '<a href="' . esc_url( wp_nonce_url( add_query_arg( array(
    13351362                    'action' => 'delete',
    1336                     'request_id' => array( $item['request_id'] )
     1363                    'request_id' => array( $item->ID )
    13371364                ), admin_url( 'tools.php?page=export_personal_data' ) ), 'bulk-privacy_requests' ) ) . '">' . esc_html__( 'Remove request' ) . '</a>';
    13381365                break;
     
    13701397     * @since 4.9.6
    13711398     *
    1372      * @param array $item Item being shown.
     1399     * @param WP_User_Request $item Item being shown.
    13731400     * @return string
    13741401     */
     
    13761403        $row_actions = array();
    13771404
    1378         // Allow the administrator to "force remove" the personal data even if confirmation has not yet been received
    1379         $status = get_post_status( $item['request_id'] );
     1405        // Allow the administrator to "force remove" the personal data even if confirmation has not yet been received.
     1406        $status = $item->status;
    13801407        if ( 'request-confirmed' !== $status ) {
    13811408            $erasers       = apply_filters( 'wp_privacy_personal_data_erasers', array() );
    13821409            $erasers_count = count( $erasers );
    1383             $request_id    = $item['request_id'];
     1410            $request_id    = $item->ID;
    13841411            $nonce         = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id );
    13851412
     
    13991426        }
    14001427
    1401         return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( $row_actions ) );
     1428        return sprintf( '%1$s %2$s', $item->email, $this->row_actions( $row_actions ) );
    14021429    }
    14031430
     
    14071434     * @since 4.9.6
    14081435     *
    1409      * @param array $item Item being shown.
     1436     * @param WP_User_Request $item Item being shown.
    14101437     */
    14111438    public function column_next_steps( $item ) {
    1412         $status = get_post_status( $item['request_id'] );
     1439        $status = $item->status;
    14131440
    14141441        switch ( $status ) {
     
    14191446                $erasers       = apply_filters( 'wp_privacy_personal_data_erasers', array() );
    14201447                $erasers_count = count( $erasers );
    1421                 $request_id    = $item['request_id'];
     1448                $request_id    = $item->ID;
    14221449                $nonce         = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id );
    14231450
     
    14371464                break;
    14381465            case 'request-failed':
    1439                 submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item['request_id'] . ']', false );
     1466                submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item->ID . ']', false );
    14401467                break;
    14411468            case 'request-completed':
    14421469                echo '<a href="' . esc_url( wp_nonce_url( add_query_arg( array(
    14431470                    'action' => 'delete',
    1444                     'request_id' => array( $item['request_id'] ),
     1471                    'request_id' => array( $item->ID ),
    14451472                ), admin_url( 'tools.php?page=remove_personal_data' ) ), 'bulk-privacy_requests' ) ) . '">' . esc_html__( 'Remove request' ) . '</a>';
    14461473                break;
  • branches/4.9/src/wp-includes/post.php

    r43083 r43084  
    38013801 */
    38023802function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent ) {
    3803     if ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) || ( 'inherit' == $post_status && 'revision' == $post_type ) )
     3803    if ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) || ( 'inherit' == $post_status && 'revision' == $post_type ) || 'user_request' === $post_type )
    38043804        return $slug;
    38053805
  • branches/4.9/src/wp-includes/user.php

    r43083 r43084  
    27632763    }
    27642764
    2765     if ( ! in_array( $request_data['status'], array( 'request-pending', 'request-failed' ), true ) ) {
     2765    if ( ! in_array( $request_data->status, array( 'request-pending', 'request-failed' ), true ) ) {
    27662766        return;
    27672767    }
     
    27692769    update_post_meta( $request_id, '_wp_user_request_confirmed_timestamp', time() );
    27702770    wp_update_post( array(
    2771         'ID'          => $request_data['request_id'],
     2771        'ID'          => $request_id,
    27722772        'post_status' => 'request-confirmed',
    27732773    ) );
     
    27852785    $request = wp_get_user_request_data( $request_id );
    27862786
    2787     if ( $request && in_array( $request['action'], _wp_privacy_action_request_types(), true ) ) {
     2787    if ( $request && in_array( $request->action_name, _wp_privacy_action_request_types(), true ) ) {
    27882788        $message = '<p class="message">' . __( 'Action has been confirmed.' ) . '</p>';
    27892789        $message .= __( 'The site administrator has been notified and will fulfill your request as soon as possible.' );
     
    28232823    // Check for duplicates.
    28242824    $requests_query = new WP_Query( array(
    2825         'post_type'   => 'user_request',
    2826         'title'       => $action_name,
    2827         'post_status' => 'any',
    2828         'fields'      => 'ids',
    2829         'meta_query'  => array(
    2830             array(
    2831                 'key'     => '_wp_user_request_user_email',
    2832                 'value'   => $email_address,
    2833             ),
    2834         ),
     2825        'post_type'     => 'user_request',
     2826        'post_name__in' => array( $action_name ),  // Action name stored in post_name column.
     2827        'title'         => $email_address, // Email address stored in post_title column.
     2828        'post_status'   => 'any',
     2829        'fields'        => 'ids',
    28352830    ) );
    28362831
     
    28412836    $request_id = wp_insert_post( array(
    28422837        'post_author'   => $user_id,
    2843         'post_title'    => $action_name,
     2838        'post_name'     => $action_name,
     2839        'post_title'    => $email_address,
    28442840        'post_content'  => wp_json_encode( $request_data ),
    28452841        'post_status'   => 'request-pending',
     
    28482844        'post_date_gmt' => current_time( 'mysql', true ),
    28492845    ), true );
    2850 
    2851     if ( is_wp_error( $request_id ) ) {
    2852         return $request_id;
    2853     }
    2854 
    2855     update_post_meta( $request_id, '_wp_user_request_user_email', $email_address );
    2856     update_post_meta( $request_id, '_wp_user_request_confirmed_timestamp', false );
    28572846
    28582847    return $request_id;
     
    28842873     * Filters the user action description.
    28852874     *
     2875     * @since 4.9.6
     2876     *
    28862877     * @param string $description The default description.
    28872878     * @param string $action_name The name of the request.
    2888      */             
     2879     */
    28892880    return apply_filters( 'user_request_action_description', $description, $action_name );
    28902881}
     
    29022893function wp_send_user_request( $request_id ) {
    29032894    $request_id = absint( $request_id );
    2904     $request    = get_post( $request_id );
    2905 
    2906     if ( ! $request || 'user_request' !== $request->post_type ) {
     2895    $request    = wp_get_user_request_data( $request_id );
     2896
     2897    if ( ! $request ) {
    29072898        return new WP_Error( 'user_request_error', __( 'Invalid request.' ) );
    29082899    }
    29092900
    2910     if ( 'request-pending' !== $request->post_status ) {
    2911         wp_update_post( array(
    2912             'ID'            => $request_id,
    2913             'post_status'   => 'request-pending',
    2914             'post_date'     => current_time( 'mysql', false ),
    2915             'post_date_gmt' => current_time( 'mysql', true ),
    2916         ) );
    2917     }
    2918 
    29192901    $email_data = array(
    2920         'action_name' => $request->post_title,
    2921         'email'       => get_post_meta( $request->ID, '_wp_user_request_user_email', true ),
    2922         'description' => wp_user_request_action_description( $request->post_title ),
     2902        'email'       => $request->email,
     2903        'description' => wp_user_request_action_description( $request->action_name ),
    29232904        'confirm_url' => add_query_arg( array(
    29242905            'action'      => 'confirmaction',
     
    29682949     *     Data relating to the account action email.
    29692950     *
    2970      *     @type string $action_name Name of the action being performed.
    2971      *     @type string $email       The email address this is being sent to.
    2972      *     @type string $description Description of the action being performed so the user knows what the email is for.
    2973      *     @type string $confirm_url The link to click on to confirm the account action.
    2974      *     @type string $sitename    The site name sending the mail.
    2975      *     @type string $siteurl     The site URL sending the mail.
     2951     *     @type WP_User_Request $request User request object.
     2952     *     @type string          $email       The email address this is being sent to.
     2953     *     @type string          $description Description of the action being performed so the user knows what the email is for.
     2954     *     @type string          $confirm_url The link to click on to confirm the account action.
     2955     *     @type string          $sitename    The site name sending the mail.
     2956     *     @type string          $siteurl     The site URL sending the mail.
    29762957     * }
    29772958     */
     
    29892970
    29902971/**
    2991  * Returns a confirmation key for a user action and stores the hashed version.
     2972 * Returns a confirmation key for a user action and stores the hashed version for future comparison.
    29922973 *
    29932974 * @since 4.9.6
     
    30082989    }
    30092990
    3010     update_post_meta( $request_id, '_wp_user_request_confirm_key', $wp_hasher->HashPassword( $key ) );
    3011     update_post_meta( $request_id, '_wp_user_request_confirm_key_timestamp', time() );
     2991    wp_update_post( array(
     2992        'ID'                => $request_id,
     2993        'post_status'       => 'request-pending',
     2994        'post_password'     => $wp_hasher->HashPassword( $key ),
     2995        'post_modified'     => current_time( 'mysql', false ),
     2996        'post_modified_gmt' => current_time( 'mysql', true ),
     2997    ) );
    30122998
    30132999    return $key;
     
    30333019    }
    30343020
    3035     if ( ! in_array( $request['status'], array( 'request-pending', 'request-failed' ), true ) ) {
     3021    if ( ! in_array( $request->status, array( 'request-pending', 'request-failed' ), true ) ) {
    30363022        return __( 'This link has expired.' );
    30373023    }
     
    30463032    }
    30473033
    3048     $key_request_time = $request['confirm_key_timestamp'];
    3049     $saved_key        = $request['confirm_key'];
     3034    $key_request_time = $request->modified_timestamp;
     3035    $saved_key        = $request->confirm_key;
    30503036
    30513037    if ( ! $saved_key ) {
     
    30883074function wp_get_user_request_data( $request_id ) {
    30893075    $request_id = absint( $request_id );
    3090     $request    = get_post( $request_id );
    3091 
    3092     if ( ! $request || 'user_request' !== $request->post_type ) {
     3076    $post       = get_post( $request_id );
     3077
     3078    if ( ! $post || 'user_request' !== $post->post_type ) {
    30933079        return false;
    30943080    }
    30953081
    3096     return array(
    3097         'request_id'            => $request->ID,
    3098         'user_id'               => $request->post_author,
    3099         'email'                 => get_post_meta( $request->ID, '_wp_user_request_user_email', true ),
    3100         'action'                => $request->post_title,
    3101         'requested_timestamp'   => strtotime( $request->post_date_gmt ),
    3102         'confirmed_timestamp'   => get_post_meta( $request->ID, '_wp_user_request_confirmed_timestamp', true ),
    3103         'completed_timestamp'   => get_post_meta( $request->ID, '_wp_user_request_completed_timestamp', true ),
    3104         'request_data'          => json_decode( $request->post_content, true ),
    3105         'status'                => $request->post_status,
    3106         'confirm_key'           => get_post_meta( $request_id, '_wp_user_request_confirm_key', true ),
    3107         'confirm_key_timestamp' => get_post_meta( $request_id, '_wp_user_request_confirm_key_timestamp', true ),
    3108     );
    3109 }
     3082    return new WP_User_Request( $post );
     3083}
     3084
     3085/**
     3086 * WP_User_Request class.
     3087 *
     3088 * Represents user request data loaded from a WP_Post object.
     3089 *
     3090 * @since 4.9.6
     3091 */
     3092final class WP_User_Request {
     3093    /**
     3094     * Request ID.
     3095     *
     3096     * @var int
     3097     */
     3098    public $ID = 0;
     3099
     3100    /**
     3101     * User ID.
     3102     *
     3103     * @var int
     3104     */
     3105
     3106    public $user_id = 0;
     3107
     3108    /**
     3109     * User email.
     3110     *
     3111     * @var int
     3112     */
     3113    public $email = '';
     3114
     3115    /**
     3116     * Action name.
     3117     *
     3118     * @var string
     3119     */
     3120    public $action_name = '';
     3121
     3122    /**
     3123     * Current status.
     3124     *
     3125     * @var string
     3126     */
     3127    public $status = '';
     3128
     3129    /**
     3130     * Timestamp this request was created.
     3131     *
     3132     * @var int|null
     3133     */
     3134    public $created_timestamp = null;
     3135
     3136    /**
     3137     * Timestamp this request was last modified.
     3138     *
     3139     * @var int|null
     3140     */
     3141    public $modified_timestamp = null;
     3142
     3143    /**
     3144     * Timestamp this request was confirmed.
     3145     *
     3146     * @var int
     3147     */
     3148    public $confirmed_timestamp = null;
     3149
     3150    /**
     3151     * Timestamp this request was completed.
     3152     *
     3153     * @var int
     3154     */
     3155    public $completed_timestamp = null;
     3156
     3157    /**
     3158     * Misc data assigned to this request.
     3159     *
     3160     * @var array
     3161     */
     3162    public $request_data = array();
     3163
     3164    /**
     3165     * Key used to confirm this request.
     3166     *
     3167     * @var string
     3168     */
     3169    public $confirm_key = '';
     3170
     3171    /**
     3172     * Constructor.
     3173     *
     3174     * @since 4.9.6
     3175     *
     3176     * @param WP_Post|object $post Post object.
     3177     */
     3178    public function __construct( $post ) {
     3179        $this->ID                  = $post->ID;
     3180        $this->user_id             = $post->post_author;
     3181        $this->email               = $post->post_title;
     3182        $this->action_name         = $post->post_name;
     3183        $this->status              = $post->post_status;
     3184        $this->created_timestamp   = strtotime( $post->post_date_gmt );
     3185        $this->modified_timestamp  = strtotime( $post->post_modified_gmt );
     3186        $this->confirmed_timestamp = (int) get_post_meta( $post->ID, '_wp_user_request_confirmed_timestamp', true );
     3187        $this->completed_timestamp = (int) get_post_meta( $post->ID, '_wp_user_request_completed_timestamp', true );
     3188        $this->request_data        = json_decode( $post->post_content, true );
     3189        $this->confirm_key         = $post->post_password;
     3190    }
     3191}
Note: See TracChangeset for help on using the changeset viewer.