I'm absolutely stumped and I'm hoping this is something stupid that I just can't see because I'm too close to it.

Working on an LMS using Sensei. Trying to get the course_id from a lesson. Pretty simple, it's just meta data on a custom post type.

Cut everything down to this simple statement:

echo 'Course ID: ' . get_post_meta(17234, '_lesson_course', true);

I checked the database, the data is definitely there: enter image description here

And there's only one match.

But, it always just returns an empty string (or an empty array if I set the final argument to false).

Did some more digging. Found that my issue is my new function, but I don't know why.

Here's the entire mess:

function search_results_per_page( $query ) {
    echo 'Checking';
    if ( $query->is_search() ) {
        $accessible_post_ids = get_accessible_post_ids();
        $query->set('post__in', $accessible_post_ids);
    return $query;
add_action( 'pre_get_posts',  'search_results_per_page'  );

function get_accessible_post_ids() {
    $allowed_posts = [];
    $user_id = get_current_user_id();
    $args = array('posts_per_page' => -1, 'post_type' => array('lesson', 'course', 'page'));
    $search_posts = new WP_Query($args);
    while($search_posts->have_posts()) {
        $post_type = get_post_type();
        $post_id = get_the_id();
        switch($post_type) {
            case 'lesson':
                echo 'Post ID: ' . $post_id;
                $course_id = get_post_meta($post_id, '_lesson_course', true);    
                echo ' Course ID: ' . $course_id . '<br>';
                if(sensei_has_user_started_course($course_id, $user_id)) {
                    $allowed_posts[] = $post_id;
            case 'course':
                if(sensei_has_user_started_course($post_id, $user_id)) {
                    $allowed_posts[] = $post_id;
                $allowed_posts[] = $post_id;
    return $allowed_posts;

For whatever reason, once I'm inside the while loop, get_post_meta no longer works. I sort of expected the while loop to fail, because it seems like it might be an infinitely re-occuring loop with the filter, but it seems to run. Just the get_post_meta returns an empty string.

Any brilliant thoughts out there?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.