Make WordPress Core

Changeset 43011


Ignore:
Timestamp:
04/27/2018 05:30:28 PM (6 years ago)
Author:
azaozz
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.
See #43443.

Location:
trunk/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/ajax-actions.php

    r43008 r43011  
    44644464
    44654465    // Find the request CPT
    4466     $request = get_post( $request_id );
    4467     if ( 'remove_personal_data' !== $request->post_title ) {
     4466    $request = wp_get_user_request_data( $request_id );
     4467
     4468    if ( ! $request || 'remove_personal_data' !== $request->action_name ) {
    44684469        wp_send_json_error( __( 'Error: Invalid request ID.' ) );
    44694470    }
    44704471
    4471     $email_address = get_post_meta( $request_id, '_wp_user_request_user_email', true );
     4472    $email_address = $request->email;
    44724473
    44734474    if ( ! is_email( $email_address ) ) {
  • trunk/src/wp-admin/includes/user.php

    r43008 r43011  
    627627
    628628    update_post_meta( $request_id, '_wp_user_request_confirmed_timestamp', time() );
     629
    629630    $request = wp_update_post( array(
    630         'ID'          => $request_data['request_id'],
     631        'ID'          => $request_id,
    631632        'post_status' => 'request-confirmed',
    632633    ) );
     634
    633635    return $request;
    634636}
     
    773775
    774776/**
     777 * Cleans up failed and expired requests before displaying the list table.
     778 *
     779 * @since 4.9.6
     780 * @access private
     781 */
     782function _wp_personal_data_cleanup_requests() {
     783    $expires        = (int) apply_filters( 'user_request_key_expiration', DAY_IN_SECONDS );
     784    $requests_query = new WP_Query( array(
     785        'post_type'      => 'user_request',
     786        'posts_per_page' => -1,
     787        'post_status'    => 'request-pending',
     788        'fields'         => 'ids',
     789        'date_query' => array(
     790            array(
     791                'column' => 'post_modified_gmt',
     792                'before' => $expires . ' seconds ago',
     793            ),
     794        ),
     795    ) );
     796
     797    $request_ids = $requests_query->posts;
     798
     799    foreach ( $request_ids as $request_id ) {
     800        wp_update_post( array(
     801            'ID'            => $request_id,
     802            'post_status'   => 'request-failed',
     803            'post_password' => '',
     804        ) );
     805    }
     806}
     807
     808/**
    775809 * Personal data export.
    776810 *
     
    784818
    785819    _wp_personal_data_handle_actions();
     820    _wp_personal_data_cleanup_requests();
    786821
    787822    $requests_table = new WP_Privacy_Data_Export_Requests_Table( array(
     
    845880
    846881    _wp_personal_data_handle_actions();
     882    _wp_personal_data_cleanup_requests();
    847883
    848884    // "Borrow" xfn.js for now so we don't have to create new files.
     
    883919        <form class="search-form wp-clearfix">
    884920            <?php $requests_table->search_box( __( 'Search Requests' ), 'requests' ); ?>
    885             <input type="hidden" name="page" value="export_personal_data" />
     921            <input type="hidden" name="page" value="remove_personal_data" />
    886922            <input type="hidden" name="filter-status" value="<?php echo isset( $_REQUEST['filter-status'] ) ? esc_attr( sanitize_text_field( $_REQUEST['filter-status'] ) ) : ''; ?>" />
    887923            <input type="hidden" name="orderby" value="<?php echo isset( $_REQUEST['orderby'] ) ? esc_attr( sanitize_text_field( $_REQUEST['orderby'] ) ) : ''; ?>" />
     
    949985    public function get_columns() {
    950986        $columns = array(
    951             'cb'                  => '<input type="checkbox" />',
    952             'email'               => __( 'Requester' ),
    953             'status'              => __( 'Status' ),
    954             'requested_timestamp' => __( 'Requested' ),
    955             'next_steps'          => __( 'Next Steps' ),
     987            'cb'                => '<input type="checkbox" />',
     988            'email'             => __( 'Requester' ),
     989            'status'            => __( 'Status' ),
     990            'created_timestamp' => __( 'Requested' ),
     991            'next_steps'        => __( 'Next Steps' ),
    956992        );
    957993        return $columns;
     
    10011037            FROM {$wpdb->posts}
    10021038            WHERE post_type = %s
    1003             AND post_title = %s
     1039            AND post_name = %s
    10041040            GROUP BY post_status";
    10051041
     
    10891125                foreach ( $request_ids as $request_id ) {
    10901126                    $resend = _wp_privacy_resend_request( $request_id );
    1091                    
     1127
    10921128                    if ( $resend && ! is_wp_error( $resend ) ) {
    10931129                        $count++;
     
    11251161        $args           = array(
    11261162            'post_type'      => $this->post_type,
    1127             'title'          => $this->request_type,
     1163            'post_name__in'  => array( $this->request_type ),
    11281164            'posts_per_page' => $posts_per_page,
    11291165            'offset'         => isset( $_REQUEST['paged'] ) ? max( 0, absint( $_REQUEST['paged'] ) - 1 ) * $posts_per_page: 0,
    11301166            'post_status'    => 'any',
     1167            's'              => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ) : '',
    11311168        );
    11321169
     
    11361173        }
    11371174
    1138         if ( ! empty( $_REQUEST['s'] ) ) {
    1139             $args['meta_query'] = array(
    1140                 $name_query,
    1141                 'relation'  => 'AND',
    1142                 array(
    1143                     'key'     => '_wp_user_request_user_email',
    1144                     'value'   => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ): '',
    1145                     'compare' => 'LIKE',
    1146                 ),
    1147             );
    1148         }
    1149 
    11501175        $requests_query = new WP_Query( $args );
    11511176        $requests       = $requests_query->posts;
     
    11541179            $this->items[] = wp_get_user_request_data( $request->ID );
    11551180        }
     1181
     1182        $this->items = array_filter( $this->items );
    11561183
    11571184        $this->set_pagination_args(
     
    11681195     * @since 4.9.6
    11691196     *
    1170      * @param array $item Item being shown.
     1197     * @param WP_User_Request $item Item being shown.
    11711198     * @return string
    11721199     */
    11731200    public function column_cb( $item ) {
    1174         return sprintf( '<input type="checkbox" name="request_id[]" value="%1$s" /><span class="spinner"></span>', esc_attr( $item['request_id'] ) );
     1201        return sprintf( '<input type="checkbox" name="request_id[]" value="%1$s" /><span class="spinner"></span>', esc_attr( $item->ID ) );
    11751202    }
    11761203
     
    11801207     * @since 4.9.6
    11811208     *
    1182      * @param array $item Item being shown.
     1209     * @param WP_User_Request $item Item being shown.
    11831210     * @return string
    11841211     */
    11851212    public function column_status( $item ) {
    1186         $status        = get_post_status( $item['request_id'] );
     1213        $status        = get_post_status( $item->ID );
    11871214        $status_object = get_post_status_object( $status );
    11881215
     
    11951222        switch ( $status ) {
    11961223            case 'request-confirmed':
    1197                 $timestamp = $item['confirmed_timestamp'];
     1224                $timestamp = $item->confirmed_timestamp;
    11981225                break;
    11991226            case 'request-completed':
    1200                 $timestamp = $item['completed_timestamp'];
     1227                $timestamp = $item->completed_timestamp;
    12011228                break;
    12021229        }
     
    12391266     * @since 4.9.6
    12401267     *
    1241      * @param array $item         Item being shown.
    1242      * @param string $column_name Name of column being shown.
     1268     * @param WP_User_Request $item         Item being shown.
     1269     * @param string          $column_name Name of column being shown.
    12431270     * @return string
    12441271     */
    12451272    public function column_default( $item, $column_name ) {
    1246         $cell_value = $item[ $column_name ];
    1247 
    1248         if ( in_array( $column_name, array( 'requested_timestamp' ), true ) ) {
     1273        $cell_value = $item->$column_name;
     1274
     1275        if ( in_array( $column_name, array( 'created_timestamp' ), true ) ) {
    12491276            return $this->get_timestamp_as_date( $cell_value );
    12501277        }
     
    12581285     * @since 4.9.6
    12591286     *
    1260      * @param array $item Item being shown.
     1287     * @param WP_User_Request $item Item being shown.
    12611288     * @return string
    12621289     */
    12631290    public function column_email( $item ) {
    1264         return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( array() ) );
     1291        return sprintf( '%1$s %2$s', $item->email, $this->row_actions( array() ) );
    12651292    }
    12661293
     
    12701297     * @since 4.9.6
    12711298     *
    1272      * @param array $item Item being shown.
     1299     * @param WP_User_Request $item Item being shown.
    12731300     */
    12741301    public function column_next_steps( $item ) {}
     
    12791306     * @since 4.9.6
    12801307     *
    1281      * @param object $item The current item
     1308     * @param WP_User_Request $item The current item
    12821309     */
    12831310    public function single_row( $item ) {
    1284         $status = get_post_status( $item['request_id'] );
     1311        $status = $item->status;
    12851312
    12861313        echo '<tr class="status-' . esc_attr( $status ) . '">';
     
    13261353     * @since 4.9.6
    13271354     *
    1328      * @param array $item Item being shown.
     1355     * @param WP_User_Request $item Item being shown.
    13291356     * @return string
    13301357     */
     
    13321359        $exporters       = apply_filters( 'wp_privacy_personal_data_exporters', array() );
    13331360        $exporters_count = count( $exporters );
    1334         $request_id      = $item['request_id'];
     1361        $request_id      = $item->ID;
    13351362        $nonce           = wp_create_nonce( 'wp-privacy-export-personal-data-' . $request_id );
    13361363
     
    13491376        );
    13501377
    1351         return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( $row_actions ) );
     1378        return sprintf( '%1$s %2$s', $item->email, $this->row_actions( $row_actions ) );
    13521379    }
    13531380
     
    13571384     * @since 4.9.6
    13581385     *
    1359      * @param array $item Item being shown.
     1386     * @param WP_User_Request $item Item being shown.
    13601387     */
    13611388    public function column_next_steps( $item ) {
    1362         $status = get_post_status( $item['request_id'] );
     1389        $status = $item->status;
    13631390
    13641391        switch ( $status ) {
     
    13701397                break;
    13711398            case 'request-failed':
    1372                 submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item['request_id'] . ']', false );
     1399                submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item->ID . ']', false );
    13731400                break;
    13741401            case 'request-completed':
    13751402                echo '<a href="' . esc_url( wp_nonce_url( add_query_arg( array(
    13761403                    'action' => 'delete',
    1377                     'request_id' => array( $item['request_id'] )
     1404                    'request_id' => array( $item->ID )
    13781405                ), admin_url( 'tools.php?page=export_personal_data' ) ), 'bulk-privacy_requests' ) ) . '">' . esc_html__( 'Remove request' ) . '</a>';
    13791406                break;
     
    14111438     * @since 4.9.6
    14121439     *
    1413      * @param array $item Item being shown.
     1440     * @param WP_User_Request $item Item being shown.
    14141441     * @return string
    14151442     */
     
    14171444        $row_actions = array();
    14181445
    1419         // Allow the administrator to "force remove" the personal data even if confirmation has not yet been received
    1420         $status = get_post_status( $item['request_id'] );
     1446        // Allow the administrator to "force remove" the personal data even if confirmation has not yet been received.
     1447        $status = $item->status;
    14211448        if ( 'request-confirmed' !== $status ) {
    14221449            $erasers       = apply_filters( 'wp_privacy_personal_data_erasers', array() );
    14231450            $erasers_count = count( $erasers );
    1424             $request_id    = $item['request_id'];
     1451            $request_id    = $item->ID;
    14251452            $nonce         = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id );
    14261453
     
    14401467        }
    14411468
    1442         return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( $row_actions ) );
     1469        return sprintf( '%1$s %2$s', $item->email, $this->row_actions( $row_actions ) );
    14431470    }
    14441471
     
    14481475     * @since 4.9.6
    14491476     *
    1450      * @param array $item Item being shown.
     1477     * @param WP_User_Request $item Item being shown.
    14511478     */
    14521479    public function column_next_steps( $item ) {
    1453         $status = get_post_status( $item['request_id'] );
     1480        $status = $item->status;
    14541481
    14551482        switch ( $status ) {
     
    14601487                $erasers       = apply_filters( 'wp_privacy_personal_data_erasers', array() );
    14611488                $erasers_count = count( $erasers );
    1462                 $request_id    = $item['request_id'];
     1489                $request_id    = $item->ID;
    14631490                $nonce         = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id );
    14641491
     
    14781505                break;
    14791506            case 'request-failed':
    1480                 submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item['request_id'] . ']', false );
     1507                submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item->ID . ']', false );
    14811508                break;
    14821509            case 'request-completed':
    14831510                echo '<a href="' . esc_url( wp_nonce_url( add_query_arg( array(
    14841511                    'action' => 'delete',
    1485                     'request_id' => array( $item['request_id'] ),
     1512                    'request_id' => array( $item->ID ),
    14861513                ), admin_url( 'tools.php?page=remove_personal_data' ) ), 'bulk-privacy_requests' ) ) . '">' . esc_html__( 'Remove request' ) . '</a>';
    14871514                break;
  • trunk/src/wp-includes/post.php

    r43008 r43011  
    39813981 */
    39823982function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent ) {
    3983     if ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) || ( 'inherit' == $post_status && 'revision' == $post_type ) ) {
     3983    if ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) || ( 'inherit' == $post_status && 'revision' == $post_type ) || 'user_request' === $post_type ) {
    39843984        return $slug;
    39853985    }
  • trunk/src/wp-includes/user.php

    r43008 r43011  
    28412841    }
    28422842
    2843     if ( ! in_array( $request_data['status'], array( 'request-pending', 'request-failed' ), true ) ) {
     2843    if ( ! in_array( $request_data->status, array( 'request-pending', 'request-failed' ), true ) ) {
    28442844        return;
    28452845    }
     
    28472847    update_post_meta( $request_id, '_wp_user_request_confirmed_timestamp', time() );
    28482848    wp_update_post( array(
    2849         'ID'          => $request_data['request_id'],
     2849        'ID'          => $request_id,
    28502850        'post_status' => 'request-confirmed',
    28512851    ) );
     
    28632863    $request = wp_get_user_request_data( $request_id );
    28642864
    2865     if ( $request && in_array( $request['action'], _wp_privacy_action_request_types(), true ) ) {
     2865    if ( $request && in_array( $request->action_name, _wp_privacy_action_request_types(), true ) ) {
    28662866        $message = '<p class="message">' . __( 'Action has been confirmed.' ) . '</p>';
    28672867        $message .= __( 'The site administrator has been notified and will fulfill your request as soon as possible.' );
     
    29012901    // Check for duplicates.
    29022902    $requests_query = new WP_Query( array(
    2903         'post_type'   => 'user_request',
    2904         'title'       => $action_name,
    2905         'post_status' => 'any',
    2906         'fields'      => 'ids',
    2907         'meta_query'  => array(
    2908             array(
    2909                 'key'     => '_wp_user_request_user_email',
    2910                 'value'   => $email_address,
    2911             ),
    2912         ),
     2903        'post_type'     => 'user_request',
     2904        'post_name__in' => array( $action_name ),  // Action name stored in post_name column.
     2905        'title'         => $email_address, // Email address stored in post_title column.
     2906        'post_status'   => 'any',
     2907        'fields'        => 'ids',
    29132908    ) );
    29142909
     
    29192914    $request_id = wp_insert_post( array(
    29202915        'post_author'   => $user_id,
    2921         'post_title'    => $action_name,
     2916        'post_name'     => $action_name,
     2917        'post_title'    => $email_address,
    29222918        'post_content'  => wp_json_encode( $request_data ),
    29232919        'post_status'   => 'request-pending',
     
    29262922        'post_date_gmt' => current_time( 'mysql', true ),
    29272923    ), true );
    2928 
    2929     if ( is_wp_error( $request_id ) ) {
    2930         return $request_id;
    2931     }
    2932 
    2933     update_post_meta( $request_id, '_wp_user_request_user_email', $email_address );
    2934     update_post_meta( $request_id, '_wp_user_request_confirmed_timestamp', false );
    29352924
    29362925    return $request_id;
     
    29642953     * @param string $description The default description.
    29652954     * @param string $action_name The name of the request.
    2966      */             
     2955     */
    29672956    return apply_filters( 'user_request_action_description', $description, $action_name );
    29682957}
     
    29802969function wp_send_user_request( $request_id ) {
    29812970    $request_id = absint( $request_id );
    2982     $request    = get_post( $request_id );
    2983 
    2984     if ( ! $request || 'user_request' !== $request->post_type ) {
     2971    $request    = wp_get_user_request_data( $request_id );
     2972
     2973    if ( ! $request ) {
    29852974        return new WP_Error( 'user_request_error', __( 'Invalid request.' ) );
    29862975    }
    29872976
    2988     if ( 'request-pending' !== $request->post_status ) {
    2989         wp_update_post( array(
    2990             'ID'            => $request_id,
    2991             'post_status'   => 'request-pending',
    2992             'post_date'     => current_time( 'mysql', false ),
    2993             'post_date_gmt' => current_time( 'mysql', true ),
    2994         ) );
    2995     }
    2996 
    29972977    $email_data = array(
    2998         'action_name' => $request->post_title,
    2999         'email'       => get_post_meta( $request->ID, '_wp_user_request_user_email', true ),
    3000         'description' => wp_user_request_action_description( $request->post_title ),
     2978        'email'       => $request->email,
     2979        'description' => wp_user_request_action_description( $request->action_name ),
    30012980        'confirm_url' => add_query_arg( array(
    30022981            'action'      => 'confirmaction',
     
    30463025     *     Data relating to the account action email.
    30473026     *
    3048      *     @type string $action_name Name of the action being performed.
    3049      *     @type string $email       The email address this is being sent to.
    3050      *     @type string $description Description of the action being performed so the user knows what the email is for.
    3051      *     @type string $confirm_url The link to click on to confirm the account action.
    3052      *     @type string $sitename    The site name sending the mail.
    3053      *     @type string $siteurl     The site URL sending the mail.
     3027     *     @type WP_User_Request $request User request object.
     3028     *     @type string          $email       The email address this is being sent to.
     3029     *     @type string          $description Description of the action being performed so the user knows what the email is for.
     3030     *     @type string          $confirm_url The link to click on to confirm the account action.
     3031     *     @type string          $sitename    The site name sending the mail.
     3032     *     @type string          $siteurl     The site URL sending the mail.
    30543033     * }
    30553034     */
     
    30673046
    30683047/**
    3069  * Returns a confirmation key for a user action and stores the hashed version.
     3048 * Returns a confirmation key for a user action and stores the hashed version for future comparison.
    30703049 *
    30713050 * @since 4.9.6
     
    30863065    }
    30873066
    3088     update_post_meta( $request_id, '_wp_user_request_confirm_key', $wp_hasher->HashPassword( $key ) );
    3089     update_post_meta( $request_id, '_wp_user_request_confirm_key_timestamp', time() );
     3067    wp_update_post( array(
     3068        'ID'                => $request_id,
     3069        'post_status'       => 'request-pending',
     3070        'post_password'     => $wp_hasher->HashPassword( $key ),
     3071        'post_modified'     => current_time( 'mysql', false ),
     3072        'post_modified_gmt' => current_time( 'mysql', true ),
     3073    ) );
    30903074
    30913075    return $key;
     
    31113095    }
    31123096
    3113     if ( ! in_array( $request['status'], array( 'request-pending', 'request-failed' ), true ) ) {
     3097    if ( ! in_array( $request->status, array( 'request-pending', 'request-failed' ), true ) ) {
    31143098        return __( 'This link has expired.' );
    31153099    }
     
    31243108    }
    31253109
    3126     $key_request_time = $request['confirm_key_timestamp'];
    3127     $saved_key        = $request['confirm_key'];
     3110    $key_request_time = $request->modified_timestamp;
     3111    $saved_key        = $request->confirm_key;
    31283112
    31293113    if ( ! $saved_key ) {
     
    31663150function wp_get_user_request_data( $request_id ) {
    31673151    $request_id = absint( $request_id );
    3168     $request    = get_post( $request_id );
    3169 
    3170     if ( ! $request || 'user_request' !== $request->post_type ) {
     3152    $post       = get_post( $request_id );
     3153
     3154    if ( ! $post || 'user_request' !== $post->post_type ) {
    31713155        return false;
    31723156    }
    31733157
    3174     return array(
    3175         'request_id'            => $request->ID,
    3176         'user_id'               => $request->post_author,
    3177         'email'                 => get_post_meta( $request->ID, '_wp_user_request_user_email', true ),
    3178         'action'                => $request->post_title,
    3179         'requested_timestamp'   => strtotime( $request->post_date_gmt ),
    3180         'confirmed_timestamp'   => get_post_meta( $request->ID, '_wp_user_request_confirmed_timestamp', true ),
    3181         'completed_timestamp'   => get_post_meta( $request->ID, '_wp_user_request_completed_timestamp', true ),
    3182         'request_data'          => json_decode( $request->post_content, true ),
    3183         'status'                => $request->post_status,
    3184         'confirm_key'           => get_post_meta( $request_id, '_wp_user_request_confirm_key', true ),
    3185         'confirm_key_timestamp' => get_post_meta( $request_id, '_wp_user_request_confirm_key_timestamp', true ),
    3186     );
    3187 }
     3158    return new WP_User_Request( $post );
     3159}
     3160
     3161/**
     3162 * WP_User_Request class.
     3163 *
     3164 * Represents user request data loaded from a WP_Post object.
     3165 *
     3166 * @since 4.9.6
     3167 */
     3168final class WP_User_Request {
     3169    /**
     3170     * Request ID.
     3171     *
     3172     * @var int
     3173     */
     3174    public $ID = 0;
     3175
     3176    /**
     3177     * User ID.
     3178     *
     3179     * @var int
     3180     */
     3181
     3182    public $user_id = 0;
     3183
     3184    /**
     3185     * User email.
     3186     *
     3187     * @var int
     3188     */
     3189    public $email = '';
     3190
     3191    /**
     3192     * Action name.
     3193     *
     3194     * @var string
     3195     */
     3196    public $action_name = '';
     3197
     3198    /**
     3199     * Current status.
     3200     *
     3201     * @var string
     3202     */
     3203    public $status = '';
     3204
     3205    /**
     3206     * Timestamp this request was created.
     3207     *
     3208     * @var int|null
     3209     */
     3210    public $created_timestamp = null;
     3211
     3212    /**
     3213     * Timestamp this request was last modified.
     3214     *
     3215     * @var int|null
     3216     */
     3217    public $modified_timestamp = null;
     3218
     3219    /**
     3220     * Timestamp this request was confirmed.
     3221     *
     3222     * @var int
     3223     */
     3224    public $confirmed_timestamp = null;
     3225
     3226    /**
     3227     * Timestamp this request was completed.
     3228     *
     3229     * @var int
     3230     */
     3231    public $completed_timestamp = null;
     3232
     3233    /**
     3234     * Misc data assigned to this request.
     3235     *
     3236     * @var array
     3237     */
     3238    public $request_data = array();
     3239
     3240    /**
     3241     * Key used to confirm this request.
     3242     *
     3243     * @var string
     3244     */
     3245    public $confirm_key = '';
     3246
     3247    /**
     3248     * Constructor.
     3249     *
     3250     * @since 4.9.6
     3251     *
     3252     * @param WP_Post|object $post Post object.
     3253     */
     3254    public function __construct( $post ) {
     3255        $this->ID                  = $post->ID;
     3256        $this->user_id             = $post->post_author;
     3257        $this->email               = $post->post_title;
     3258        $this->action_name         = $post->post_name;
     3259        $this->status              = $post->post_status;
     3260        $this->created_timestamp   = strtotime( $post->post_date_gmt );
     3261        $this->modified_timestamp  = strtotime( $post->post_modified_gmt );
     3262        $this->confirmed_timestamp = (int) get_post_meta( $post->ID, '_wp_user_request_confirmed_timestamp', true );
     3263        $this->completed_timestamp = (int) get_post_meta( $post->ID, '_wp_user_request_completed_timestamp', true );
     3264        $this->request_data        = json_decode( $post->post_content, true );
     3265        $this->confirm_key         = $post->post_password;
     3266    }
     3267}
Note: See TracChangeset for help on using the changeset viewer.