1. Filtrando o conteúdo
Este é um filtro de conteúdo de uma função para atender aos quatro requisitos acima:
add_filter( 'the_content', 'strip_some_paragraphs', 20 );
function strip_some_paragraphs( $content ) {
$content = preg_replace(
'/<p>(([\s]*)|[\s]*(<img[^>]*>|\[[^\]]*\])[\s]*)<\/p>/',
'$3',
$content
);
return $content;
}
2. Recursos para expressões regulares
- regular-expressions.info - Manual, Básico & Tutoriais Avançados
- regexpal.com - testador de regex em tempo real, muito útil
- como para as funções de regex do php, o manual continua sendo o melhor recurso
3. O RegEx em 1. explicou
A regex atual é <p>(([\s]*)|[\s]*(<img[^>]*>|\[[^\]]*\])[\s]*)<\/p>
- '
denota o início e o fim de uma string, como de costume, /
é o delimitador de padrões.
Você mencionou quatro casos em que deseja remover as tags <p>
. Então, primeiro, nosso padrão deve começar com uma tag <p>
e terminar com a complementar </p>
. Isso vale para todos os quatro casos. No interior, queremos permitir que quatro opções diferentes sejam correspondências válidas. Agrupamos essas opções entre colchetes e usamos o caractere pipe |
para separá-las. |
corresponde a ambos os lados e pode ser agrupado. Você pode pensar nisso como "OR".
Agora, para as opções:
Vamos começar com os espaços em branco. \s
indica a classe de caractere de espaço em branco (espaços, tabulações e quebras de linha). Usamos o quantificador de estrela [\s]*
para corresponder a zero ou mais da classe de caracteres anterior.
Então, agora, combinamos todas as tags de parágrafo vazias. E por acaso, diminuiu os casos para corresponder a 3 - zero ou mais, cuida de <p></p>
e <p> </p>
. Nice.
Quanto aos outros dois, agruparemos ambos em [\s]*
adicional, para que não apenas <p>[shortcode]</p>
, mas também, por exemplo,
<p>
[shortcode] </p>
é correspondido.
O que resta fazer agora é criar padrões para combinar códigos de acesso e img
tags. Aqui nós fazemos uso da negação da classe de caractere. O caret ^
no início de uma classe de caracteres nega isso. Portanto, [^>]
corresponde a qualquer caractere que não seja >
.
Iniciamos o padrão para as imagens com uma tag de abertura <img
e para o shortcode com um colchete \[
. Este último deve ser escapado com uma barra, pois é um caractere especial de regex.
Agora usamos a classe de caractere negada acima mencionada com o quantificador de estrela. [^>]*
para o img e [^\]]*
para o shortcode, correspondendo tudo menos o respectivo caractere de fechamento. Então, combinamos esse caractere de fechamento uma vez e terminamos.
Portanto, obtemos <img[^>]*
para as imagens e \[[^\]]*\]
para o shortcode.
Nós os agrupamos em possíveis espaços em branco múltiplos: [\s]*<img[^>]*>[\s]*
e [\s]*\[[^\]]*\][\s]*
Agrupar esses dois e adicionar apenas espaços em branco como a primeira opção produz o interior dos parênteses e finalmente agrupamos as tags de parágrafo.
Para a substituição, usamos a referência de referência $3
, que cuida da imagem real e as tags shortcode não desaparecem. Para que os espaços em branco não permaneçam, fizemos dois subgrupos das opções possíveis. Apenas img e shortcode são direcionados pela referência de volta.
4. Sidenote
Esta questão é limítrofe do escopo do WPSE - como é principalmente no PHP & Expressões regulares. Pode ser melhor perguntar no StackOverflow. De qualquer forma, agora é respondido.