好吧,我花了一点时间调试这个行为,但是。。。我现在一切都很清楚。。。我不确定这是否完全是故意的。。。
为什么会这样
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
等等)。