如何将模板部件中的变量设为全局变量,使其可在页面模板中调用?
如何将模板部件中的变量设为全局变量,使其可在页面模板中调用?
嘿,我看你是想把模板部件里的自定义帖子类型标题变量拿到页面模板里用对吧?你现在的做法方向有点搞反了,set_query_var()其实是用来给模板部件传递变量的,不是反过来从模板部件往外传,而且你先调用get_query_var()再加载模板部件,这时候变量还没被赋值,自然拿不到。下面给你几个靠谱的解决办法:
方法一:用全局变量(最简单直接)
这个方法上手最快,只需要给变量加上全局声明就行,注意给变量起个独特的名字,避免和其他全局变量冲突。
第一步:修改你的模板部件 roster-get-annual-data.php
在WP查询的循环里,把$post_title改成全局变量:
if ($rosterQuery->have_posts()) { while ($rosterQuery->have_posts()) { $rosterQuery->the_post(); // 声明全局变量,用独特的名字避免冲突 global $annual_roster_post_title; $annual_roster_post_title = $post->post_title; ?> <h1><?php echo $annual_roster_post_title; ?></h1> <!-- 剩下的模板内容(teams-wrapper、players循环等)保持不变 --> <?php } wp_reset_postdata(); }
第二步:在页面模板中调用变量
现在要先加载模板部件(这样变量才会被赋值),再声明全局变量使用:
// 先加载模板部件,执行里面的查询和变量赋值 get_template_part('template-parts/roster-get-annual', 'data'); // 声明全局变量后就能直接用了 global $annual_roster_post_title; // 比如你可以这样输出或者做其他处理 echo "拿到的标题是:{$annual_roster_post_title}";
方法二:把模板部件改成函数(更规范,适合复杂场景)
如果不想用全局变量,也可以把模板部件的逻辑封装成一个函数,让它同时返回输出内容和需要的变量,这样更符合代码规范。
第一步:在主题的functions.php里添加函数
把模板部件里的查询和输出逻辑移到这个函数里:
function get_roster_annual_data() { // 开启输出缓冲,捕获模板内容 ob_start(); $target_post_title = ''; // 这里放你的WP查询代码(注意替换成你实际的查询参数) $rosterQuery = new WP_Query(array( 'post_type' => '你的自定义帖子类型', // 其他查询参数... )); if ($rosterQuery->have_posts()) { while ($rosterQuery->have_posts()) { $rosterQuery->the_post(); $target_post_title = $post->post_title; ?> <h1><?php echo $target_post_title; ?></h1> <!-- 剩下的模板内容(teams-wrapper、players循环等)保持不变 --> <?php } wp_reset_postdata(); } // 捕获并清理输出缓冲 $template_content = ob_get_clean(); // 返回一个数组,包含输出内容和标题变量 return array( 'content' => $template_content, 'post_title' => $target_post_title ); }
第二步:在页面模板中调用函数
// 调用函数拿到内容和变量 $roster_data = get_roster_annual_data(); // 输出模板部件的内容 echo $roster_data['content']; // 使用标题变量 echo "拿到的自定义帖子类型标题:{$roster_data['post_title']}";
为啥你原来的方法不行?
再给你补个小知识点:set_query_var('key', $value)是用来把$value传递给即将加载的模板部件的,比如你在页面模板里先set_query_var('test', 'hello'),再调用get_template_part(),这样模板部件里就能用get_query_var('test')拿到hello。但你是想反过来从模板部件把变量传到页面模板,所以这个方法方向完全反了,而且你先调用get_query_var()再加载模板,这时候变量还没被赋值,自然拿不到内容。
备注:内容来源于stack exchange,提问作者RRhodes
相关产品推荐
相关产品推荐

