Just had a WordPress site updated with the latest Custom Contact Forms. After the update the site is no longer loading and I see these errors:
[27-Jun-2015 06:01:05 UTC] PHP Warning: SimpleXMLElement::__construct(): Entity: line 130: parser error : Opening and ending tag mismatch: wphead line 1 and script in /storage/web/public/sites/www.site.nl/wp-content/themes/site/vihv/control/TControl.php on line 91 [27-Jun-2015 06:01:05 UTC] PHP Warning: SimpleXMLElement::__construct(): </script> in /storage/web/public/sites/www.site.nl/wp-content/themes/site/vihv/control/TControl.php on line 91 [27-Jun-2015 06:01:05 UTC] PHP Warning: SimpleXMLElement::__construct(): ^ in /storage/web/public/sites/www.site.nl/wp-content/themes/site/vihv/control/TControl.php on line 91 [27-Jun-2015 06:01:05 UTC] PHP Warning: SimpleXMLElement::__construct(): Entity: line 148: parser error : Sequence ']]>' not allowed in content in /storage/web/public/sites/www.site.nl/wp-content/themes/site/vihv/control/TControl.php on line 91
The first error refers to this function:
function GetXml() { try { $Xml = new SimpleXmlElement(TXml::MakeTree($this->GetData(), get_class($this))); return $Xml->asXml(); } catch(Exception $e) { //print_r($this->GetData()); } return "<".get_class($this)."/>"; }
But these errors are only PHP warnings, not fatal errors. But I get the white screen of death anyways.
I am not familiar with XML and XML parsing. Theme was created by third party developer and have not been able to contact him as of yet. It has been a while since this theme has been created. I did uncomment the print_r to see what would show and all was printed and the first array showing up was:
Array ( [THeadControl] => Array ( [wphead] => ]]> [template_url] => http://www.site.nl/wp-content/themes/site [title] => ) [TLeftBlockContainer] => Array ( [THeaderControl] => Array ( [siteurl] => http://www.site.nl [siteTitle] => VERLOSKUNDIGENPRAKTIJK site [headpic] => http://www.site.nl/wp-content/uploads/2015/02/siteheader2.jpg [logoPhone] => http://www.site.nl/wp-content/themes/site/img/logo-phone.png ) [TSimpleMenuControl] => Array ( [menu] =>
And on line 130 I saw
<script type='text/javascript' src='http://www.site.nl/wp-includes/js/underscore.min.js?ver=1.6.0'></script>
I suspect that the plugin adds something to the header that causes the html tag errors / creating invalid XML.
Update __construct() method addition here as suggested by @danbahrami
function __construct() { $Manager = TEventManager::getInstance(); $Manager->AddListener($this); $this->SetEvent('OnGet', array($this,'OnGetEvent')); $this->SetEvent('OnPost', array($this,'OnPostEvent')); $this->SetEvent('OnDisplay', array($this,'OnDisplayEvent')); $this->SetEvent('OnBeforeDisplay', array($this,'OnBeforeDisplayEvent')); $this->SetEvent('OnEnable', array($this,'OnEnableEvent')); $this->SetEvent('OnDisable', array($this,'OnDisableEvent')); $this->SetEvent('OnCreate', array($this,'OnCreateEvent')); $this->SetEvent('OnRootTemplateLoad', array($this,'OnRootTemplateLoadEvent')); $this->SetEvent('OnDefaultPage', array($this,'OnDefaultPageEvent')); $this->OnCreate($this); }
The whole file TControl.php can be seen here. How can I debug this error? is it possible to bypass the errors?
Advertisement
Answer
Custom Contact Forms added a JavaScript in CDATA Tags commented out like so /* <![CDATA[ */
and /* ]]> */
. There was also a bullet pasted as •
That choked the XML Parser. Seems the parser did not like the CDATA commented out this way.
To debug I had help from another developer who used
print("<pre>"); var_dump($this->GetData()); libxml_use_internal_errors(true); echo 'Caught exception: ', $e->getMessage(), "n"; print($xml); die();
but to test it he copied xml from output, saved to file and checked it out by separate script:
$xml = file_get_contents("qqq.xml"); $xml = str_replace("", "X", $xml); $xml = preg_replace("@/*.**/@", "", $xml); $rr = simplexml_load_string($xml); var_dump($rr);
Which printed errors or XML if everything OK. With the adjusted TConfig function with
$xml = $TXml->MakeTree($this->GetData(), get_class($this)); #$xml = str_replace("", "-", $xml); #$xml = preg_replace("@/*.**/@", "", $xml); $xml = preg_replace("@/*.**/@", "<!-- commented out -->", $xml); $Xml = new SimpleXmlElement($xml); return $Xml->asXml(); } catch(Exception $e) { print("<pre>"); var_dump($this->GetData()); libxml_use_internal_errors(true); echo 'Caught exception: ', $e->getMessage(), "n"; print($xml); die();
all is working again. Preg replace was used to remove the offending CDATA code. Will see at a later stage if it can stay without the /**/
.