未定义的属性:DOMDocument :: $ tagName

时间:2015-09-17 10:18:58

标签: php wordpress

我在WP的debug.log文件中收到以下错误。

PHP注意:未定义的属性:第441行的... / wp-content / themes / theme-name / libs / oi / functions.php中的DOMDocument :: $ tagName

PHP注意:尝试在第441行的... / wp-content / themes / theme-name / libs / oi / functions.php中获取非对象的属性

function oi_display_hierarchy( $nav_menu, $args )
{
    if( ! is_single() )
    {
        return $nav_menu;
    }

    $menuXML = new SimpleXMLElement( $nav_menu );
    list($current) = $menuXML->xpath( "//li[contains(@class,'current-menu-parent')]" );
    if( !empty( $current ) )
    {
        $node = dom_import_simplexml($current);
        while($node)
        {
            $node = $node->parentNode;
            if( $node->tagName == 'li' ) // 441 - The problem line
            {
                $classes = $node->getAttribute('class');
                $node->setAttribute('class', $classes . ' current-menu-ancestor current-menu-parent current_page_parent current_page_ancestor');
            }
        }
    }

    return str_replace('<?xml version="1.0"?>', '', $menuXML->asXML());
}
add_filter('wp_nav_menu', 'oi_display_hierarchy', 11, 2);

任何想法可能是什么问题?

1 个答案:

答案 0 :(得分:0)

您正尝试在上面的行上获取当前DOMElement对象父节点:

$node = $node->parentNode;

之后,$node将更改为DOMNodeDOMElement继承DOMNode)。 tagName属性不是DOMNode定义的一部分,它是DOMElement特有的 - 这就是它抛出错误的原因。

xml中的所有内容都是一个节点 - 文本,行,注释......因此DOMNode 可以一个标记,但它也可以是其他内容。因此,我们需要使用以下内容检查节点的类型:

if($node->nodeType == XML_ELEMENT_NODE) { // Node is a DOMElement

这样我们确定$ node是DOMElement,然后可以安全使用tagName属性。