一个复杂的查询,结合了WP课件功能,ACF转发器字段和寻找特定模板文件的元查询

问题描述 投票:0回答:1

我有一个非常复杂的查询,我无法以我需要的方式工作。

我使用插件WP课件和ACF进行Wordpress安装。我需要显示与当前用户相关的课程页面。我希望链接能够引导用户进入用户在开始课程之前应该点击的“主页”页面。我创建了课程“主页”,但问题是WP课件无法将页面与课程相关联。所以我不得不使用一个ACF选项转发器,它将课程ID与必要的课程页面相关联。我知道其中一个相关页面是课程“主页”的唯一方法是我用于课程主页的模板。

因此,循环内的循环需要首先确定当前用户可以访问哪些课程,获取这些课程ID,循环ACF选项转发器以查找与这些课程ID相关联的页面,然后这些页面循环以找出哪一个(那里)每个课程只有一个)使用课程主页模板。我发现的最后一个循环需要是一个WP_Query循环,因为这是查询Wordpress模板的唯一方法。

我迷失了循环,而且我遇到了最艰难的时刻。我认为使用WP_Query查询Wordpress模板和ACF转发器的数组元查询(确定ACF转发器课程ID是否与用户有权访问的课程ID相匹配)可能更简单也更直接但我的尝试是查询ACF转发器子字段不起作用。

这是我的代码:

$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;

这将显示与用户课程相关的所有页面,而不仅仅是使用课程主页模板的页面。我不知何故必须将WP_Query与这些args合并在一起,而我所做的一切都没有奏效:

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

如果我能以某种方式将WP查询转换为if语句(如果template = page-course-home.php),我可以在关联页面查询中将其显示为仅显示课程主页。或者可能有另一种更好的方式来做我需要做的事情。我感谢所有的反馈。

php wordpress templates advanced-custom-fields
1个回答
0
投票

好的,我得到了一些工作!我认为花费这么多时间来解决这个问题有助于我看到一种方法可以做到:

$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;

这看起来有点麻烦,但它确实有效。我不确定它是否会更好但是将ACF子字段查询合并到元查询中似乎更优雅,因此可以消除两个循环。如果有人对此有任何想法,我很乐意听到他们。

© www.soinside.com 2019 - 2024. All rights reserved.