0
votes

I have a pretty complicated query that I have not been able to get to work the way I need it to.

I have a Wordpress install using the plugins WP Courseware and ACF. I need to display a page of courses associated with the current user. I want the links to lead the user to the course "home" pages that the user should hit prior to starting the course. I have created course "home" pages, but the problem is WP Courseware has no way to associate a page with a course. So I had to use an ACF options repeater that associates the course ID with whatever course pages are necessary. The only way I know that one of those associated pages is the course "home" page is by the template I use for course home pages.

So the loops within loops need to first determine what courses the current user has access to, get those course IDs, loop the ACF options repeater to find the pages associated with those course IDs, then of those pages loop to find out which one (there is only one per course) uses the course home page template. This last loop I discovered needs to be a WP_Query loop as that's the only way to query for a Wordpress template.

I am lost in loops and I'm having the hardest time. I thought it might be simpler and most direct to use the WP_Query to query an array meta_queries of both the Wordpress template and the ACF repeater (to determine is the ACF repeater course ID matches the course ID the user has access to) but my attempts at querying ACF repeater sub fields is not working.

Here's my code:

$user = wp_get_current_user();
$user_id = $user->ID;
$user_course_list = WPCW_users_getUserCourseList($user_id);
$course_association_arr = get_field('course_association', 'option');
// Loop through user's courses
foreach ( $user_course_list as $user_course ) : 
    $course_id = $user_course->course_id;
    $course_title = $user_course->course_title;
    // Loop through the ACF course ID/page associations
    foreach ( $course_association_arr as $course_association ) :
        $assoc_course_id = $course_association['wp_courseware_id'];
        if ( $course_id == $assoc_course_id ) :
            // Loop through the ACF associated pages
            foreach ( $course_association['associated_pages'] as $associated_page ) :
                $page_id = $associated_page->ID;
                $page_url = $associated_page->guid;
                echo '<li><a href="' . $page_url . '">'. $course_title . '</a></li>';
            endforeach;
        endif;
    endforeach;
endforeach;

This displays all pages associated with a user's courses, not just the ones using the course home template. I somehow have to incorporate a WP_Query with these args in there and nothing I have done has worked:

$args = array(
    'post_type' => 'page',
    'meta_query' => array(
        array(
            'key' => '_wp_page_template',
            'value' => 'page-course-home.php',
        ),
    )
);

If I could somehow turn the WP query into an if statement (if template = page-course-home.php) I could have that inside the associated pages query to only show course home pages. Or there maybe another more brilliant way to do what I need to do. I appreciate all feedback.

1

1 Answers

0
votes

Ok I got something to work! I think spending so much time framing the question here helped me see one way I could do it:

$user = wp_get_current_user();
$user_id = $user->ID;
$user_course_list = WPCW_users_getUserCourseList($user_id);
$course_association_arr = get_field('course_association', 'option');
// Loop through user's courses
foreach ( $user_course_list as $user_course ) : 
    $course_id = $user_course->course_id;
    $course_title = $user_course->course_title;
    // Loop through the ACF course ID/page associations
    foreach ( $course_association_arr as $course_association ) :
        $assoc_course_id = $course_association['wp_courseware_id'];
        if ( $course_id == $assoc_course_id ) :
            // Loop through the ACF associated pages
            foreach ( $course_association['associated_pages'] as $associated_page ) :
                $page_id = $associated_page->ID;
                $page_url = $associated_page->guid;
                $args = array(
                    'post_type' => 'page',
                    'page_id' => $page_id,
                    'meta_query' => array(
                        array(
                            'key' => '_wp_page_template',
                            'value' => 'page-course-home.php',
                        ),
                    )
                );
                $course_assoc_pages = new WP_Query( $args );
                if( $course_assoc_pages->have_posts() ) :
                    while ( $course_assoc_pages->have_posts() ) : $course_assoc_pages->the_post();
                        echo '<li><a href="' . $page_url . '">'. $course_title . '</a></li>';
                    endwhile;
                endif;
                wp_reset_query();
            endforeach;
        endif;
    endforeach;
endforeach;

This seems a bit cumbersome, but it works. I'm not sure if it would be better but it seems more elegant to incorporate the ACF subfield query into the meta query, so could eliminate two of the loops. If anyone has any thoughts on this I would love to hear them.