1

我找到了一个代码片段来在下拉菜单中显示类别。它工作正常,但是当我打开 时define('WP_DEBUG', true);,Wordpress 会显示上述警告。我刚开始使用 php,无法弄清楚如何解决此警告。谁能帮我解决这个问题并告诉我为什么会收到此消息?

<?php
function replace_id_for_slug($option){
        $categories = get_categories("hide_empty=0");
        preg_match('/value="(\d*)"/', $option[0], $matches);
        $id = $matches[1]; //problem on this line!
        $slug = "";
    foreach($categories as $category){
        if($category->cat_ID == $id){
            $slug = $category->slug;
            }
    }
return preg_replace("/value=\"(\d*)\"/", "value=\"$slug\"", $option[0]);
}
$select = wp_dropdown_categories("show_option_none=Category&hierarchical=1&hide_empty=0&echo=0");
$select = preg_replace_callback("#<option[^>]*>[^<]*</option>#", "replace_id_for_slug", $select);
echo $select; ?>
4

2 回答 2

2
preg_match('/value="(\d*)"/', $option[0], $matches);
$id = $matches[1]; //problem on this line!

您没有检查是否有任何匹配项。如果没有匹配,$matches[1]则不存在。相当不言自明!

我建议像:

function replace_id_for_slug($option) {

    $categories = get_categories("hide_empty=0");
    preg_match('/value="(\d*)"/', $option[0], $matches);

    if (!$matches) {
       // return as if $id is empty if no match
       return preg_replace('/value="(\d*)"/', 'value=""', $option[0]);
    }

    $id   = $matches[1];
    $slug = "";

    foreach ($categories as $category) {
        if ($category->cat_ID == $id) {
            $slug = $category->slug;
        }
    }

    return preg_replace('/value="(\d*)"/', 'value="' . $slug . '"', $option[0]);
}

如果这是一个 Wordpress 核心功能:

真正发生的是 Wordpress 作者真的很懒惰,他们没有编写上述修复程序,而是允许 PHP 忽略这个问题,使用E_NOTICE. 您看到它是因为他们的“调试模式”正在打开某些错误报告功能。

于 2011-08-13T14:50:54.537 回答
1

这可能是因为正则表达式不匹配任何内容,因此 $matches[1] 未定义。

如果preg_match没有找到任何东西,则 $matches 是一个空数组。您可以更改代码以检查是否preg_match实际匹配某些内容:

if (preg_match('/value="(\d*)"/', $option[0], $matches)){
    $id = $matches[1];
} else {
    // set id to a different value.
}
于 2011-08-13T14:45:19.103 回答