如何在LearnPress 4.x的课程归档页每个课程卡片中显示ACF自定义字段duration
如何在LearnPress 4.x的课程归档页每个课程卡片中显示ACF自定义字段duration
我之前折腾LearnPress 4.x的时候也碰到过类似的钩子失效、模板找不到的问题,给你分享两个亲测有效的方案,都是基于子主题操作,完全不用担心破坏原插件和主题的结构:
方案一:用LearnPress 4.x正确的循环钩子(推荐)
LearnPress 4.x对课程循环的钩子做了重构,你之前用的learn-press/after-courses-loop-item这类都是旧版本的钩子,自然不会生效。新版的钩子都是以learnpress/course/loop/item/开头的,精准对应课程卡片里的各个位置。
比如你要在课程标题之后显示时长,直接在子主题的functions.php里加这段代码就行:
add_action( 'learnpress/course/loop/item/after-title', 'display_acf_duration_in_course_card' ); function display_acf_duration_in_course_card() { // 先拿到当前循环里的课程对象 $course = learn_press_get_course(); if ( !$course ) return; // 用ACF的get_field获取duration字段,第二个参数传课程ID $duration = get_field( 'duration', $course->get_id() ); // 有值才显示,避免空内容 if ( $duration ) { echo '<div class="course-duration" style="margin: 8px 0; color: #666;">时长:' . esc_html( $duration ) . '</div>'; } }
- 如果你觉得位置不对,还可以换其他钩子:比如
learnpress/course/loop/item/before-price(价格之前)、learnpress/course/loop/item/after-price(价格之后),都是每个课程卡片内部触发的。 - 注意
duration要和你ACF里创建的字段键名完全一致,别写错了。
方案二:正确覆盖LearnPress的课程卡片模板
你之前改content-course.php没反应,是因为LearnPress 4.x已经把课程卡片的模板拆分到新路径了,旧的模板文件已经被弃用。现在课程卡片的核心模板是learnpress/templates/course/loop/item.php(插件目录下的路径)。
要在子主题里覆盖这个模板:
- 在你的子主题目录下创建路径:
learnpress/course/loop/ - 把插件里的
item.php文件复制到子主题的这个路径下 - 打开子主题里的
item.php,在你想要显示时长的位置(比如标题和价格之间)插入这段代码:
<?php $course = learn_press_get_course(); $duration = get_field( 'duration', $course->get_id() ); if ( $duration ) : ?> <div class="course-duration" style="margin: 8px 0; color: #666;">时长:<?php echo esc_html( $duration ); ?></div> <?php endif; ?>
这种方法的好处是可以完全自定义HTML结构,适合需要调整卡片布局的场景;缺点是如果以后LearnPress更新了这个模板的核心代码,你可能需要同步子主题里的模板内容(不过一般插件不会轻易改核心循环的结构)。
最后再提两个注意点
- 不管用哪种方法,都必须在子主题里操作,别直接改插件文件,不然插件一更新你的修改就没了。
- 确保你的ACF字段是绑定到LearnPress的「课程」自定义文章类型的,不然
get_field会拿不到值。
内容来源于stack exchange
相关产品推荐
相关产品推荐

