The Snippet below is not intended to be used before version 2.0, but it's here and will work as some users have asked for access. This will be released as part of standard access.
The [user_access_list] shortcode will generate a block to link to accessed posts like the one below.

You can use the following snippet to recreate this:
You will need to delete or disable this code before updating to 2.0!
/** * Shortcode to list posts a user has purchased access to (or show All Access status). * Usage: place `[user_access_list]` in any page or post. */function rup_shortcode_user_access_list( $atts ) { if ( ! is_user_logged_in() ) { return '<p>Please <a href="' . wp_login_url( get_permalink() ) . '">log in</a> to view your purchased content.</p>'; } $user_id = get_current_user_id(); // Query allowed posts $allowed = get_user_meta( $user_id, 'allowed_posts', true ); $has_individual = ! empty( $allowed ) && is_array( $allowed ); // Start output with title $output = '<h2 class="rup-access-title">Purchased Post Access</h2>'; // All-Access users if ( get_user_meta( $user_id, 'all_access_granted', true ) === '1' ) { $output .= '<div class="rup-access-list">'; $output .= '<div class="rup-access-item rup-all-access-item">' . '<span class="rup-access-text">You are an</span>' . '<span class="rup-access-highlight">All Access</span>' . '<span class="rup-access-text">user and can view all protected content</span>' . '<span class="rup-access-arrow">→</span>' . '</div>'; $output .= '</div>'; return $output; } // Individual access without any purchases if ( ! $has_individual ) { $output .= '<p>You have not purchased access to any posts yet.</p>'; return $output; } // Query and list purchased posts $args = array( 'post_type' => rup_sell_ind_posts_get_protected_post_types(), 'post__in' => $allowed, 'posts_per_page' => -1, 'orderby' => 'post_date', 'order' => 'DESC', ); $query = new WP_Query( $args ); if ( ! $query->have_posts() ) { $output .= '<p>You have not purchased access to any posts yet.</p>'; return $output; } $output .= '<div class="rup-access-list">'; while ( $query->have_posts() ) { $query->the_post(); $output .= sprintf( '<a class="rup-access-item" href="%1$s">%2$s <span class="rup-access-arrow">→</span></a>', esc_url( get_permalink() ), esc_html( get_the_title() ) ); } wp_reset_postdata(); $output .= '</div>'; return $output;}add_shortcode( 'user_access_list', 'rup_shortcode_user_access_list' ); // Inline styling for a clean card-style list, title, and all-access noticefunction rup_enqueue_access_list_styles() { wp_add_inline_style( 'wp-block-library', " .rup-access-title { font-size: 1.2em; font-weight: bold; margin-bottom: 0.75em; } .rup-access-list { display: grid; gap: 0.5em; } .rup-access-item { display: flex; justify-content: space-between; align-items: center; padding: 0.75em 1em; background: #fff; border: 1px solid #ddd; border-radius: 4px; text-decoration: none; } .rup-access-item:hover { background: #f9f9f9; border-color: #ccc; } .rup-access-arrow { font-size: 1.2em; } /* All-Access card: align items together with minimal gap */ .rup-all-access-item { display: flex; justify-content: flex-start; align-items: center; gap: 0.25em; background: #e6fffa; border: 1px solid #38b2ac; } .rup-access-text { white-space: nowrap; } .rup-access-highlight { font-weight: bold; } " );}add_action( 'wp_enqueue_scripts', 'rup_enqueue_access_list_styles' );