WordPress中如何显示已选中的多个复选框?
WordPress子页面多选复选框显示问题修复
错误根源
checked()函数参数误用:该函数第二个参数要求是单个值或布尔值,你传入了数组$solution_innerpage_checked,PHP尝试将数组转为字符串时触发Array to string conversion警告。- 数组重复填充冗余:在
while循环内部反复遍历$solution_innerpage_checked给$ids添加元素,导致数组无意义膨胀。 get_post_meta参数错误:存储值为数组时,第三个参数设为true会强制转为字符串,应设为false直接获取数组。
修复后的完整代码
function inner_childpage_list() { global $post; // 直接获取存储的数组,第三个参数设为false $solution_innerpage_checked = get_post_meta($post->ID, 'solution_innerpage_checked', false); // 确保$ids为数组,避免未定义警告 $ids = is_array($solution_innerpage_checked) ? $solution_innerpage_checked : []; $args = array( 'post_type' => 'solution', 'orderby' => 'date', 'order' => 'DESC', 'post_status' => 'publish', 'post__not_in' => array($post->ID), 'post_parent' => $post->post_parent, ); $loop = new WP_Query($args); $data = ''; if ( $loop->have_posts() ) { while($loop->have_posts()): $loop->the_post(); // 通过in_array判断当前页面是否被选中,生成正确的checked属性 $checked_attr = checked(in_array($post->ID, $ids), true, false); $data .= '<input type="checkbox" name="solution_innerpage_checked[]" value="'.$post->ID.'" '.$checked_attr.' >'; $data .= '<label>'.esc_html(get_the_title()).'</label>'; endwhile; wp_reset_postdata(); // 重置查询,避免影响全局post对象 } else { $data .= '<div>暂无子页面</div>'; } return $data; }
核心修复说明
- 修正元数据获取逻辑:
get_post_meta第三个参数改为false,直接拿到存储的数组,无需手动循环转存。 - 修复
checked()调用:用in_array返回的布尔值和true对比,符合函数参数要求,解决数组转字符串的错误。 - 移除冗余循环:删除
while内部的foreach,直接用获取到的数组初始化$ids,避免重复填充。 - 添加查询重置:调用
wp_reset_postdata()修复WP_Query后未重置全局post的问题,防止后续模板逻辑出错。
内容的提问来源于stack exchange,提问作者Naren Verma
相关产品推荐
相关产品推荐

