WordPress多站点自定义课程URL重写及获取course-id参数求助
解决WordPress多站点下自定义课程URL优化问题
你已经找对了方向,但问题出在重写规则没有关联到你的模板页面,而且多站点环境下需要处理跨站点查询课程数据的逻辑。我帮你梳理下完整的解决方案:
1. 修正重写规则与查询变量
首先,你的代码需要明确指向作为模板的那个course页面,否则WordPress不知道该加载哪个页面来展示内容。更新后的代码如下:
// 注册自定义查询变量,让WordPress能识别course-name参数 add_filter('query_vars', 'my_course_query_vars', 10, 1); function my_course_query_vars($vars) { $vars[] = 'course-name'; return $vars; } // 添加自定义重写规则 add_action('init', 'my_course_rewrite_rules'); function my_course_rewrite_rules() { // 匹配 /course/课程slug 的路径,指向slug为course的模板页面,并传递course-name参数 add_rewrite_rule( '^course/([^/]+)/?$', 'index.php?pagename=course&course-name=$matches[1]', 'top' ); }
把这段代码添加到你当前站点的主题functions.php里,或者更稳妥的方式是创建一个简单的自定义插件来存放(避免主题更新导致代码丢失)。
2. 刷新重写规则
代码添加后,登录WordPress后台,进入设置 → 固定链接,不需要修改任何设置,直接点击「保存更改」按钮。这一步会让WordPress自动更新rewrite规则,同时更新.htaccess文件(确保服务器给了.htaccess写入权限,如果没权限,页面会显示需要手动添加的规则,复制粘贴进去就行)。
3. 在模板页面获取course-id
你的目标URL里不需要显示course-id,我们可以通过传入的课程slug(也就是原来的course-name参数),跨站点查询站点1里的course自定义文章类型,从而获取对应的ID。在你的course模板页面里添加以下代码:
// 获取URL中传递的课程slug $course_slug = get_query_var('course-name'); if ($course_slug) { // 切换到course自定义文章类型所在的站点1(把1换成你的站点实际ID) switch_to_blog(1); // 根据slug查询对应的课程 $course = get_page_by_path($course_slug, OBJECT, 'course'); if ($course) { $course_id = $course->ID; // 这里就可以使用course_id和课程的其他数据了,比如: echo '当前课程ID:' . $course_id; echo '<h2>' . $course->post_title . '</h2>'; echo '<div>' . apply_filters('the_content', $course->post_content) . '</div>'; } else { echo '抱歉,未找到该课程'; } // 切换回当前站点,避免后续操作出错 restore_current_blog(); }
关键注意事项
- 确保站点1中的
course自定义文章类型设置了publicly_queryable => true,这样才能跨站点查询到它的内容。 - 如果你的模板页面slug不是
course,记得把重写规则里的pagename=course改成实际的页面slug。 - 多站点环境下必须用
switch_to_blog()和restore_current_blog()来切换站点上下文,否则当前站点无法访问其他站点的内容。
内容的提问来源于stack exchange,提问作者Rock
相关产品推荐
相关产品推荐

