Come disattivare i tag auto-chiudenti per il markup in WordPress (per HTML5 o HTML4, ad esempio)?

11 ago 2010, 19:32:47
Visualizzazioni: 9.46K
Voti: 19

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>.

12
Commenti

cosa c'è di sbagliato in <br />?

Scott M. Scott M.
11 ago 2010 23:36:50

Va bene, ma se voglio attenermi alla versione non-XML di HTML5, non vorrò le terminazioni in stile XML />.

artlung artlung
12 ago 2010 03:10:12

Pensavo che <br /> fosse HTML e XHTML valido? Quando non lo è stato?

Ryan Gibbons Ryan Gibbons
13 ago 2010 20:14:07

<br/> è pensato per essere valido per xhtml. HTML5 è una nuova specifica (sebbene /possa/ essere usata in uno stile xml) che non presuppone la sintassi xml.

artlung artlung
13 ago 2010 20:19:16

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

Ryan Gibbons Ryan Gibbons
13 ago 2010 22:04:47

TUTTO CIÒ CHE SAI SU XHTML È SBAGLIATO http://diveintohtml5.org/past.html#xhtml

artlung artlung
14 ago 2010 15:01:00

Potresti per favore linkare il validatore che vorresti usare per questa validazione?

hakre hakre
17 ago 2010 14:22:47

Ehhm, XHTML5 è un'opzione?

hakre hakre
17 ago 2010 14:24:30

Qualcuno potrebbe per favore rinominare questo post qualcosa come "Come rimuovo gli slash finali dagli elementi auto-chiudenti nel markup generato da WordPress"?

Bobby Jack Bobby Jack
6 set 2010 12:16:55

Ottima idea Bobby Jack. Sì, le persone sembrano non capire le differenze tra i vari doctype. Ho aggiornato la domanda.

artlung artlung
7 set 2010 14:00:17

Ciao artlung alla fine hai usato qualcuno di questi suggerimenti? Mi chiedevo quale hai usato e se ha avuto un impatto sulle prestazioni. Anche a me dà davvero fastidio visto che mi ero appena abituato a non usare la barra finale.

Ricky55 Ricky55
27 lug 2012 03:21:49

@Ricky55 Alla fine i tag self-closing non sono stati un problema per me e ho optato per lasciarli così come sono.

artlung artlung
31 lug 2012 15:05:43
Mostra i restanti 7 commenti
Tutte le risposte alla domanda 6
3
21

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.

11 ago 2010 21:46:50
Commenti

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 Owens Thomas Owens
20 ago 2010 00:31:50

@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.

Viper007Bond Viper007Bond
20 ago 2010 01:00:27

Ah. Interessante. Sono abbastanza nuovo nello sviluppo WordPress, quindi sto ancora imparando molto. Grazie per la spiegazione.

Thomas Owens Thomas Owens
20 ago 2010 01:24:48
1

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.

14 ago 2010 11:57:46
Commenti

+1 Ho fatto qualcosa di molto simile per la conformità a HTML 4.01 Strict.

Trevor Bramble Trevor Bramble
14 ago 2010 21:18:50
7

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

13 ago 2010 20:18:47
Commenti

"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.

artlung artlung
13 ago 2010 20:29:40

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?

Ryan Gibbons Ryan Gibbons
13 ago 2010 21:02:12

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

artlung artlung
13 ago 2010 21:09:36

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

Arlen Beiler Arlen Beiler
14 ago 2010 14:12:38

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 artlung
14 ago 2010 14:47:30

@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.

Bobby Jack Bobby Jack
6 set 2010 12:20:06

Non importa se è permesso o meno. Le specifiche HTML5 non lo richiedono, quindi è un codice legacy inutile che preferirei non avere nel mio markup.

Gavin Gavin
2 set 2018 10:48:35
Mostra i restanti 2 commenti
4

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

remove_filter("the_content", "wptexturize");
11 ago 2010 19:40:08
Commenti

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

artlung artlung
11 ago 2010 19:44:29

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

thomasjo thomasjo
11 ago 2010 19:46:25

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

thomasjo thomasjo
11 ago 2010 20:13:08

Mi chiedo se ci sarebbe un modo per semplicemente invertire il <br /> - sostituirli con <br> magari?

artlung artlung
11 ago 2010 20:30:29
0

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!

13 ago 2010 18:21:48
0

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');
11 ago 2010 19:41:47