So kombinieren wir Nested Pages, SEO Framework & Polylang in WordPress

nested-pages-seo-framework-polylang-wordpress

Bei vielen Kundenwebseiten setzen wir auf das Plugin Nested Pages, um Seitenstruktur besser sehen (und verwalten) zu können.

Ohne dieses Plugin sieht die Anzeige von "Seiten" beispielsweise wie folgt aus:

WordPress Website Seitenansicht ohne Nested Pages Plugin

Die Ansicht mit Nested Pages sieht hingegen so aus:

WordPress Website Seitenansicht mit Nested Pages Plugin

Gerade für Seiten mit diversen Unterseiten von Unterseiten wird es mit der normalen WordPress Ansicht sehr schnell unübersichtlich. Wenn dann noch 2 zusätzliche Sprachen für 50 Seiten hinzukommen, sind wir bei 150 Seiten mehr oder weniger ungeordnetem WordPress Inhalt.

tl;dr: Ich will wissen welchen Code ich benötige, um das besser zu machen!

Stand Heute

Unsere Kunden kommunizieren oft in mehreren Sprachen - dazu setzen wir auf Polylang. Hierbei handelt es sich um ein stabiles, aber einfach einzusetzendes Plugin um Wordpress-Seiten mehrsprachig zu erstellen.

SEO (Search Engine Optimization) ist selbstverständlich auch bei uns ein Thema. Warum sollten wir für unsere Kunden eine tolle Webseite erstellen, welche dann auf Seite 10 bei den Suchergebnissen landet? Um hierfür gewappnet zu sein setzen wir auf "The SEO Framework" und sind sehr zufrieden mit den erreichten Resultaten.

Warum erwähne ich diese beiden Plugins?
Im Zusammenhang mit Nested Pages verlieren unsere Kunden diese Informationen und Möglichkeiten fast gänzlich, da diese in Nested Pages nicht angezeigt werden.

Konkret:

  1. Übersetzungsfunktionalitäten fehlen
  2. Informationen zum SEO Status fehlen

Wir hatten bereits vor einiger Zeit mit dem Pluginautor Kontakt aufgenommen und ihn gebeten, dass er einen neuen Hook einfügt, damit wir die Darstellung im WordPress Backend beeinflussen können. Dieser Wunsch wurde uns relativ schnell erfüllt und innert kurzer Zeit konnten wir so zumindest die Sprache der aktuellen Seite anzeigen:

The SEO Framework Plugin

Das ist doch schon einmal toll! So konnten sich unsere Kunden trotzdem relativ einfach orientieren und wussten jederzeit, welche Sprache die gelistete Seite hat.

Stand Morgen

Wir wären nicht Digital Rebels, wenn wir dies einfach akzeptieren würden... ?

Aus diesem Grund haben wir uns hingesetzt und nach Lösungen gesucht um das Beste von der klassischen WordPress Ansicht mit der Nested Pages Ansicht zu kombinieren. Das Resultat sieht wie folgt aus:

Kombination aus Nested Pages Plugin und WordPress

Unsere Kunden haben mit den neuen Features die Möglichkeit Nested Pages einzusetzen und sehen trotzdem mehr:

1. Sprache des Beitrags (erste Flagge)

2. Übersetzungen

  • grau: noch nicht übersetzt
    ➡️ ein Klick auf diese Flagge erstellt eine Übersetzung in der gewünschten Sprache.
  • leicht transparent: bereits übersetzt
    ➡️ ein Klick auf diese Flagge bearbeitet die gewünschte Sprache.

3. SEO Statusinformationen

Somit können unsere Kunden in der von Nested Pages gewohnten verschachtelten Ansicht arbeiten und profitieren trotzdem von den zusätzlich Informationen und Möglichkeiten, welche unsere Erweiterung bereitstellt. Aktuell müssen wir auf Grund von technischen Limitierungen all diese Informationen beim Titel hinzufügen. Diesbezüglich sind wir aber bereits mit dem Plugin Autor von Nested Pages in Kontakt und hoffen, dass wir dies demnächst noch "in schön" umsetzen können.

Wir sind der Meinung, dass trotz der etwas chaotischen Darstellung, dies ein extremer Mehrwert ist und die Verwaltung und Bearbeitung von (mehrsprachigen) Webseiten vereinfacht und ausserdem eine tolle Übersicht über die SEO Performance der eigenen Webseite bietet. Möchtest Du auch von einer einfachen Verwaltung von mehrsprachigen und/oder suchmaschinenoptimierten Seiten profitieren? Wir sind für dich da!

