O editor TinyMCE extra retira as tags <p> e as tags?

22

Ei pessoal, adicionei um TinyMCE a algumas áreas de texto que são exibidas em uma meta box personalizada. Toda a formatação funciona perfeitamente, exceto pelo fato de o editor não salvar <p>ou <br/>marcar. Não preserva as quebras de linha.

O TinyMCE está configurado assim:

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

E isso tudo funciona perfeitamente bem. Todos os botões de formatação funcionam bem, exceto as tags <P>e <BR>.

Não tenho certeza se o editor os retirará antes ou depois que a meta meta for salva.

Idéias?

Pippin
fonte
Consegui fazê-lo funcionar de uma maneira. Duplicando a função do núcleo e alterando 'remove_linebreaks' => truepara 'remove_linebreaks' => false. Mas ele não funciona se eu especificar 'remove_linebreaks' => falsena matriz configurações passado para a função
Pippin
@ Arthur Carabott sim, isso também fez o truque para mim. Vamos adicionar um link para os documentos: codex.wordpress.org/Function_Reference/wpautop Bye!
Luca Reghellin
Estamos vendo uma coisa muito estranha. As postagens digitadas à mão / coladas têm as quebras preservadas na edição. As postagens que importamos estão sujeitas ao editor que interrompe as quebras de linha na edição.
JCL1178

Respostas:

16

Recentemente, consegui esse trabalho. Você deve procurar e substituir metanamepelo seu nome da meta box.

A chave para manter a formatação estava sendo usada wpautop();ao salvar os dados.

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));        
}
Arthur Carabott
fonte
update_post_metatambém add_post_metase o meta_keya ser inserido não existir.
precisa saber é o seguinte
5

Aqui está (uma versão reduzida) do que eu uso para configurar o 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');

Presumo que isto é o que você já tentou?

EDITAR:

Pode ser necessário incluir outras alterações na configuração, como:

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

Brinque com os parâmetros de configuração do TinyMCE e encontre o que você precisa alterar.

Chip Bennett
fonte
Não, eu não usei isso. Como eu filtraria meu wp_tiny_mce com sua função?
Pippin
Solte o código functions.php.
Chip Bennett
Hmmm, isso não está funcionando.
Pippin
Veja minha edição. Você pode não estar direcionando o parâmetro de configuração correto.
Chip Bennett
1
Ele já deve estar conectado tiny_mce_before_init. Você não o tem dentro de outra função, objeto, etc.?
Chip Bennett
5

Isso parece ter mudado um pouco nas versões subseqüentes do Wordpress. Agora você pode desativar esta funcionalidade da seguinte maneira:

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

Talvez encontre uma solução mais simples para isso:

no modelo real, altere isso:

<?php echo get_the_content());?>

para isso:

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

Dessa forma, o wpautop () adiciona as tags removidas pelo TinyMCE em um modelo por modelo.

patricksayshi
fonte
2

por que não usar a nova função wordpress wp_editorpara renderizar o timbre? Dessa forma, tudo será tratado. E quando você mostrar o conteúdo ao usuário, aplique o filtro the_content.

Como isso:

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

O filtro the_contentconverterá automaticamente os freios do link para <br>e <p>.

Sisir
fonte
No momento em que essa pergunta foi publicada, a função wp_editor () não estava disponível.
Pippin
1

Outra solução simples: use códigos de acesso!

Coloque esse código em functions.php e use [br] no editor de conteúdo - HTML ou visual - onde quiser que uma tag br apareça.

add_shortcode("br", "br_tag");

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

}
Tapefreak
fonte
1

isto é para quem usa os metaboxes para wordpress: Nome do Plugin: URI do Plugin da Meta Box: deluxeblogtips com / meta-box

Eu modifiquei o /vendor/meta-box/inc/fields/wysiwyg.php na função estática:

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

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

- MAS A MELHOR SOLUÇÃO É -

Coloque isso em functions.php, ele chama o filtro do pluggin 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
claudio
fonte
Agora você não pode mais atualizar o plugin. Não é uma boa solução.
Fuxia
Tem alguma opinião um pouco mais construtiva? :) Onde posso colocar esse código no functions.php?
claudio
Conecte-se save_postantes do plug-in e prepare o valor em uma função separada?
fuxia