额外的TinyMCE编辑器带<p>和<br>标签吗?


22

大家好,我已经将TinyMCE添加到了自定义元框中显示的一些文本区域。除编辑器不会保存<p><br/>标记外,所有格式都可以正常工作。它不会保留换行符。

TinyMCE的设置如下:

wp_tiny_mce(true, array('editor_selector' => $field['class'] ) );

'<textarea name="', $field['id'], '" class="', $field['class'], '" id="', $field['id'], '" cols="60" rows="8" style="width:97%">', $meta ? esc_html($meta) : $field['std'], '</textarea>';

而且一切正常。除<P><BR>标记外,所有格式化按钮都可以正常工作。

我不确定编辑器是在保存帖子元之前还是之后删除它们。

有想法吗?


我设法使其以一种方式工作。通过从核心复制功能,然后更改'remove_linebreaks' => true'remove_linebreaks' => false。但是,如果我'remove_linebreaks' => false在传递给函数的设置数组中指定
Pippin

@Arthur Carabott是的,这对我也有帮助。让我们添加到文档的链接:codex.wordpress.org/Function_Reference/wpautop再见!
卡·雷格尔林

我们看到了一件很奇怪的事情。手动输入/粘贴的帖子在编辑时保留了休息时间。我们导入的帖子必须由编辑者删除,才能在编辑时删除换行符。
JCL1178

Answers:


16

我最近开始工作了。您应该搜索并替换metaname为您的元框名称。

保留格式的关键是wpautop();在保存数据时使用。

add_action( 'add_meta_boxes', 'add_metaname_box');

add_action( 'save_post', 'metaname_save');

function add_metaname_box() {
    add_meta_box(
        'metaname_id',
        __( 'metaname text', 'metaname_textdomain'),
        'metaname_custom_box',
        'page'
    );
}

function metaname_custom_box() {
    global $post;
    wp_nonce_field( plugin_basename( __FILE__ ), 'metaname_noncename' );
    $data = get_post_meta($post->ID, 'metaname_custom_box', true);
    echo <<<EOT
    <script type="text/javascript">
jQuery(document).ready(function() {
    jQuery("#metaname_custom_box").addClass("mceEditor");
    if ( typeof( tinyMCE ) == "object" &&
         typeof( tinyMCE.execCommand ) == "function" ) {
        tinyMCE.execCommand("mceAddControl", false, "metaname_custom_box");
    }
});
</script>
    <textarea id="metaname_custom_box" name="metaname_custom_box">$data</textarea>
EOT;
}

function metaname_save($post_id) {
    global $post;

    // Verify
     if ( !wp_verify_nonce( $_POST['metaname_noncename'], plugin_basename(__FILE__) )) {
         return $post_id;
     }
     if ( 'page' == $_POST['post_type'] ) {
         if ( !current_user_can( 'edit_page', $post_id ))
             return $post_id;
     } else {
         if ( !current_user_can( 'edit_post', $post_id ))
             return $post_id;
     }

     $key = 'metaname_custom_box';
    $data = wpautop($_POST[$key]);

     // New, Update, and Delete
     if(get_post_meta($post_id, $key) == "") 
         add_post_meta($post_id, $key, $data, true);
     elseif($data != get_post_meta($post_id, $key, true))
         update_post_meta($post_id, $key, $data); 
     elseif($data == "")
         delete_post_meta($post_id, $key, get_post_meta($post_id, $key, true));        
}

update_post_meta也会add_post_meta如果meta_key要插入不存在。
vmassuchetto 2011年

5

这是我用来自定义配置TinyMCE的内容的精简版本:

// http://tinymce.moxiecode.com/wiki.php/Configuration
function cbnet_tinymce_config( $init ) {

    // Don't remove line breaks
    $init['remove_linebreaks'] = false; 

    // Pass $init back to WordPress
    return $init;
}
add_filter('tiny_mce_before_init', 'cbnet_tinymce_config');

我认为这是您已经尝试过的?

编辑:

您可能需要包括其他一些配置更改,例如:

// Convert newline characters to BR tags
$init['convert_newlines_to_brs'] = true; 
// Do not remove redundant BR tags
$init['remove_redundant_brs'] = false;

使用TinyMCE配置参数,找到需要更改的参数。


不,我没有用。如何使用您的函数过滤wp_tiny_mce?
Pippin

将代码放入中functions.php
Chip Bennett

嗯,那不行。
Pippin

看到我的编辑。您可能没有针对正确的配置参数。
Chip Bennett

1
它应该已经迷上了tiny_mce_before_init。您没有在另一个函数或对象等内部使用它吗?
Chip Bennett

5

在随后的Wordpress版本中,这似乎已经有所改变。您现在可以通过以下方式禁用此功能:

add_filter('tiny_mce_before_init', function($init) {
    $init['wpautop'] = false;
    return $init;
}

3

找到了一个更简单的解决方法:

在实际模板上,更改以下内容:

<?php echo get_the_content());?>

对此:

<?php echo wpautop(get_the_content());?>

这样,wpautop()在逐个模板的基础上添加 TinyMCE剥离的标签。


2

为什么不使用wordpress new函数wp_editor来渲染tinymce。这样,一切都会得到处理。当向用户显示内容时,请应用过滤器the_content

像这样:

$meta = "content of the metabox";
echo apply_filters('the_content', $meta);

过滤器the_content将自动将连杆制动器转换为<br><p>


在发布此问题时,wp_editor()函数不可用。
皮平2012年

1

另一个简单的解决方案:使用简码!

将此代码放到functions.php中,并在想要出现br标签的位置使用[br]在HTML或Visual的内容编辑器中。

add_shortcode("br", "br_tag");

function br_tag(){
    return("<br/>");                            

}

1

适用于使用metabox进行wordpress的用户:插件名称:Meta Box插件URI:deluxeblogtips com / meta-box

我已经在静态函数中修改了/vendor/meta-box/inc/fields/wysiwyg.php:

static function html( $html, $meta, $field )

//just after the else i have added :
$meta = html_entity_decode($meta); // 
//and solve the problem ;)

-更好的解决方案是-

将其放入functions.php中,它会从metaboxes插件中调用过滤器:

function meta_wysiwyg_antes_save($meta)
{   
    $meta = html_entity_decode($meta);
    return $meta;
}
add_filter("rwmb_(ID-OF-METABOX-FIELD)_meta", "meta_wysiwyg_antes_save"); //en meta-box.php 194

现在,您无法再更新插件。不是一个好的解决方案。
fuxia

有一些更具建设性的意见吗?:)我在哪里可以将此代码放在functions.php上?
claudio

勾成save_post比插件较早,在一个单独的功能准备的价值?
fuxia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.