remover parágrafos vazios de the_content?

33

Ei pessoal, eu simplesmente quero impedir a criação de parágrafos vazios no meu post do wordpress. Isso acontece com bastante frequência ao tentar espaçar manualmente o conteúdo.

Não sei por que isso não entra em vigor?

/*Remove empty paragraph tags from the_content*/
function removeEmptyParagraphs($content) {

    /*$pattern = "/<p[^>]*><\\/p[^>]*>/";   
    $content = preg_replace($pattern, '', $content);*/
    $content = str_replace("<p></p>","",$content);
    return $content;
}

add_filter('the_content', 'removeEmptyParagraphs');

editar / atualizar:

Parece que o problema é este:

function qanda($content) {

    // filters for [q=some question] and [a=some answer]
    // wraps it inside of <div class="qanda"><div class="question"> </div><div class="answer"> </div></div>
    $content = preg_replace('/\[q=(.+?)].+?\[a=(.+?)]/is', '<div class="qanda"><div class="question">$1</div><div class="answer">$2</div></div>', $content);

    return $content;
}

add_filter('the_content', 'qanda');

Eu mesmo fiz essa função para filtrar um tipo de padrão de shortcode em minhas postagens e páginas. Mesmo que, no meu back-end, o post seja feito completamente sem parágrafos e espaçamentos desnecessários, o resultado será o seguinte:

<div class="entry">

    <p></p>
    <div class="qanda">...</div>
    <p></p>
    <p></p>
    <div class="qanda">...</div>
    <p></p>
    <p></p>
    <div class="qanda">...</div>

</div>

alguma idéia de onde vêm esses p vazios?

mathiregister
fonte
1
Tente executar o filtro antes de wpautopfazer as coisas, por exemplo. add_filter('the_content', 'qanda', 7 );..
t31os 03/04
@ t31os: Você pode mover seu comentário para uma resposta para que possamos votar?
Jan Fabry

Respostas:

20

O WordPress inserirá automaticamente <p>e </p>tags que separam as quebras de conteúdo em uma postagem ou página. Se, por algum motivo, você desejar ou precisar removê-los, poderá usar um dos seguintes trechos de código.

Para desativar completamente o filtro wpautop, você pode usar:

remove_filter('the_content', 'wpautop');

Se você ainda deseja que isso funcione, tente adicionar um valor de prioridade posterior ao seu filtro, algo como:

add_filter('the_content', 'removeEmptyParagraphs',99999);
Bainternet
fonte
2
obrigado! Eu sei que o wordpress insere automaticamente tags p. No entanto, existem alguns casos em que existem apenas tags <p> </p> vazias em algum lugar do meu conteúdo (quando eu as inspeciono com alguma ferramenta) ... isso acontece ao fazer muita remoção e edição de postagens. Só não quero ter parágrafos vazios no meu conteúdo, só isso. Eu preciso de parágrafos, mas não de parágrafos vazios. O 99999 não faz diferença. Simplesmente não funciona. o filtro wpautop não é o que eu quero. Impede todos os <p> 'e formatação automática. Eu só não quero nenhum p vazio!
mathiregister
Eu atualizei meu post para que você entenda o que eu quero dizer! Eu fiz uma função que já filtra o conteúdo. insere divs e parece que o wordpress está inserindo <p> </p> antes e depois, simplesmente não entendo. alguma ideia?
Mathregister
21

Eu tive o mesmo problema que você tem. Acabei de fazer uma ... digamos ... solução não muito bonita, mas funciona e até agora é a única solução que tenho. Eu adicionei uma pequena linha de JavaScript. Precisa de jQuery, mas tenho certeza que você pode descobrir isso sem.

Este é o meu pequeno JS:

$('p:empty').remove();

Isso funciona para mim!

David Faber
fonte
oh, não é um número pequeno e doce! Obrigado pela dica - funciona para mim e, se alguém mais se perguntou como usá-lo, basta colocá-lo no arquivo JS personalizado do seu tema.
Sol
11
Você também pode fazer isso com CSS:p:empty { display:none; }
@D_N Usar CSS para ocultar tags de parágrafo vazias só funciona, <p></p>mas não funciona <p>\n</p>.
Michael Ecklund
11

Eu sei que isso já está marcado como 'resolvido', mas apenas para referência, aqui está uma função que faz exatamente o que você deseja, sem precisar adicionar nenhuma marcação às postagens. Basta colocar isso nas funções do seu tema.php:

add_filter('the_content', 'remove_empty_p', 20, 1);
function remove_empty_p($content){
    $content = force_balance_tags($content);
    return preg_replace('#<p>\s*+(<br\s*/*>)?\s*</p>#i', '', $content);
}

