用换行符显示菜单项说明

时间:2018-03-14 作者:Morten Buller Resen Kibsgaard

我的主题有问题。。。

我使用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 );
这帮助我得到了要显示的描述。但我无法在描述中换行。每次我只是换行或插入并保存更改,它就会再次删除更改。

因此,任何人都可以帮助我实现一个功能,该功能既可以显示描述,也可以让我在描述中添加内容。

谢谢:D

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

好吧,我花了一点时间调试这个行为,但是。。。我现在一切都很清楚。。。我不确定这是否完全是故意的。。。

为什么会这样

So。。。换行符正确存储在DB中。然后在wp_setup_nav_menu_item 描述字段是根据post_content 给定菜单项post的列。

在线845(https://core.trac.wordpress.org/browser/tags/4.9/src/wp-includes/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 过滤器:

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 等等)。

结束

相关推荐

Add HTML to Term Description

我正在尝试添加(使用wp_editor ) 不带加号的HTML术语描述。每当我尝试吐出数据时,都会得到转义的HTML:&lt;strong&gt;test&lt;/strong&gt; 应该是<strong>test</strong>我试过了html_entity_decode() 但会带来意想不到的后果。。。<div class=\"\\&quot;big\">Test</div> 应该是<div class=