web-dev-qa-db-de.com

Benutzerdefiniertes Attribut für das Title-Tag mit wp_title ()

Kann ich die itemprop zum title-Element hinzufügen und trotzdem wp_head() und add_theme_support( "title-tag" ) verwenden?

Ich möchte ein Thema erstellen und es auf wordpres.org genehmigen lassen das Mikrodaten verwendet.

Das vorhergehende Mittel, das ich möchte, dass der HTML-Code wie folgt aussieht:

<html itemscope itemtype="http://schema.org/WebPage" lang="en-US">
....
        <title itemprop="name">WordPress Weblog Theme &#8211; Just another WordPress site</title>
....

Jetzt benutze ich add_theme_support( "title-tag" ) nicht und benutze den folgenden Code in header.php?

<title itemprop="name"><?php echo wp_get_document_title(); ?></title>
<?php wp_head(); ?>

Das Theme Check Plugin sagt nun:

ERFORDERLICH: Das Theme muss einen Aufruf von wp_title () haben, idealerweise in der Datei header.php. ERFORDERLICH: Das Theme muss Tags haben, idealerweise in der Datei header.php. EMPFOHLEN: Im Design wurde kein Verweis auf add_theme_support ("title-tag") gefunden. Es wird empfohlen, dass das Thema diese Funktionalität für WordPress 4.1 und höher implementiert.

4
Bass Jobsen

Da _wp_render_title_tag nur auf title-tag-Theme-Unterstützung prüft und <title>-Tags einbindet, gibt es wirklich keinen Grund, warum Ihre vorhandene Implementierung "nicht bestanden werden soll", da die richtige Implementierung bereits über Folgendes identisch ist:

<title itemprop="name"><?php echo wp_get_document_title(); ?></title>

wann _wp_render_title_tag tut:

echo '<title>' . wp_get_document_title() . '</title>' . "\n";

(Da es sich bei Theme Check um eine Richtlinienüberprüfung handelt, sollte dies theoretisch nicht dazu führen, dass ein Standard nicht eingehalten wird.)

In jedem Fall können Siedies umgehen und die vorhandene Implementierung gleichzeitig verbessern, indem Sie einen Anpassungsüberschreibungsfilter hinzufügen ... indem Sie die vorhandene Aktion deaktivieren (wie von @ vorgeschlagen). birgire) und (mein Zusatz) Hooking einer Wrapping-Funktion, die _wp_render_title_tag aufruft und den Filter darauf anwendet:

if (has_action('wp_head','_wp_render_title_tag') == 1) {
    remove_action('wp_head','_wp_render_title_tag',1);
    add_action('wp_head','custom_wp_render_title_tag_filtered',1);
}

function custom_wp_render_title_tag_filtered() {
    if (function_exists('_wp_render_title_tag')) {
        ob_start(); 
        _wp_render_title_tag(); 
        $titletag = ob_get_contents();
        ob_end_clean();
    } else {$titletag = '';}
    return apply_filters('wp_render_title_tag_filter',$titletag);
}

Da es besser ist, ohnehin einen Filter zur Verfügung zu haben, können Sie mit dem neuen Filter ganz einfach Ihre eigenen Use-Case-Anpassungen hinzufügen:

add_filter('wp_render_title_tag_filter','custom_wp_render_title_tag');

function custom_wp_render_title_tag($titletag) {
    $titletag = str_replace('<title>','<title itemprop="name">',$titletag);
    return $titletag;
}

Natürlich wäre es viel sauberer, wenn die Kernfunktion einfach aktualisiert würde:

function _wp_render_title_tag() {
    if ( ! current_theme_supports( 'title-tag' ) ) {
        return;
    }
    echo apply_filters( 'wp_render_title_tag' , '<title>' . wp_get_document_title() . '</title>' . "\n" );
}
4
majick

Leider ist das Echo des <title>-Tags derzeit in general-template.php (Zeile 1062) fest verdrahtet. Es ist eine private Funktion, dh Sie können sie nicht ändern oder überschreiben. Daher können Sie das Tag derzeit nicht ändern. Möglicherweise möchten Sie ein trac ausgeben, um Sie zu bitten, dies in Zukunft zu unterstützen.

1
cjbj