Das Test-Tool für Strukturierte Daten von Google beschwert sich oft über fehlende Daten:
- Fehler: Missing required field “updated”.
- Fehler: Missing required hCard “author”.
- Fehler: Missing required field “entry-title”.
Oder ähnlichen. Schuld daran sind die Themes, denn sie beherbergen nicht immer den kompletten Markup. Hier steht, wie man dies beheben kann:
Was ist Markup?
HTML-Markup gibt es in verschiedenen Formaten:
- Microformate
- Microdaten (dazu gehört z.B. HTML5, schema.org oder das mittlerweile veraltete data-vocabulary.org)
- oder das weniger oft benutzte RDFa,
- oder JSON-LD
Was sind Microformate?
WordPress nutzt intern einige Microformate. Das sind letztlich nur CSS-Klassen die von Google und Co. auch als Markup erkannt werden. Leider ist der Syntax manchmal unvollständig, was natürlich auch an den Theme-Entwicklern liegt. Diese sind nämlich (noch) nicht wirklich mit dem Thema Microdata vertraut.
Beispiel:
<div class="vcard"> <a class="url fn n" href="http://florian-simeth.de"> <span class="given-name">Florian</span> <span class="additional-name">Simeth</span> </a> </div>
Wie man sieht, wird mit der Klasse vcard letztlich eine Visitenkarte von einem Benutzer eingeleitet.
- Mittels
url
lässt sich die Web-Adresse angeben - Mit
given-name
der Vorname. - Mit
additional-name
der Nachname. - Es existieren natürlich noch mehrere Angaben. Testen kann man sie z.B. mit dem hCard Creator.
Letztlich wird mit Blog- oder Kommentarbeiträgen nicht anders verfahren. Nur eben mit dem Unterschied, dass das Test-Tool sie für ungültig erklärt, wenn sie aus ihrer Sicht nicht vollständig ist.
Auf dieser Seite findet man (verkürzt) folgendes:
<article class="hentry"> <h1 class="entry-title">Überschrift</h1> <div class="entry-content">Der Inhalt</div> ... </article>
Um jedoch vollständig zu sein, will Google in meinem Fall zumindest noch ein dt-updated
sowie ein p-author
sehen. Welche Elemente es für hentry noch gibt, steht hier.
“Updated” Markup korrigieren
Hier wird es schwierig denn nicht jedes Theme ist gleich. Manchmal lassen sich CSS-Klassen einfach über so genannte Hooks nachreichen, manchmal aber auch nicht. So auch in meinem Fall. So bleibt einem nichts anderes übrig als im Quellcode nachzusehen.
Fündig geworden bin ich z.B. in der Datei content.php
meines bereits modifizierten damaligen Themes. Dort sucht man die Stelle <span class="post-date">
und ergänzt die CSS-Klasse lediglich um das vorher aufgeführte updated
. Achtung: der Tag kommt in der Datei zweimal vor! Fertig.
Fertig? Nein. Nicht wirklich. Denn “updated” meint ja nicht unbedingt das Veröffentlichungsdatum. Deshalb wäre auch ein separater Meta-Tag möglich. z.B. so:
<article class="hentry"> <h1 class="entry-title">Überschrift</h1> <span class="post-date published"><?php the_time( get_option( 'date_format' ) ); ?></span> <span class="post-date updated"><?php the_modified_time( get_option( 'date_format' ) ); ?></span> <div class="entry-content">Der Inhalt</div> </article>
So. Das entfernt zumindest schon einmal den Missing required field “updated” Fehler.
“Author” Markup einfügen
In meinem Fall ist der Autor-Name direkt im Artikel gar nicht vorhanden. Dieser muss erst einfügt werden. Dies geschieht ebenfalls in der content.php-Datei und benötigt noch einige weitere Angaben. Nämlich eine vcard
(Visitenkarte):
<span class="author"> <span class="vcard"> <span class="fn"><?php the_author(); ?></span> </span> </span>
Markup ganz entfernen
Eine ganze schlechte Idee ist es den Markup ganz zu entfernen. Trotzdem ist es möglich. Zum Beispiel dann, wenn ein Theme bereits das neuere schema.org Markup nutzt, wie z.B. das Divi-Child Theme mit Schema.org.
Es klappt am einfachsten indem man den hentry
-Code am Anfang jedes Post-Artikels entfernt. Dazu kann man unten stehenden Code entweder in die im Theme vorhandene functions.php
schreiben oder aber sich ein eigenes Plugin basteln. Letzteres hat den Vorteil dass bei einem Theme-Update alles beim Alten bleibt. Auf der anderen Seite hat man einen Nachteil, dass man eventuelle Fehlerbehebungen hinsichtlich Microformate nicht mitbekommt.
Für die functions.php
sieht der Code so aus:
add_filter( 'post_class', 'my_post_class' ); function my_post_class( $classes ){ if( false !== $id = array_search( 'hentry', $classes ) ){ unset( $classes[ $id ] ); } return $classes; }