it-swarm.com.de

Menüpunktbeschreibung mit Zeilenumbrüchen anzeigen

Ich habe ein Problem mit meinem Thema ...

Ich verwende Agama und habe "description" in den Menüeinstellungen angekreuzt, aber es wird nicht im Frontend angezeigt, da das Theme es nicht zulässt.

Aber dann habe ich diese Funktion gefunden:

function prefix_nav_description( $item_output, $item, $depth, $args ) {
if ( !empty( $item->description ) ) {
    $item_output = str_replace( $args->link_after . '</a>', '<span class="menu-item-description">' . $item->description . '</span>' . $args->link_after . '</a>', $item_output );
}
return $item_output;
}
add_filter( 'walker_nav_menu_start_el', 'prefix_nav_description', 10, 4 );

Das hat mir geholfen, die Beschreibung anzuzeigen. Aber ich kann in meiner Beschreibung keine Zeilenumbrüche machen. Jedes Mal, wenn ich nur einen Zeilenumbruch oder Einfügungen mache
und speichern Sie die Änderungen, es werden die Änderungen wieder entfernt.

Kann mir jemand mit einer Funktion helfen, mit der sowohl die Beschreibung angezeigt wird als auch das Hinzufügen möglich ist?
in der Beschreibung.

Danke: D

OK, es hat eine Weile gedauert, bis ich dieses Verhalten behoben habe, aber ... Für mich ist jetzt alles klar ... Ich bin mir nicht sicher, ob dies wirklich beabsichtigt ist ...

Wieso ist es so?

Also ... Die Zeilenumbrüche sind im DB korrekt gespeichert. Dann wird in wp_setup_nav_menu_item das Beschreibungsfeld basierend auf der post_content-Spalte des angegebenen Menüelementposts gefüllt.

In Zeile 845 ( https://core.trac.wordpress.org/browser/tags/4.9/src/wp-includes/nav-menu.php#L845 ) wird gekürzt und gefiltert:

if ( ! isset( $menu_item->description ) ) {
    /**
     * Filters a navigation menu item's description.
     *
     * @since 3.0.0
     *
     * @param string $description The menu item description.
    */
    $menu_item->description = apply_filters( 'nav_menu_description', wp_trim_words( $menu_item->post_content, 200 ) );
}

Und die Funktion wp_trim_words schneidet Text auf eine bestimmte Anzahl von Wörtern, behält jedoch keine Zeilenumbrüche bei - daher wird jeder Zeilenumbruch durch ein Leerzeichen ersetzt.

Was können wir dagegen tun?

wp_trim_words enthält keine Filter, mit denen wir sein Verhalten ändern können. Es gibt auch keine Filter, mit denen wir den Aufruf von wp_trim_words überspringen können, aber ...

Sie können den \n durch einen Platzhalter ersetzen und dann den nav_menu_description-Filter verwenden, um ihn wieder zu ersetzen. Benutzer müssen diesen Platzhalter nicht einmal selbst setzen - wir können ihn durch einen Platzhalter mit save_post-Filter ersetzen:

function replace_nl_placeholder_nav_menu_description( $description ) {
    return str_replace('%NL% ', "\n", $description);
}
add_filter('nav_menu_description', 'replace_nl_placeholder_nav_menu_description');

function replace_nl_with_placeholder_nav_menu_description( $post_id ) {
    if ( 'nav_menu_item' !== get_post_type($post_id) ) return;

    remove_action( 'save_post', 'replace_nl_with_placeholder_nav_menu_description' );

    wp_update_post( array(
        'ID' => $post_id,
        'post_content' => str_replace("\n", '%NL% ', get_post_field('post_content', $post_id, 'raw'))
    ) );

    add_action( 'save_post', 'replace_nl_with_placeholder_nav_menu_description' );
}
add_action( 'save_post', 'replace_nl_with_placeholder_nav_menu_description' );

Und das ist alles. Sie müssen nur daran denken, solche Zeilenumbrüche in Ihrem Design (nl2br usw.) richtig anzuzeigen.

3