Wie behebt man Fehler beim Test-Tool für Strukturierte Daten von Google für Google?

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:

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;
}