Technische Details

Sobald man die nötigen Hooks & Funktionen kennt, ist die Implementierung eigentlich keine Hexerei. Nachfolgend der Code für oben erwähnte Erweiterung:

<?php namespace ctcore\Hooks; class Translations { public static function AddCustomColumns($title, $postId) { // check if polylang is present if (function_exists('pll_get_post_language')) { $postId = \is_object($postId) ? $postId->ID : $postId; $postType = get_post_type($postId); if (pll_is_translated_post_type($postType)) { // get language details $currentLanguage = pll_get_post_language($postId, 'slug'); $postTranslations = pll_get_post_translations($postId); $languages = pll_the_languages([ 'raw' => true, 'echo' => 0, ]); $mainLanguage = ''; $additionalLanguages = ''; if (\is_array($languages)) { // get basic create new link $newPostLink = admin_url('post-new.php'); $newPostLink = add_query_arg( [ 'post_type' => $postType, 'from_post' => $postId, ], $newPostLink ); $currentLink = get_edit_post_link($postId); foreach ($languages as $langKey => $langValue) { if (array_key_exists($langKey, $postTranslations)) { if ($currentLanguage == $langKey) { // current language $mainLanguage = '</a><a href="' . $currentLink . '"><img title="' . $languages[$langKey]['name'] . ' (' . $languages[$langKey]['locale'] . ')" src="' . $languages[$langKey]['flag'] . '" class="lang-flag primary" ></a>'; } else { // translation available $editPostLink = get_edit_post_link($postTranslations[$langKey]); $additionalLanguages .= '</a><a href="' . $editPostLink . '"><img title="' . $languages[$langKey]['name'] . ' (' . $languages[$langKey]['locale'] . ')" src="' . $languages[$langKey]['flag'] . '" class="lang-flag is-translated" ></a>'; } } else { // no translation available $newPostLinkLanguage = add_query_arg('new_lang', $langKey, $newPostLink); $newPostLinkLanguage = wp_nonce_url( $newPostLinkLanguage, 'new-post-translation' ); $additionalLanguages .= '</a><a href="' . $newPostLinkLanguage .'"><img title="' . $languages[$langKey]['name'] . ' (' . $languages[$langKey]['locale'] . ')" src="' . $languages[$langKey]['flag'] . '" class="lang-flag not-translated" ></a>'; } } // build title string $title = $mainLanguage . $additionalLanguages . '<a href="' . $currentLink . '">' . $title; } } } // check if the seo framework is present if (class_exists('\The_SEO_Framework\Interpreters\SEOBar')) { $tsf = tsf(); if ($tsf->is_post_type_supported($postType)) { // post type is supported by the seo framework, display seo bar $seobar = new \The_SEO_Framework\Interpreters\SEOBar(); $bar = $seobar->generate_bar([ 'id' => $postId, 'post_type' => $postType, ]); $title = $title . $bar; } } return $title; } } add_action('nestedpages_post_title', ['\' . __NAMESPACE__ . '\Translations', 'AddCustomColumns'], 99, 2);

Was passiert hier?

Zuerst wird via dem Hook nestedpages_post_title eine Funktion aufgerufen, welche den Titel in Nested Pages manipulieren kann.

Dach wird für den jeweiligen Post geprüft ob 1) Polylang aktiv ist und 2) der Post überhaupt übersetzbar ist. Falls ja, werden die verschiedenen Sprachen (übersetzt oder nicht) angezeigt.

Anschliessend wird geprüft ob The SEO Framework aktiv ist. Falls ja, wird die SEO Bar von diesem Plugin geladen und ebenfalls dargestellt.

Ganz am Ende wird der neue Titel zurückgegeben und führt zum Resultat in obigem Screenshot.

Details

Natürlich "missbrauchen" wir den Hook um den Titel zu ändern für etwas, wofür dieser Hook eigentlich nicht gedacht ist. Dies sieht man unter anderem daran, dass wir das A-Tag jeweils zuerst schliessen und am Ende wieder öffnen, da wir uns gemäss Hook mitten in einem A-Tag befinden. Funktioniert es? Ja. Ergibt es Mehrwert? Ja? Gut :)

Ausserdem kann man sich natürlich die Frage bezüglich Performance stellen. Da es sich hier aber um eine Funktionalität handelt, welche nur im Kontext von 1) WordPress Backend und 2) Kombination Nested Pages, Polylang und The SEO Framework auftritt, ist die Performance zu vernachlässigen. Für das Frontend (sprich: für den Kunden unseres Kunden) hat diese Funktionalität somit überhaupt keinen negativen Einfluss.

