web-dev-qa-db-fra.com

Afficher la description de l'élément de menu avec des sauts de ligne

J'ai un problème avec mon thème ...

J'utilise Agama et j'ai coché la case "description" dans les paramètres du menu, mais il ne l'affiche pas sur l'interface, car le thème ne le permet pas.

Mais ensuite j'ai trouvé cette fonction:

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 );

Cela m'a aidé à obtenir la description à afficher. Mais je ne peux pas faire de sauts de ligne dans ma description. Chaque fois que je fais juste un saut de ligne ou des insertions
et enregistrez les modifications, il supprime à nouveau les modifications.

Alors, est-ce que n'importe qui peut m'aider avec une fonction qui permet à la fois de montrer la description et aussi de me permettre d'ajouter
dans la description.

Merci: D

OK, il m'a fallu un peu de temps pour résoudre ce problème, mais ... Tout est clair pour moi maintenant ... Je ne suis pas sûr que ce soit totalement intentionnel ...

Pourquoi est-ce?

So ... Les sauts de ligne sont correctement stockés dans la base de données. Ensuite, dans wp_setup_nav_menu_item, le champ de description est renseigné en fonction de la colonne post_content du poste de menu donné.

À la ligne 845 ( https://core.trac.wordpress.org/browser/tags/4.9/src/wp-includes/nav-menu.php#L845 ), il est abrégé et filtré:

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 ) );
}

Et la fonction wp_trim_words réduit le texte à un certain nombre de mots, mais ne préserve pas les sauts de ligne. Ainsi, tout saut de ligne est remplacé par un espace.

Alors, que pouvons-nous faire à ce sujet?

wp_trim_words ne contient aucun filtre nous permettant de modifier son comportement. Il n'y a pas non plus de filtres qui nous permettent de sauter l'appel wp_trim_words, mais ...

Vous pouvez remplacer le \n par un espace réservé, puis utiliser le filtre nav_menu_description pour le remplacer. Il n'est même pas nécessaire que les utilisateurs mettent cet espace réservé lui-même - nous pouvons les remplacer par un espace réservé avec le filtre save_post:

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' );

Et c'est tout. Vous devez seulement vous rappeler d’afficher correctement ces sauts de ligne dans votre thème (nl2br et ainsi de suite).

3
Krzysiek Dróżdż