WordPress短代码如何接收分类参数调用指定分类文章
问题原因
核心问题出在WordPress短代码的解析规则:所有传入的短代码属性名会被自动转为全小写。你代码里用驼峰格式的pageCategory作为参数键,和解析后生成的全小写键pagecategory无法匹配,导致参数始终读取你设置的空字符串默认值。当WP_Query的category_name参数为空时,会默认查询全站所有文章,这就是传参失效、硬编码默认值却能正常工作的根本原因。
另外代码里还有3个会导致异常的隐性问题:
$string变量未提前初始化,PHP开启错误提示时会抛出未定义变量警告wp_reset_postdata()写在return语句之后,永远不会执行,会污染全局主查询,导致页面其他位置的文章数据错乱- 输出特色图片时使用了未定义的
$post_id变量,会导致特色图片加载异常
修改方案
统一将参数键改为WordPress推荐的全小写下划线命名格式,同时修复上述隐性问题,完整可用代码如下:
function wpb_postsbycategory($atts) { // 提前初始化输出变量,避免PHP警告 $string = ''; // 参数键使用全小写下划线命名,匹配WordPress解析规则 $a = shortcode_atts( [ 'page_category' => '' ], $atts, 'categoryposts' ); // 参数为空时直接返回提示,避免无意义查询全部文章 if ( empty($a['page_category']) ) { return '<ul class="postsbycategory widget_recent_entries"><li>请指定要展示的分类别名</li></ul>'; } // 构建查询 $the_query = new WP_Query( [ 'category_name' => sanitize_title($a['page_category']), // 安全转义,该参数仅接收分类别名(slug) 'posts_per_page' => 15 ] ); // 循环输出文章 if ( $the_query->have_posts() ) { $string .= '<ul class="postsbycategory widget_recent_entries">'; while ( $the_query->have_posts() ) { $the_query->the_post(); if ( has_post_thumbnail() ) { $string .= '<li>'; // 用get_the_ID()获取当前循环文章ID,替换未定义的$post_id $string .= '<a href="' . get_the_permalink() .'" rel="bookmark">' . get_the_post_thumbnail(get_the_ID(), [50, 50]) . get_the_title() .'</a></li>'; } else { $string .= '<li><a href="' . get_the_permalink() .'" rel="bookmark">' . get_the_title() .'</a></li>'; } } $string .= '</ul>'; } else { $string .= '<ul class="postsbycategory widget_recent_entries"><li>未找到对应分类下的文章</li></ul>'; } // 恢复全局主查询数据,移到return前保证执行 wp_reset_postdata(); return $string; } // 注册短代码 add_shortcode('categoryposts', 'wpb_postsbycategory');
调用方式
短代码调用时属性名和修改后的参数键保持一致即可,示例:
[categoryposts page_category="your-category-slug"]
注意:WP_Query的
category_name参数接收的是分类的别名(slug),不是后台看到的分类显示名称,传参时请填入目标分类的别名才能正常匹配。
如果你不想修改原驼峰的属性名,也可以把shortcode_atts里的参数键改为全小写的pagecategory,短代码继续用pageCategory='xxx'也能正常匹配,但这种写法不符合WordPress开发规范,不推荐使用。
内容的提问来源于stack exchange,提问作者Twombly12
相关产品推荐
相关产品推荐

