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 "&iacute", 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.