Como desativo as tags de fechamento automático para marcação no WordPress (para HTML5 ou HTML4, por exemplo)?

18

Quero usar HTML5 no meu tema WordPress, como desativo o wptexturize?

Não me importo que o WP adicione pausas, mas quero que elas sejam <br>e não <br />. Como obtenho controle sobre como essas interrupções aparecem no meu código?

EDIT: Eu realmente me preocupo com a <br>questão da tag, não me importo com as alterações tipográficas que ela faz.

EDIT2: Na verdade, acho que as <img>tags também importam. Quaisquer tags independentes de fechamento automático serão importantes aqui. Portanto, <hr>pode ser um problema também. Sem mencionar wp_head()itens como <link>e várias <meta>tags.

artlung
fonte
1
o que há de errado <br />?
Scott M.
2
Tudo bem, mas se eu quiser mudar para a versão não XML do HTML5, não desejarei os finais `/>` no estilo XML.
Artlung 12/08/10
Eu pensei que <br /> era válido html e xhtml? Quando não foi?
Ryan Gibbons
5
Eu acredito que esta questão é extremamente enganosa. O wptexturize não impede de forma alguma que um site seja compatível com HTML 5.
Ryan Gibbons
2
Alguém pode, por favor, renomeá-lo ao longo das linhas de "Como remover barras finais de elementos de fechamento automático na marcação gerada pelo wordpress"?
Bobby Jack

Respostas:

21

Quebras de linha são adicionadas por wpautop(), não wptexturize(). wpautop()também é a função que adiciona automaticamente tags de parágrafo.

É melhor consertar <br />os filtros do que substituir o filtro. Como wpautop()é executado na prioridade 10, você pode conectar depois disso e corrigi-lo.

add_filter( 'the_content', 'html5_line_breaks', 25 );

function html5_line_breaks( $content ) {
    return str_replace( '<br />', '<br>', $content );
}

Editar após a atualização do OP:

As funções do WordPress são projetadas para gerar XHTML. Para se livrar dessas barras no site, você precisará usar um buffer de saída. Você pode usar um filtro semelhante ao acima para substituir barras no conteúdo da postagem, mas isso não chamaria sua atenção, barra lateral etc.

É um pouco feio e pode ter um pequeno impacto no desempenho, mas aqui está (solte isso em um plug-in ou no functions.phparquivo do seu tema ):

if ( !is_admin() && ( ! defined('DOING_AJAX') || ( defined('DOING_AJAX') && ! DOING_AJAX ) ) ) {
    ob_start( 'html5_slash_fixer' );
    add_action( 'shutdown', 'html5_slash_fixer_flush' );
}

function html5_slash_fixer( $buffer ) {
    return str_replace( ' />', '>', $buffer );
}

function html5_slash_fixer_flush() {
    ob_end_flush();
}

Esse código diz que se você não estiver na área de administração e não estiver executando um tratamento de solicitação AJAX, comece a armazenar em buffer a saída por meio de um filtro e, em seguida, usando o gancho de desligamento do WordPress, faça a saída desse buffer.

Viper007Bond
fonte
Ainda não tive tempo de abrir o functions.php aberto, mas você poderia explicar onde esse bloco vai? Pode ser evidente quando eu tiver a chance de abrir esse arquivo, mas acho que tiraria a pergunta do caminho.
Thomas Owens
@ Thomas: O functions.phparquivo do seu tema é como um arquivo de plug-in. Qualquer código lá será executado automaticamente. Não importa para onde vai, desde que seja PHP válido.
precisa saber é o seguinte
Ah Interessante. Eu sou bastante novo no desenvolvimento do WordPress, então ainda estou aprendendo muito. Obrigado por esclarecer isso.
Thomas Owens
8

Aqui está:

function my_awesome_tag_fixer( $input ){
  return preg_replace( '/(<.+)\s\/>/', '$1>', $input );
}

foreach( array('the_content', 'the_excerpt', 'comment_text') as $filter )
  add_filter( $filter, 'my_awesome_tag_fixer', 12 );

Não é a solução mais elegante, mas é muito mais rápida do que reescrever wpautop e wptexturize.

John P Bloch
fonte
1
+1 Fiz algo muito semelhante à conformidade estrita com o HTML 4.01.
Trevor Bramble
7

Apenas encontrei; tags de fechamento automático em elementos nulos são html válidos.

In HTML5 we've allowed the / on void elements (like <meta>, <img>, <br>, <input>, etc), to ease migration to and from XML.

http://lists.whatwg.org/pipermail/help-whatwg.org/2008-August/000137.html

Mais informações:

http://wiki.whatwg.org/wiki/FAQ#Should_I_close_empty_elements_with_.2F.3E_ou_.3E.3F

