为何WP_Query中$category变量参数失效,同值字符串字面量却正常?
问题根源与解决方案
我一眼就看穿问题所在了——你在unset数组元素后,忽略了PHP数组索引不会自动重置的特性!
为什么会出问题?
当你用explode拆分URL得到$pieces数组后,unset掉不符合条件的元素时,数组的索引会变成“断裂”的状态。举个实际例子:
假设你的$_SERVER['REQUEST_URI']是"/page/123/",explode后得到的数组是:
["", "page", "123", ""]
经过你的unset逻辑处理后,空字符串和数字元素被删除,剩下的数组是[1 => "page"]——索引是1,而不是你以为的0。这时候你去取$pieces[0],这个索引根本不存在,所以$category会被赋值为NULL。哪怕你强制转成string,得到的其实是空字符串"",而不是你预期的"page"——这就是为什么直接传字面量"page"正常,用变量就失效的核心原因。
两种解决方法
方法一:重置数组索引(快速修复现有代码)
在unset操作完成后,用array_values()重新整理数组的索引,让它从0开始连续排列:
$current = $_SERVER['REQUEST_URI']; $pieces = explode("/", $current); foreach ($pieces as $key=>$piece) { if ($piece == "some value" || is_numeric($piece) || $piece == "") { unset($pieces[$key]); } } // 关键步骤:重置数组索引,让有效元素从0开始排列 $pieces = array_values($pieces); $category = $pieces[0]; // 现在这里才是你要的"page" echo gettype($category); // 此时会返回string
方法二:直接收集有效元素(更高效推荐)
与其先拆分再删除无效元素,不如直接在循环里把符合要求的元素收集到新数组里,这样天然就是连续索引,避免索引断裂的问题:
$current = $_SERVER['REQUEST_URI']; $pieces = explode("/", $current); $validPieces = []; foreach ($pieces as $piece) { // 只保留符合要求的元素 if ($piece != "some value" && !is_numeric($piece) && $piece != "") { $validPieces[] = $piece; } } $category = $validPieces[0]; // 直接取索引0即可
验证效果
用上面任意一种方法处理后,$category都会是真正的"page"字符串,传入WP_Query的category_name参数后,查询功能就会正常工作了。
内容的提问来源于stack exchange,提问作者AKor
相关产品推荐
相关产品推荐

