如何在WordPress中创建单篇文章自定义下载页面
解决WordPress文章下载路径无法获取自定义字段的问题
一、添加自定义重写规则
WordPress默认不会识别文章URL后追加的/download路径,需要先添加重写规则,让系统将该路径映射到对应文章的查询逻辑中。
将以下代码添加到主题的functions.php文件或自定义插件中:
// 注册下载页面重写规则 function add_download_rewrite_rule() { add_rewrite_rule( '^([^/]+)/download/?$', 'index.php?name=$matches[1]&download_page=1', 'top' ); } add_action('init', 'add_download_rewrite_rule'); // 添加自定义查询变量,让WordPress识别download_page参数 function add_download_query_var($vars) { $vars[] = 'download_page'; return $vars; } add_filter('query_vars', 'add_download_query_var');
添加完成后,进入WordPress后台「设置-固定链接」页面,直接点击「保存更改」(无需修改任何设置),触发重写规则刷新。
二、创建下载页面模板
在主题目录下新建一个名为single-download.php的模板文件,内容如下:
<?php /** * Template: 文章专属下载页 */ // 验证是否为下载请求且存在对应文章 if (get_query_var('download_page') && have_posts()) { the_post(); // 获取自定义字段中的下载链接 $download_url = get_post_meta(get_the_ID(), 'download_id', true); ?> <!DOCTYPE html> <html <?php language_attributes(); ?>> <head> <meta charset="<?php bloginfo('charset'); ?>"> <title><?php the_title(); ?> - 下载页面</title> <?php wp_head(); ?> </head> <body> <div class="download-wrap"> <h1><?php the_title(); ?> 资源下载</h1> <?php if (!empty($download_url)) : ?> <a href="<?php echo esc_url($download_url); ?>" class="download-btn" target="_blank">点击开始下载</a> <?php else : ?> <p>该文章暂未设置可用下载链接</p> <?php endif; ?> <p><a href="<?php the_permalink(); ?>">返回文章详情页</a></p> </div> <?php wp_footer(); ?> </body> </html> <?php } else { // 无对应文章时显示404页面 get_template_part('404'); } ?>
三、可选:用钩子替代独立模板(无需新建文件)
如果不想单独创建模板文件,可通过template_include钩子直接在现有模板逻辑中插入下载页内容,代码如下:
function inject_download_page_content($template) { if (get_query_var('download_page')) { ob_start(); if (have_posts()) { the_post(); $download_url = get_post_meta(get_the_ID(), 'download_id', true); ?> <div class="download-page"> <h2><?php the_title(); ?> 下载</h2> <?php if (!empty($download_url)) : ?> <a href="<?php echo esc_url($download_url); ?>" class="download-button">立即下载</a> <?php else : ?> <p>抱歉,此文章未配置下载链接</p> <?php endif; ?> <p><a href="<?php the_permalink(); ?>">回到文章详情</a></p> </div> <?php } else { get_template_part('404'); } $content = ob_get_clean(); echo $content; exit; // 终止原有模板加载,直接输出下载页内容 } return $template; } add_filter('template_include', 'inject_download_page_content');
四、调试验证
- 访问任意已设置
download_id字段的文章的/download路径(如https://example.com/your-post-slug/download/),检查是否正常显示下载按钮。 - 若无法正常加载,排查以下点:
- 确认
download_id自定义字段已正确保存下载链接(可在文章编辑页的「自定义字段」面板查看); - 在模板中加入
var_dump(get_query_var('download_page')),验证重写规则是否生效; - 确保代码已正确添加到
functions.php或自定义插件中,且主题未禁用自定义重写规则。
- 确认
内容的提问来源于stack exchange,提问作者James Son
相关产品推荐
相关产品推荐