Ryan Gibbons
fonte
1
"No entanto, devido às amplas tentativas de usar o XHTML1, há um número significativo de páginas usando a barra final. Por esse motivo, a sintaxe da barra final foi permitida em elementos nulos no HTML para facilitar a migração do XHTML1 para o HTML5. " Permitido como legado. Eu acho que o caminho a seguir está descartando o "/" extra, portanto, minha pergunta. Eu acho que o WordPress precisa permitir a opção de criar código para xhtml, ou html4.01 ou html5.
Artlung 13/08/10
Esse é o problema que você está lendo sobre o que está sendo dito. Barras finais são permitidas, o que significa que é uma sintaxe válida. Você está especulando que ele será removido? Por que adivinhar para onde os padrões estão indo e criar trabalho para resolver um problema que não existe?
Ryan Gibbons
Não estou especulando sobre nada. Não estou adivinhando nada. A marca / não é exigida pela especificação e quero ter a opção de removê-la no WordPress.
Artlung
Eu gosto de XHTML, precisamos voltar à aparência desordenada do antigo HTML.
Arlen Beiler
Arlen, eu gosto de html ordenado, eu gosto de xhtml. Eu sou um grande fã de validadores. Eu escrevi meu próprio doctype para validar em meu próprio código. Eu usei html 3.2, html 4, 4.01, até html 2.0! lab.artlung.com/html-2.0 - mas eu gostaria da opção de remover tags de fechamento automático no WordPress. Não parece que deve ser um grande negócio. Sinto que discutir com a premissa da minha pergunta é muito inútil.
Artlung
6

Isso pode ser desativado, por exemplo, no arquivo function.php do tema, aproveitando a remove_filter()função (http://codex.wordpress.org/Function_Reference/remove_filter)

remove_filter("the_content", "wptexturize");
thomasjo
fonte
1
Posso obter um controle mais granular sobre isso? Não vou perder as marcas tipográficas se fizer dessa maneira?
Artlung
Não estou ciente de nenhuma abordagem simples, mas deixe-me ver o que posso descobrir para você.
Thomasjo 11/08/10
Com falta de reproduzir a funcionalidade desejada encontrada em wptexturize() , não consegui encontrar outras soluções viáveis.
Thomasjo 11/08/10
Gostaria de saber se haveria uma maneira de simplesmente reverter o <br />- substituí-los por <br>talvez?
Artlung
5

Eu tenho um tema inicial para html5 e WordPress e também uma função não para wptexturize, mas para wpautop (). Inclua também outros elementos do html, como thead, tfoot, apart e use a sintaxe do html5 como
e

/**
 * wpautop for HTML5, allowed: table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr|fieldset|legend|section|article|aside|header|footer|hgroup|figure|details|figcaption|summary)
 * @link http://nicolasgallagher.com/using-html5-elements-in-wordpress-post-content/
 * @author [email protected]
 */
function html5wpautop($pee, $br = 1) {
    if ( trim($pee) === '' )
            return '';

    $pee = $pee . "\n"; // just to make things a little easier, pad the end
    $pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
    // Space things out a little
    // *insertion* of section|article|aside|header|footer|hgroup|figure|details|figcaption|summary
    $allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr|fieldset|legend|section|article|aside|header|footer|hgroup|figure|details|figcaption|summary)';
    $pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "\n$1", $pee);
    $pee = preg_replace('!(</' . $allblocks . '>)!', "$1\n\n", $pee);
    $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines
    if ( strpos($pee, '<object') !== false ) {
            $pee = preg_replace('|\s*<param([^>]*)>\s*|', "<param$1>", $pee); // no pee inside object/embed
            $pee = preg_replace('|\s*</embed>\s*|', '</embed>', $pee);
    }
    $pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates
    // make paragraphs, including one at the end
    $pees = preg_split('/\n\s*\n/', $pee, -1, PREG_SPLIT_NO_EMPTY);
    $pee = '';
    foreach ( $pees as $tinkle )
            $pee .= '<p>' . trim($tinkle, "\n") . "</p>\n";
    $pee = preg_replace('|<p>\s*</p>|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace
    // *insertion* of section|article|aside
    $pee = preg_replace('!<p>([^<]+)</(div|address|form|section|article|aside)>!', "<p>$1</p></$2>", $pee);
    $pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee); // don't pee all over a tag
    $pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problem with nested lists
    $pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $pee);
    $pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee);
    $pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)!', "$1", $pee);
    $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee);
    if ($br) {
            $pee = preg_replace_callback('/<(script|style).*?<\/\\1>/s', create_function('$matches', 'return str_replace("\n", "<WPPreserveNewline />", $matches[0]);'), $pee);
            $pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line breaks
            $pee = str_replace('<WPPreserveNewline />', "\n", $pee);
    }
    $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*<br />!', "$1", $pee);
    // *insertion* of img|figcaption|summary
    $pee = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol|img|figcaption|summary)[^>]*>)!', '$1', $pee);
    if (strpos($pee, '<pre') !== false)
            $pee = preg_replace_callback('!(<pre[^>]*>)(.*?)</pre>!is', 'clean_pre', $pee );
    $pee = preg_replace( "|\n</p>$|", '</p>', $pee );

    return $pee;
}

// remove the original wpautop function
remove_filter('the_excerpt', 'wpautop');
remove_filter('the_content', 'wpautop');

// add our new html5autop function
add_filter('the_excerpt', 'html5wpautop');
add_filter('the_content', 'html5wpautop');

veja mais sobre o svn do tema inicial do html5, não um framework!

bueltge
fonte
3

Desativar o plugin WPtexturize funcionou para mim: Desativar WPtexturize

É bem simples:

remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
Bob Sherron
fonte