Hinzufügen von Zeilenumbrüchen zu Navigationsmenüelementen

8

Ich muss den Titeln der Navigationsmenüzeilen Zeilenumbrüche hinzufügen. Ich wusste nicht, dass dies ein Problem ist, da ich, wenn ich als Superadministrator angemeldet bin, gut hinzufügen kann <br/>, aber anscheinend Administratoren auf normaler Ebene nicht.

Ich habe diesen Beitrag gelesen. Benutzerdefinierte Menüs Beschreibung HTML-Tags entfernen

Aber ich bin ziemlich davon überzeugt, dass die Tags beim Speichern / Aktualisieren entfernt werden, daher sehe ich nicht sofort, wie ein Custom Walker die Lösung ist, aber mein Gehirn ist heute ziemlich gut erschossen, daher könnte es offensichtlich sein.

Es scheint auch keine sanitären Einrichtungen in wp_save_nav_menu_items()oder zu geben wp_update_nav_menu_item().

Helgatheviking
quelle
Dies muss für mehrere Standorte spezifisch sein, da ein Administrator bei einer Installation an einem Standort das <br/>Tag verwenden kann ... In jedem Fall handelt es sich bei den Menüelementen um Post-Typen, daher denke ich, dass die Bereinigung erfolgt sanitize_post_field()(speziell title_save_pre- siehe Quelle ). Leider gibt es keine Möglichkeit, dies nur für Menütitel zu umgehen - daher ist Ihre veröffentlichte Lösung wahrscheinlich die beste.
Stephen Harris
Ja, ich dachte, ich erinnere mich daran, dass du ... also habe ich nie bemerkt, dass es ein Problem ist, bis sich ein Kunde beschwert hat. Danke für den Quelllink.
Helgatheviking

Antworten:

10

Dem Hinweis von @Rarst bezüglich sicherer Charaktere folgend, habe ich Folgendes getan:

function wpa_105883_menu_title_markup( $title, $id ){
    if ( is_nav_menu_item ( $id ) && ! is_admin() ){
        $title = preg_replace( '/#BR#/', '<br/>', $title );
    }
    return $title;
}
add_filter( 'the_title', 'wpa_105883_menu_title_markup', 10, 2 );

Edit : Auch per Rarst Kommentar habe ich ersetzt die preg_replacemitstr_ireplace

function wpa_105883_menu_title_markup( $title, $id ){
    if ( is_nav_menu_item ( $id ) ){
        $title = str_ireplace( "#BR#", "<br/>", $title );
    }
    return $title;
}
add_filter( 'the_title', 'wpa_105883_menu_title_markup', 10, 2 );
Helgatheviking
quelle
1
Da es sich nicht wirklich um einen regulären Ausdruck handelt, würde ich nur generisch str_ireplace()zum Ersetzen verwenden. Wusste auch nicht is_nav_menu_item(), cool. :)
Rarst
1
Ich habe es gerade is_nav_menu_item()beim Lesen eines Codes für diese Frage entdeckt. Es war auch neu für mich. Danke für Ihre Hilfe!
Helgatheviking
Gibt es eine Möglichkeit, nicht alle Titel zu beeinflussen? Weil dies alle betrifft, auch im Dashboard.
Jabel Márquez
Überprüfen Sie einfach, ob dies nicht der is_admin()Fall ist.
Helgatheviking
Schön, und mit "<br class='break' />" können Sie es reaktionsschnell machen.
Henning Fischer
3

Ohne die Desinfektionslogik auf den Kopf zu stellen oder eine benutzerdefinierte Schnittstelle dafür zu codieren ... Ich würde nur ein sicheres Zeichen dafür festlegen (z. B. Pipe |) und es bei der Ausgabe durch ein Break-Tag ersetzen.

Es durchläuft den the_titleFilter in Walker und muss den Filter nur rechtzeitig hinzufügen und entfernen, damit die Titel an anderer Stelle nicht beeinträchtigt werden.

Selten
quelle
Jep! Genau das habe ich gerade entdeckt. Am Ende habe ich # BR # als sicheren Charakter verwendet. Wird gepostet.
Helgatheviking
Wie können Sie es tun, ohne alle Titel zu beeinflussen?
Jabel Márquez