Thêm thẻ biên tập TinyMCE <p> và <br>?


22

Chào các bạn, tôi đã thêm TinyMCE vào một số textareas được hiển thị trong hộp meta tùy chỉnh. Tất cả các định dạng hoạt động hoàn toàn tốt, ngoại trừ việc trình soạn thảo sẽ không lưu <p>hoặc <br/>thẻ. Nó không bảo toàn các ngắt dòng.

TinyMCE được thiết lập như thế này:

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

Và tất cả đều hoạt động tốt. Tất cả các nút định dạng hoạt động tốt, ngoại trừ các thẻ <P><BR>.

Tôi không chắc chắn nếu biên tập viên tước chúng ra trước hay sau khi meta bài được lưu.

Ý tưởng?


Tôi quản lý để làm cho nó hoạt động theo một cách. Bằng cách nhân đôi chức năng từ cốt lõi, và thay đổi 'remove_linebreaks' => truethành 'remove_linebreaks' => false. Nhưng nó không hoạt động nếu tôi chỉ định 'remove_linebreaks' => falsetrong mảng cài đặt được truyền cho hàm
Pippin

@Arthur Carabott vâng, điều đó cũng đã lừa tôi. Hãy thêm một liên kết đến các tài liệu: codex.wordpress.org/Function_Reference/wpautop Tạm biệt!
Luca Reghellin

Chúng ta đang thấy một điều rất kỳ lạ. Các bài viết được nhập bằng tay / sao chép-dán có các khoảng nghỉ được bảo toàn khi chỉnh sửa. Các bài đăng mà chúng tôi đã nhập phải tuân theo trình soạn thảo thổi bay các ngắt dòng khi chỉnh sửa.
JCL1178

Câu trả lời:


16

Gần đây tôi đã làm việc này. Bạn nên tìm kiếm và thay thế metanamebằng tên hộp meta của bạn.

Chìa khóa để duy trì định dạng là sử dụng wpautop();khi lưu dữ liệu.

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_metacũng sẽ add_post_metanếu meta_keykhông được chèn vào.
vmassuchetto

5

Đây là (phiên bản rút gọn của) những gì tôi sử dụng để cấu hình tùy chỉnh 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');

Tôi cho rằng đây là những gì bạn đã cố gắng?

CHỈNH SỬA:

Bạn có thể cần bao gồm một số thay đổi cấu hình khác, chẳng hạn như:

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

Chơi xung quanh với các tham số cấu hình TinyMCE và tìm thông số bạn cần thay đổi.


Không, tôi đã không sử dụng nó. Làm cách nào để lọc wp_tiny_mce của tôi với chức năng của bạn?
Pippin

Thả mã vào functions.php.
Chip Bennett

Hmmm, điều đó không làm việc.
Pippin

Xem chỉnh sửa của tôi. Bạn có thể không nhắm mục tiêu tham số cấu hình chính xác.
Chip Bennett

1
Nó đã được nối, vào tiny_mce_before_init. Bạn không có nó bên trong một chức năng, hoặc đối tượng khác, v.v., phải không?
Chip Bennett

5

Điều này dường như đã thay đổi một chút trong các phiên bản tiếp theo của Wordpress. Bây giờ bạn có thể vô hiệu hóa chức năng này:

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

3

Tìm thấy có lẽ một cách giải quyết đơn giản hơn cho việc này:

trên mẫu thực tế, thay đổi điều này:

<?php echo get_the_content());?>

đến đây:

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

Cách này wpautop () thêm các thẻ được TinyMCE loại bỏ trên một mẫu theo cơ sở mẫu.


2

Tại sao bạn không sử dụng chức năng mới của wordpress wp_editorđể kết xuất tinymce. Bằng cách đó, mọi thứ sẽ được xử lý. Và khi bạn hiển thị nội dung cho người dùng, hãy áp dụng bộ lọc the_content.

Như thế này:

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

Bộ lọc the_contentsẽ tự động chuyển đổi hệ thống phanh liên kết thành <br><p>.


Tại thời điểm câu hỏi này được đăng, hàm wp_editor () không khả dụng.
Pippin

1

Một giải pháp đơn giản khác: Sử dụng Shortcodes!

Đặt mã này vào hàm.php và sử dụng [br] trong trình chỉnh sửa nội dung - HTML hoặc trực quan - bất cứ nơi nào bạn muốn thẻ br xuất hiện.

add_shortcode("br", "br_tag");

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

}

1

cái này dành cho ai sử dụng metaboxes cho wordpress: Tên plugin: Meta Box Plugin URI: deluxeblogtips com / meta-box

tôi đã sửa đổi /vendor/meta-box/inc/fields/wysiwyg.php trong hàm tĩnh:

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

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

- NHƯNG GIẢI PHÁP TỐT HƠN -

Đặt cái này vào hàm.php, nó gọi bộ lọc từ plugin của 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

Bây giờ bạn không thể cập nhật các plugin nữa. Không phải là một giải pháp tốt.
fuxia

Có một số ý kiến ​​xây dựng hơn một chút? :) Tôi có thể đặt mã này ở đâu trên tệp.php?
claudio

Nối vào save_postsớm hơn plugin và chuẩn bị giá trị trong một chức năng riêng biệt?
fuxia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.