自定义WordPress AJAX筛选函数渲染Twig文件时变量不生效的问题
问题根因
渲染Twig模板时你传入的$context没有绑定当前循环的文章对象。在AJAX请求场景下,Timber的全局上下文不会自动将主查询循环里的post数据注入到模板变量中,所以模板只能渲染出静态的HTML结构,所有依赖post的动态字段(文章标题、链接、缩略图等)全部为空,没有实际内容。
具体修复方案
1. 修改functions.php里的AJAX回调函数
核心调整点是每轮循环单独将当前文章的Timber实例绑定到对应渲染的context里,不要直接复用没有绑定post的全局$context。
修改后的完整函数代码如下:
function ajax_filter_function() { // 校验请求参数,可根据自身逻辑补充nonce、权限校验 if ( ! isset( $_POST['categoryFilter'] ) ) { wp_die(); } $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; // 加载Timber基础全局上下文(自动包含站点配置、自定义options等公共变量) $context = Timber::context(); $args = [ 'posts_per_page' => -1, 'paged' => $paged, 'tax_query' => [ [ 'taxonomy' => 'category', 'field' => 'slug', // 对传入的分类参数做安全过滤 'terms' => sanitize_text_field( $_POST['categoryFilter'] ), ], ], ]; $query = new WP_Query( $args ); if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); // 关键:将当前循环的文章实例绑定到本轮渲染的context中 $context['post'] = new Timber\Post( get_the_ID() ); // 渲染时传入带当前post的context Timber::render( 'partial/tease-post.twig', $context ); } wp_reset_postdata(); } else { echo '<div class="col-12"><h2>No posts found</h2></div>'; } die(); }
2. 无需修改现有Twig模板
你写的tease-post.twig逻辑完全符合Timber的变量规范,只要context中正确传入了Timber\Post类实例,模板里的post.title、post.link、post.thumbnail、post.terms、post.preview等变量都会正常输出。
注意事项
- 不要在AJAX回调里直接使用全局作用域下未初始化的
$context,这个全局变量在普通页面模板里是靠Timber的模板加载机制自动注入post数据的,AJAX场景不走这套加载流程,必须手动给context赋值对应的post对象 - 模板里用到的
options默认缩略图变量,会被Timber::context()方法自动合并到context中,不需要额外手动赋值 - 生产环境一定要给AJAX接口加上nonce校验、权限校验、输入过滤,避免安全风险
内容的提问来源于stack exchange,提问作者user3767773
相关产品推荐
相关产品推荐

