WordPress: Custom Links im Hauptmenu verhindern

Aus Gründen der Usability ist es nicht sinnvoll, wenn man im Hauptmenü einer Website Links auf externe Webseiten setzt. Die Benutzer der Website erwartet im Hauptmenü  stattdessen die Seiten der Website auf die er sich befindet.
Externe Links gehören stattdessen in eigene dafür gedachte Menüs oder in den Content-Bereichen.

Ein Theme, an dem ich arbeite, wird leider von vielen Webmastern und Redakteuren genutzt, die an dieser Stelle eher etwas unbedarft sind und externe Links reinsetzen. Oder auch den Link zur Startseite, der durch den im Theme enthaltenen Logo zur Website bereits enthalten und somit redundant ist.

Es ist daher sinnvoll, den Anwender im Backend entweder die Möglichkeit zu nehmen, solche Custom Links zu setzen oder aber ihn entsprechend zu warnen.

Eine schnelle Lösung funktioniert mit JavaScript:

// Limit Main Menu
   if ($('body').hasClass('nav-menus-php')) {
	currenteditimenu = $('#nav-menu-meta-object-id').val();
	titlemain = $("label[for='locations-main-menu']").text();      
	mainmenunum = $('#select-menu-to-edit option:contains('+titlemain+')').val();
       
       if (currenteditimenu == mainmenunum) {
	  // console.log("Working on main menu");
	   $('#add-custom-links').css("display", "none"); 
           $('.menu-item-custom .menu-item-bar .menu-item-handle').css("background","red");   
           $('.menu-item-custom .menu-item-bar .menu-item-handle').append("<p><em>Bitte verwenden Sie keine externen Links im Hauptmenü, da dies zu Problemen in der Bedienbarkeit der Website führt.</em></p>");<br>
	   
       }   	   
   }

Das Skript macht folgendes:

Zunächst wird der Einsatz beschränkt auf die Menu-Bearbeitung im Backend. Danach suche ich die ID des aktuell in der Bearbeitung angezeigten Menüs

$('#nav-menu-meta-object-id').val();

Um herauszufinden, welche ID das tatsächlich Hauptmenu hat, muss ich einen Umweg machen über den Label zur Auswahl der Menüpositionen. Die ID befindet sich dort zwar nicht, wohl aber der Titel des Hauptmenüs (in der deutschen Sprachvariante ist es „Hauptmenü“, im englischen Setting „Main Menu“). Da die for-Anweisung im Label sprachunabhängig ist, kann ich damit den dazugehörigen textuellen Inhalt nehmen:

titlemain = $("label[for='locations-main-menu']").text();

Nun such ich in der Auswahlliste der verschiedenen vorhandenen Menüs nach diesen Text und erhalte dann dort die richtige ID:

mainmenunum = $('#select-menu-to-edit option:contains('+titlemain+')').val();

Somit kann ich am Ende schauen, ob ich mich bei der Bearbeitung gerade beim Hauptmenü der Website befinde oder auf einem anderem Menü.
Denn nur wenn ich das Hauptmenü bearbeite, will ich die Custom Links deaktivieren.

Das JavaScript speichere ich wie gewohnt in eine JS-Datei (z.B. „/js/admin.js“) , die ich dann in meinem Theme einbinde:

function my_admin_header_scripts() {
    wp_register_script('themeadminscripts', get_fau_template_uri().'/js/admin.js', array('jquery'));    
    wp_enqueue_script('themeadminscripts');	   
}
add_action( 'admin_enqueue_scripts', 'my_admin_header_scripts' );

Redakteure können natürlich dennoch externe Links einfügen. So könnte man obiges einfach „austricksen“, wenn man das Hauptmenü kurzzeitig einem anderen Menü zuweist und dann die Custom Links hinzufügt. Dies ist allerdings auch nur als ein mahnender Hinweis zu verstehen.  Wenn ein Redakteuer sich darüber hinweg setzt, wurde er wenigstens gewarnt.

Wenn man es als Admin ernst meint und die Nutzung wirklich streng unterbinden will, bleibt einen weiterhin die einfache Möglichkeit für die Anzeige des Menüs eine eigenen Walker-Class zu erstellen. Bei der Elementanzeige kann dann der jeweilige Link geprüft werden und dann nach eigenen festen Regeln angezeigt werden oder nicht.