Come disattivare i tag auto-chiudenti per il markup in WordPress (per HTML5 o HTML4, ad esempio)?
Voglio utilizzare HTML5 nel mio tema WordPress, come posso disattivare wptexturize?
Non mi dispiace che WP aggiunga interruzioni, ma voglio che siano <br>
e non <br />
. Come posso controllare come queste interruzioni appaiono nel mio codice?
MODIFICA: Mi interessa principalmente il problema del tag <br>
, non mi disturbano le modifiche tipografiche che apporta.
MODIFICA2: In realtà, anche i tag <img>
sono importanti. Qualsiasi tag standalone auto-chiudente sarà rilevante qui. Quindi, anche <hr>
potrebbe essere un problema. Senza contare elementi come wp_head()
quali <link>
e vari tag <meta>
.
Gli interruzioni di riga vengono aggiunte da wpautop()
, non da wptexturize()
. wpautop()
è anche la funzione che aggiunge automaticamente i tag di paragrafo.
È meglio correggere i <br />
piuttosto che sostituire il filtro. Poiché wpautop()
viene eseguito con priorità 10, puoi semplicemente agganciarti dopo e sistemarlo.
add_filter( 'the_content', 'html5_line_breaks', 25 );
function html5_line_breaks( $content ) {
return str_replace( '<br />', '<br>', $content );
}
Modifica dopo l'aggiornamento dell'OP:
Le funzioni di WordPress sono progettate per emettere XHTML. Per eliminare quelle barre finali in tutto il sito, dovrai utilizzare un buffer di output. Potresti usare un filtro simile a quello sopra per sostituire le barre nei contenuti dei post, ma questo non coprirebbe l'head, la sidebar, ecc.
È un po' brutto e potrebbe avere un piccolo impatto sulle prestazioni, ma ecco qui (inserisci questo in un plugin o nel file functions.php
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();
}
Questo codice dice che se non sei nell'area di amministrazione e non stai gestendo una richiesta AJAX, allora inizia a bufferizzare l'output attraverso un filtro e poi, usando l'hook di shutdown di WordPress, emetti quel buffer.

Non ho ancora avuto tempo di aprire functions.php, ma potresti spiegarmi dove va inserito quel blocco if? Forse sarà evidente una volta che avrò modo di aprire quel file, ma ho pensato di togliermi la curiosità.

@Thomas: Il file functions.php
del tuo tema funziona esattamente come un file di plugin. Qualsiasi codice al suo interno verrà eseguito automaticamente. Non importa dove lo inserisci, purché sia PHP valido.

Ecco qui:
// Funzione per correggere i tag auto-chiusi in modo errato
function my_awesome_tag_fixer( $input ){
// Sostituisce tutti i tag che terminano con "/>" con ">"
return preg_replace( '/(<.+)\s\/>/', '$1>', $input );
}
// Applica il filtro a diversi punti chiave di WordPress
foreach( array('the_content', 'the_excerpt', 'comment_text') as $filter )
add_filter( $filter, 'my_awesome_tag_fixer', 12 );
Non è la soluzione più elegante, ma risolve il problema molto più velocemente che riscrivere wpautop e wptexturize.

L'ho appena scoperto; i tag self-closing sugli elementi void sono HTML validi.
In HTML5 abbiamo permesso l'uso di / sugli elementi void (come <meta>, <img>, <br>, <input>, ecc.), per facilitare la migrazione da e verso 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

"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 con la barra finale è stata consentita negli elementi void in HTML per facilitare la migrazione da XHTML1 a HTML5."
Consentito come legacy. Penso che la strada da seguire sia eliminare il "/" aggiuntivo, da qui la mia domanda. Credo che WordPress debba permettere l'opzione di creare codice in xhtml, o html4.01 o html5.

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

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

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

Arlen, mi piace l'html ordinato, mi piace xhtml. Sono un grande fan dei validatori. Ho scritto il mio doctype per fare validazioni sul mio codice. Ho usato html 3.2, html 4, 4.01, persino html 2.0! http://lab.artlung.com/html-2.0/ -- ma mi piacerebbe avere l'opzione di rimuovere i tag self-closing in WordPress. Non sembra che dovrebbe essere un grosso problema. Sento che discutere la premessa della mia domanda non è molto d'aiuto.

@artlung: Penso che il problema sia che alcune persone hanno assunto che tu non sia consapevole che "<br />", "<br>" e persino "<br><br />" sono tutti perfettamente validi in HTML5. Tuttavia, penso che la tua domanda sia totalmente valida, indipendentemente da dove andrà HTML5 in futuro, se riformulata; WordPress dovrebbe essere in grado di produrre HTML4 valido, dopotutto.

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

Non sono a conoscenza di alcun approccio semplice al momento, ma fammi vedere cosa riesco a trovare per te.

A parte riprodurre la funzionalità desiderata presente in wptexturize()
, non sono riuscito a trovare altre soluzioni valide.

Ho un tema starter per HTML5 e WordPress e anche una funzione non per wptexturize, ma per wpautop(). Include anche altri elementi HTML come thead, tfoot, aside e usa la sintassi di HTML5 come <br> e <script>
/**
* wpautop per HTML5, elementi consentiti: 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"; // per facilitare le cose, aggiungi un padding alla fine
$pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
// Aggiungi spazio tra gli elementi
// *inserimento* di 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); // newline cross-platform
if ( strpos($pee, '<object') !== false ) {
$pee = preg_replace('|\s*<param([^>]*)>\s*|', "<param$1>", $pee); // nessun contenuto dentro object/embed
$pee = preg_replace('|\s*</embed>\s*|', '</embed>', $pee);
}
$pee = preg_replace("/\n\n+/", "\n\n", $pee); // gestisci i duplicati
// crea paragrafi, incluso uno alla fine
$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); // in certe condizioni strane potrebbe creare un P di solo spazi bianchi
// *inserimento* di 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); // non inserire P attorno ai tag
$pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problema con liste annidate
$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); // opzionalmente crea interruzioni di riga
$pee = str_replace('<WPPreserveNewline />', "\n", $pee);
}
$pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*<br />!', "$1", $pee);
// *inserimento* di 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;
}
// rimuovi la funzione wpautop originale
remove_filter('the_excerpt', 'wpautop');
remove_filter('the_content', 'wpautop');
// aggiungi la nostra nuova funzione html5autop
add_filter('the_excerpt', 'html5wpautop');
add_filter('the_content', 'html5wpautop');
Vedi di più sul SVN del tema starter HTML5, non un framework!

Disattivare il plugin WPtexturize ha funzionato per me: Disabilita WPtexturize
È abbastanza semplice comunque:
remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