Isto é desta essência: https://gist.github.com/1668216

Michelle
fonte
6
Apenas uma pequena observação sobre o uso de force_balance_tags () ... Encontrei um bug complicado causado por essa função quando ela era usada em conteúdo que incluía JavaScript (o JS era proveniente do Gravity Forms ao usar ajax em um formulário). Existem problemas conhecidos force_balance_tagsquando ele encontra o <personagem em determinadas situações. Veja o ticket [9270] ( core.trac.wordpress.org/ticket/9270 ) para obter detalhes.
Dave Romsey
Eu tive o mesmo problema destacado por Dave: o trecho removeu o vídeo incorporado do youtube e causou problemas de validação em páginas de amplificador também.
Marco Panichi 29/06
11

Basta usar CSS

p:empty {
  display: none;
}
pelo menos três caracteres
fonte
Por favor, adicione uma explicação para a sua resposta
Pieter Goosen
4
@PieterGoosen já é auto-explicativo
pelo menos três caracteres
Se você apenas deseja evitar exibi-los para fins de espaçamento, isso funciona bem no IE9. caniuse.com/#feat=css-sel3 e developer.mozilla.org/en-US/docs/Web/CSS/%3Aempty para mais.
Will
1
boa opção com o método seletor de CSS, não sabia que existia. obrigado!
i_a
1
FYI: Se houver &nbsp;dentro da tag <p>, isso não funcionará.
RynoRn 6/06
5

Você pode simplesmente executar o filtro antes que esse desagradável se wpautopligue e mexa com a marcação.

add_filter('the_content', 'qanda', 7 );

Dessa forma, você já converteu o que precisa no momento em que é ligado, o que ajuda em alguns casos.

t31os
fonte
3

A mesma abordagem que duas respostas antes de mim, mas um regex atualizado, porque o dele não funcionou para mim.

o regex: /<p>(?:\s|&nbsp;)*?<\/p>/i (grupo sem captura que procura por qualquer número de espaços em branco ou &nbsp;s dentro da tag p, tudo em maiúsculas e minúsculas.

add_filter('the_content', function($content) {
    $content = force_balance_tags($content);
    return preg_replace('/<p>(?:\s|&nbsp;)*?<\/p>/i', '', $content);
}, 10, 1);
kater louis
fonte
0

Achei isso estranho, mas, na verdade, chamar the_content()inserirá parágrafos da maneira que você descreve. Se você deseja o código html, basicamente como o inseriu (o mesmo que "visualizar HTML" ao editar), useget_the_content() que retorna o conteúdo sem formatação e tags de parágrafo.

Como o devolve, certifique-se de usar algo como:

echo get_the_content ();

Veja também: http://codex.wordpress.org/Function_Reference/get_the_content

cwd
fonte
bem obrigada No entanto, eu não quero isso! Eu preciso de parágrafos normais. Primeiro é a marcação semântica e, em segundo lugar, é exatamente como deveria. Só não tenho parágrafos vazios que não façam sentido! Simplesmente porque apliquei estilo a esses parágrafos, também aparecerão parágrafos vazios com esse estilo e minha página parece estranha.
mathiregister
Eu realmente me pergunto por que minha coisa add_filter não funciona?
mathiregister
Peguei vocês. Bem, uma coisa que eu recomendaria tentar é mudar do HTML para o visual e voltar uma ou duas vezes. Acredito que quando o editor WYSIWYG carrega, ele remove tags de parágrafo vazias.
Cwd
0

Isso removerá recursivamente todas as tags html vazias da string

add_filter('the_content', 'remove_empty_tags_recursive', 20, 1);
function remove_empty_tags_recursive ($str, $repto = NULL) {
         $str = force_balance_tags($str);
         //** Return if string not given or empty.
         if (!is_string ($str)
         || trim ($str) == '')
        return $str;

        //** Recursive empty HTML tags.
       return preg_replace (

              //** Pattern written by Junaid Atari.
              '/<([^<\/>]*)>([\s]*?|(?R))<\/\1>/imsU',

             //** Replace with nothing if string empty.
             !is_string ($repto) ? '' : $repto,

            //** Source string
           $str
);}

O padrão é obtido em http://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.html

user2914440
fonte
0

Se você tiver <p>tags com espaço em branco no conteúdo, vá para sua postagem ou página e edite-a não no estilo visual.

você encontraria alguns &nbsp;lá. Exclua-o e as <p>tags vazias desaparecerão.

Christian Isak
fonte
0

Para ter apenas conteúdo html sem

tags, podemos usar o seguinte loop para colocar apenas o html sem formatar a postagem ou a página

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
Shashank
fonte