Come disattivare i tag a chiusura automatica per il markup in WordPress (per HTML5 o HTML4, ad esempio)?


18

Voglio usare HTML5 nel mio tema WordPress, come posso disattivare wptexturize?

Non mi dispiace WP aggiungendo pause, ma voglio che lo siano <br>e non <br />. Come posso ottenere il controllo su come vengono visualizzate le interruzioni nel mio codice?

EDIT: mi interessa davvero solo il <br>problema dei tag, non mi importa delle modifiche tipografiche che apporta.

EDIT2: In realtà, immagino che anche i <img>tag contino . Qualsiasi tag autonomo a chiusura automatica sarà importante qui. Quindi, <hr>potrebbe anche essere un problema. Per non parlare di wp_head()elementi come <link>e vari <meta>tag.


1
cosa c'è che non va <br />?
Scott M.

2
Va bene, ma se voglio andare alla versione non XML di HTML5, non voglio i finali `/>` in stile XML.
artlung,

Ho pensato che <br /> fosse html e xhtml validi? Quando no?
Ryan Gibbons,

5
Credo che questa domanda sia estremamente fuorviante. wptexturize non impedisce in alcun modo a un sito di essere conforme a HTML 5.
Ryan Gibbons,

2
Qualcuno può ridisegnare questo titolo sulla falsariga di "Come rimuovo le barre finali dagli elementi a chiusura automatica nel markup generato da wordpress"?
Bobby Jack,

Risposte:


21

Le interruzioni di riga vengono aggiunte da wpautop(), non wptexturize(). wpautop()è anche la funzione che aggiunge automaticamente i tag di paragrafo.

Faresti meglio a sistemare quello <br />che stai sostituendo il filtro. Poiché wpautop()viene eseguito con priorità 10, puoi semplicemente collegarlo dopo e risolverlo.

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

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

Modifica dopo l'aggiornamento OP:

Le funzioni di WordPress sono progettate per produrre XHTML. Per sbarazzarsi di quelle barre finali in tutto il sito, dovrai usare un buffer di output. È possibile utilizzare un filtro simile a quello sopra per sostituire le barre nei contenuti dei post, ma ciò non catturerebbe la testa, la barra laterale, ecc.

È un po 'brutto e potrebbe avere un piccolo impatto sulle prestazioni, ma ecco qui (rilascialo in un plugin o nel functions.phpfile del tuo 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();
}

Quel codice dice che se non sei nell'area di amministrazione e non stai eseguendo una gestione delle richieste AJAX, quindi inizia a bufferizzare l'output attraverso un filtro e quindi usando l'hook di arresto di WordPress, emetti quel buffer.


Non ho ancora avuto il tempo di decifrare funzioni.php, ma potresti approfondire dove andrà il blocco? Potrebbe essere evidente una volta che avrò la possibilità di aprire quel file, ma immagino che eliminerei la domanda.
Thomas Owens,

@Thomas: il functions.phpfile del tuo tema è proprio come un file plugin. Qualsiasi codice presente verrà automaticamente eseguito. Non importa dove vada finché è valido PHP.
Viper007Bond

Ah. Interessante. Sono abbastanza nuovo nello sviluppo di WordPress, quindi sto ancora imparando molto. Grazie per averlo chiarito.
Thomas Owens,

8

Ecco qui:

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

Non è la soluzione più elegante, ma lo fa molto più velocemente che riscrivere wpautop e wptexturize.


1
+1 Ho fatto qualcosa di molto simile per HTML 4.01 Conformità rigorosa.
Trevor Bramble,

7

L'ho appena trovato; i tag autochiudenti sugli elementi vuoti sono html validi.

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

Ulteriori informazioni:

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


1
"Tuttavia, a causa dei diffusi tentativi di utilizzare XHTML1, esiste un numero significativo di pagine che utilizzano la barra finale. Per questo motivo, la sintassi della barra finale è stata consentita su elementi vuoti in HTML per facilitare la migrazione da XHTML1 a HTML5. " Consentito come eredità. Penso che la via da seguire sia abbandonare il "/" extra, quindi la mia domanda. Penso che WordPress debba consentire l'opzione per creare il codice in xhtml o html4.01 o html5.
artlung,

Questo è il problema che stai leggendo in ciò che viene detto. Le barre finali sono consentite, il che significa che è una sintassi valida. Stai ipotizzando che verrà rimosso? Perché indovinare dove stanno andando gli standard e creare lavoro per risolvere un problema che non esiste?
Ryan Gibbons,

Non sto speculando su niente. Non sto indovinando nulla. Il segno / non è richiesto dalle specifiche e voglio avere l'opzione per rimuoverlo in WordPress.
artlung,

Mi piace XHTML, dobbiamo tornare all'aspetto disordinato del vecchio HTML.
Arlen Beiler,

Arlen, mi piace HTML ordinato, mi piace xhtml. Sono un grande fan dei validatori. Ho scritto il mio documento personale per eseguire la convalida sul mio codice. Ho usato HTML 3.2, HTML 4, 4.01, anche HTML 2.0! lab.artlung.com/html-2.0 - ma vorrei l'opzione per rimuovere i tag a chiusura automatica in WordPress. Non sembra che dovrebbe essere un grosso problema. Sento che discutere con la premessa della mia domanda non è di grande aiuto.
artlung,

6

Questo può essere disabilitato ad esempio nel file function.php del tema sfruttando la remove_filter()funzione (http://codex.wordpress.org/Function_Reference/remove_filter)

remove_filter("the_content", "wptexturize");

1
Posso avere un controllo più granulare su questo? Non perderò i segni tipografici se lo faccio in questo modo?
artlung,

Non sono a conoscenza di alcun approccio semplice dalla parte superiore della mia testa, ma fammi vedere cosa posso capire per te.
Thomas

A corto di riprodurre la funzionalità desiderata trovata in wptexturize(), non sono riuscito a trovare altre soluzioni praticabili.
thomasjo,

Mi chiedo se ci sarebbe un modo per invertire semplicemente il <br />- sostituire quelli con <br>forse?
artlung,

5

Ho un tema iniziale per html5 e WordPress e anche una funzione non per wptexturize, ma per wpautop (). Includi anche altri elementi di html, come thead, tfoot, a parte e usa la sintassi di html5 come
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 nicolas@nicolasgallagher.com
 */
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');

vedi di più sullo svn del tema di avvio html5, non un framework!


3

Disabilita il plugin WPtexturize ha funzionato per me: disabilita WPtexturize

È piuttosto semplice però:

remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.