Nach der (vermeintlich) erfolgreichen Erstellung einer Sitemap in Magento 2 (CE 2.3.5) wurde bei Ansteuerung der Sitemap ein Parse Error ausgegeben. Der Fehler: This page contains the following errors: Entity 'iacute' not defined. Below is a rendering of the page up to the first error. Die hier angebotene Lösung unserer Webagentur bzw. der angebotene Workaround bezieht sich natürlich nicht nur auf die Entity "iacute", also "í", welche dem Buchstaben "í" entspricht, sondern auch Umlaute und andere Sonderzeichen wie Trademark (™) o.Ä..
Das Problem hier besteht darin, dass bei der Sitemaperstellung die Sonderzeichen in Nichtnumerische HTML-Entities umgewandelt werden, heißt: "í" wird eben zu "í" und nicht zu "í". Um dies zu ändern, ändern wir (ja, im Core, da ab Magento CE 2.4 behoben :-)) die Datei
/html/ar.for.econcess.de/vendor/magento/module-sitemap/Model/Sitemap.php
und erweitern diese in 3 Zeilen mit der Anweisung htmlspecialchars(), hierbei ist das Setzen der Entity-Kompatibilität wichtig (ENT_COMPAT), wir geben diese hier mit "ENT_HTML401" an:
Aus den Zeilen
foreach ($images->getCollection() as $image) {
$row .= '<image:image>';
$row .= '<image:loc>' . $this->_escaper->escapeUrl($image->getUrl()) . '</image:loc>';
$row .= '<image:title>' . $this->_escaper->escapeHtml($images->getTitle()) . '</image:title>';
if ($image->getCaption()) {
$row .= '<image:caption>' . $this->_escaper->escapeHtml($image->getCaption()) . '</image:caption>';
}
$row .= '</image:image>';
}
// Add PageMap image for Google web search
$row .= '<PageMap xmlns="http://www.google.com/schemas/sitemap-pagemap/1.0"><DataObject type="thumbnail">';
$row .= '<Attribute name="name" value="' . $this->_escaper->escapeHtml($images->getTitle()) . '"/>';
$row .= '<Attribute name="src" value="' . $this->_escaper->escapeUrl($images->getThumbnail()) . '"/>';
$row .= '</DataObject></PageMap>';
wird dann hiermit
foreach ($images->getCollection() as $image) {
$row .= '<image:image>';
$row .= '<image:loc>' . $this->_escaper->escapeUrl($image->getUrl()) . '</image:loc>';
$row .= '<image:title>' . $this->_escaper->escapeHtml(htmlspecialchars($images->getTitle(), ENT_HTML401, 'UTF-8')) . '</image:title>';
if ($image->getCaption()) {
$row .= '<image:caption>' . $this->_escaper->escapeHtml(htmlspecialchars($image->getCaption(), ENT_HTML401, 'UTF-8')) . '</image:caption>';
}
$row .= '</image:image>';
}
// Add PageMap image for Google web search
$row .= '<PageMap xmlns="http://www.google.com/schemas/sitemap-pagemap/1.0"><DataObject type="thumbnail">';
$row .= '<Attribute name="name" value="' . $this->_escaper->escapeHtml(htmlspecialchars($images->getTitle(), ENT_HTML401, 'UTF-8')) . '"/>';
$row .= '<Attribute name="src" value="' . $this->_escaper->escapeUrl($images->getThumbnail()) . '"/>';
$row .= '</DataObject></PageMap>';
Damit wird die Sitemap nun fehlerfrei erzeugt. Gesehen in unserer Internetagentur in einem Onlineshop mit Magento 2.3.5.