Habe ich im Code Fehler hinterlassen, hast Du Fragen oder eine bessere Idee wie man dies lösen kann?
Schreib mir - oder noch besser: Bewirb Dich! Wir sind immer auf der Suche nach Talenten!

Abonniere 
unseren Newsletter

Nur wertvolle Infos – kein Spam. Mit der Ameldung bestätigst Du, dass wir Dir einmal im Monat eine Zusammenfassung der neuesten Themen im Web-Bereich als E-Mail zusenden dürfen.

Mehr Artikel wie dieser

Welche WordPress Version habe ich? So findest Du es heraus!

WordPress ist das beliebteste CMS der Welt, mit welchem sich neben Blogs auch ganze Webseiten erstellen lassen. Da WordPress regelmässig und fleissig verbessert wird, kann…
Weiterlesen

WordPress 6.1 – Alle Neuerungen mit webP und dem neuen Twenty Twenty-Three Standard-Theme im Überblick

Das dritte grosse WordPress Update in diesem Jahr steht vor der Türe. Mit WordPress 6.1 kommen am 1. November 2022 wieder zahlreiche Neuerungen auf uns…
Weiterlesen

Wie wir ACF Blocks mit Handlebars Templating einsetzen

Mittels Handlebars Templating trennen wir Logik sauber vom Inhalt. Auf diese Weise können wir übersichtliche, einfache und performante Templates für WordPress Editor Blocks erstellen, welche…
Weiterlesen

iPhone Bildschirmgrössen – (k)ein Hexenwerk für Webdesigner?

iPhone-Bildschirm Messgrössen iPhone Bildschirmgrösse in Zoll (Display Size, Inches) Dies ist die Bildschirmgrösse in Zoll, gemessen von einer Ecke zur anderen. Genau so, wie auch Bildschirmgrössen von…
Christoph Ackermann
Weiterlesen

Vorstellung von WordPress 6.0 – Neue Blöcke und mehr Performance

Seit dem 24. Mai 2022 ist mit WordPress 6.0 die zweite Hauptversion in diesem Jahr veröffentlicht worden. Benannt wurde die Version nach Jazzmusiker Arturo O’Farrill.…
Weiterlesen

WordPress Login – so bekommst Du Zugang zu Deinem Dashboard

Gerade für WordPress Anfänger, aber auch bei fortgeschrittenen Benutzern, kann es oft schwierig sein, sich bei seinem Konto anzumelden. Im folgenden Beitrag werde ich Dir…
Weiterlesen

WordPress 6.0: Entwicklerteam gibt Zeitplan der neuen Version bekannt

Update: WordPress 6.0 wurde am 24. Mai 2022 veröffentlicht Wie Matias Ventura Ende Januar schrieb, soll WordPress 6.0 ein Abschluss der Phase 2 des Gutenberg-Projekts…
Weiterlesen

WordPress 5.9 – Was ist neu und kommt mit dem Update

Ursprünglich sollte WordPress 5.9 (Josephine) bereits am 14. Dezember 2021 veröffentlicht werden, wurde jedoch wegen offenen Problemen nach mehrfachen Verschieben nun am 25. Januar 2022…
Weiterlesen

WordPress Bilder und Medien: Alles was du wissen musst

Bilder sind ein grosser und wichtiger Bestandteil einer modernen Webseite. Sie helfen dem Besucher und Leser, Dinge zu visualisieren und lockern auch gerne lange Beiträge…
Weiterlesen

Warum unsere Kunden ihre Webseite kaputt layouten können

Einleitung / Basics Bereits seit einiger Zeit haben wir unseren neuen cubetech Core im Einsatz. Intern nennen wir das Ding liebevoll „gutenbase“ – eine Mischung…
Weiterlesen

Tech Talk – „Advanced Custom Fields“ Plugin

Bereits seit langer Zeit setzen wir bei unseren WordPress-Installationen auf das populäre Plugin «Advanced Custom Fields» (nachfolgend ACF). Dieser Beitrag zeigt, wie wir unsere Webseiten…
Weiterlesen

Wie du deine WordPress Medienbibliothek aufräumst

Wer WordPress für seinen Blog oder seine Firmenwebseite schon länger nutzt, hat sicher schon einiges an Dateien in die Mediathek hochgeladen. WordPress erstellt beim Hochladen…
Weiterlesen