web-dev-qa-db-ja.com

改行付きでメニュー項目の説明を表示する

テーマに問題があります。

私はAgamaを使用していて、メニュー設定で "description"にチェックマークを付けましたが、テーマでは許可されていないのでフロントエンドには表示されません。

しかし、それから私はこの機能を見つけました:

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

それは私が説明が表示されるようにするのを助けました。しかし、私は私の説明の中で改行することはできません。改行や挿入をするたびに
をクリックして変更を保存すると、変更が再度削除されます。

だから誰もが説明が表示されるようにし、また私が追加することが可能になるという機能で私を助けることができる
説明の.

ありがとう

この振る舞いをデバッグするのに少し時間がかかりましたが、今のところすべてが明らかになっています...これが完全に意図的なものかどうかはわかりません...

それはなぜですか?

そう...改行は正しくDBに格納されます。そしてwp_setup_nav_menu_itemでは、与えられたメニュー項目の投稿のpost_content列に基づいてdescriptionフィールドが埋められます。

845行目( https://core.trac.wordpress.org/browser/tags/4.9/src/wp-include/nav-menu.php#L845 )では、短縮されてフィルタ処理されています。

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

そしてwp_trim_words関数はテキストを特定の単語数にトリミングしますが、それは改行を保存しません - したがって、改行はスペースに置き換えられます。

それで我々はそれについて何ができる?

wp_trim_wordsには、その振る舞いを変更できるようにするフィルタはありません。 wp_trim_words呼び出しをスキップすることを可能にするフィルタもありませんが、...

\nをプレースホルダーに置き換えてから、nav_menu_descriptionフィルターを使用して元に戻すことができます。ユーザーがこのプレースホルダーを自分で置く必要さえない - 私たちはsave_post filterを持つプレースホルダーでそれらを置き換えることができる:

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

そしてそれだけです。あなたのテーマの中でそのような改行を正しく表示することを忘れないでください(nl2brなど)。

3