Cum dezactivez tagurile auto-închise pentru markup în WordPress (pentru HTML5 sau HTML4, de exemplu)?

11 aug. 2010, 19:32:47
Vizualizări: 9.46K
Voturi: 19

Vreau să folosesc HTML5 în tema mea WordPress, cum pot dezactiva wptexturize?

Nu mă deranjează că WP adaugă linii noi, dar vreau să fie <br> și nu <br />. Cum pot avea control asupra modului în care aceste linii noi apar în codul meu?

EDIT: Îmi pasă doar de problema cu tagul <br>, schimbările tipografice nu mă deranjează.

EDIT2: De fapt, cred că și tagurile <img> contează. Orice taguri standalone auto-închise vor fi relevante aici. Deci, <hr> ar putea fi și el o problemă. Fără să mai vorbim de elementele wp_head() precum <link> și diverse taguri <meta>.

12
Comentarii

ce e în neregulă cu <br />?

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

E în regulă, dar dacă vreau să mă țin de versiunea non-XML a HTML5, nu voi dori terminațiile de tip XML />.

artlung artlung
12 aug. 2010 03:10:12

Am crezut că <br /> este HTML și XHTML valid? Când nu a fost?

Ryan Gibbons Ryan Gibbons
13 aug. 2010 20:14:07

<br/> este destinat să fie valid pentru xhtml. HTML5 este o specificație nouă (deși poate fi folosit într-un stil xml) care nu presupune sintaxa xml.

artlung artlung
13 aug. 2010 20:19:16

Cred că această întrebare este extrem de înșelătoare. wptexturize nu împiedică în niciun fel un site să fie conform cu HTML 5.

Ryan Gibbons Ryan Gibbons
13 aug. 2010 22:04:47

TOT CE ȘTII DESPRE XHTML ESTE GREȘIT http://diveintohtml5.org/past.html#xhtml

artlung artlung
14 aug. 2010 15:01:00

Poți să ne arăta validatorul pe care ai vrea să-l folosim pentru verificare?

hakre hakre
17 aug. 2010 14:22:47

Hmm, este XHTML5 o opțiune?

hakre hakre
17 aug. 2010 14:24:30

Poate cineva să redenumească această întrebare în sensul "Cum pot elimina slash-urile de la sfârșitul elementelor auto-închise în markup-ul generat de WordPress"?

Bobby Jack Bobby Jack
6 sept. 2010 12:16:55

Bună idee Bobby Jack. Da, se pare că oamenii nu înțeleg diferențele dintre diferitele tipuri de doctype. Am actualizat întrebarea.

artlung artlung
7 sept. 2010 14:00:17

Salut artlung, ai folosit vreuna dintre aceste sugestii până la urmă? Mă întrebam pe care ai ales-o și dacă a afectat performanța. Și pe mine mă enervează asta, tocmai m-am obișnuit să nu folosesc slash-ul la final.

Ricky55 Ricky55
27 iul. 2012 03:21:49

@Ricky55 Până la urmă, tag-urile self-closing nu au fost o problemă pentru mine și am ales să le las așa.

artlung artlung
31 iul. 2012 15:05:43
Arată celelalte 7 comentarii
Toate răspunsurile la întrebare 6
3
21

Liniile noi sunt adăugate de wpautop(), nu de wptexturize(). wpautop() este de asemenea funcția care adaugă automat tag-uri de paragraf.

Este mai bine să corectați <br />-urile decât să înlocuiți filtrul. Deoarece wpautop() rulează la prioritatea 10, puteți pur și simplu să vă conectați după aceea și să le reparați.

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

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

Editare după actualizarea OP:

Funcțiile WordPress sunt concepute pentru a afișa XHTML. Pentru a scăpa de acele slash-uri finale pe întreg site-ul, va trebui să utilizați un buffer de ieșire. Ați putea utiliza un filtru similar cu cel de mai sus pentru a înlocui slash-urile din conținutul postărilor, dar acesta nu ar prinde head-ul, bara laterală etc.

Este un pic urât și ar putea avea un mic impact asupra performanței, dar iată soluția (introduceți acest cod într-un plugin sau în fișierul functions.php al temei):

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

Acel cod spune că dacă nu vă aflați în zona de administrare și nu efectuați o cerere AJAX, atunci începeți să bufferizați ieșirea printr-un filtru și apoi, folosind hook-ul WordPress shutdown, să afișați acel buffer.

11 aug. 2010 21:46:50
Comentarii

Nu am avut încă timp să deschid fișierul functions.php, dar poți să-mi explici unde trebuie pus acel bloc if? Probabil va fi evident odată ce voi deschide fișierul, dar am vrut să pun întrebarea acum.

Thomas Owens Thomas Owens
20 aug. 2010 00:31:50

@Thomas: Fișierul functions.php al temei tale funcționează exact ca un fișier de plugin. Orice cod din el va fi executat automat. Nu contează unde îl plasezi, atâta timp cât este PHP valid.

Viper007Bond Viper007Bond
20 aug. 2010 01:00:27

Ah. Interesant. Sunt relativ nou în dezvoltarea pentru WordPress, așa că încă învăț multe. Mulțumesc pentru clarificare.

Thomas Owens Thomas Owens
20 aug. 2010 01:24:48
1

Aici este:

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

Nu este cea mai elegantă soluție, dar își face treaba mult mai repede decât rescrierea funcțiilor wpautop și wptexturize.

14 aug. 2010 11:57:46
Comentarii

+1 Am făcut ceva foarte similar pentru conformitate cu HTML 4.01 Strict.

Trevor Bramble Trevor Bramble
14 aug. 2010 21:18:50
7

Tocmai am aflat; tagurile auto-închizătoare pe elementele void sunt valide în HTML.

În HTML5 am permis folosirea / pe elementele void (cum ar fi <meta>, <img>, <br>, <input>, etc), pentru a ușura migrarea către și din XML.

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

Mai multe informații:

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

13 aug. 2010 20:18:47
Comentarii

"Cu toate acestea, din cauza încercărilor larg răspândite de a folosi XHTML1, există un număr semnificativ de pagini care folosesc slash-ul final. Din această cauză, sintaxa cu slash final a fost permisă pe elementele void în HTML pentru a ușura migrarea de la XHTML1 la HTML5."

Permisă ca moștenire. Cred că direcția corectă este eliminarea "/" suplimentar, de unde și întrebarea mea. Cred că WordPress ar trebui să permită opțiunea de a crea cod în xhtml, html4.01 sau html5.

artlung artlung
13 aug. 2010 20:29:40

Aceasta este problema pe care o citești în ceea ce se spune. Slash-urile finale sunt permise, ceea ce înseamnă că este o sintaxă validă. Speculezi că va fi eliminat? De ce să ghicești încotro se îndreaptă standardele și să creezi muncă pentru a rezolva o problemă care nu există?

Ryan Gibbons Ryan Gibbons
13 aug. 2010 21:02:12

Nu speculez nimic. Nu ghicesc nimic. Semnul "/" nu este cerut de specificație și vreau să am opțiunea de a-l elimina în WordPress.

artlung artlung
13 aug. 2010 21:09:36

Îmi place XHTML, trebuie să ne întoarcem la aspectul dezordonat al vechiului HTML.

Arlen Beiler Arlen Beiler
14 aug. 2010 14:12:38

Arlen, îmi place HTML-ul ordonat, îmi place XHTML. Sunt un mare fan al validatorilor. Am scris propriul meu doctype pentru a valida propriul cod. Am folosit HTML 3.2, HTML 4, 4.01, chiar și HTML 2.0! http://lab.artlung.com/html-2.0/ -- dar aș dori opțiunea de a elimina tagurile auto-închise în WordPress. Nu pare să fie o mare problemă. Simt că a argumenta premisa întrebării mele este foarte neajutorător.

artlung artlung
14 aug. 2010 14:47:30

@artlung: Cred că problema este că unii oameni au presupus că nu ești conștient că "<br />", "<br>" și chiar "<br><br />" sunt toate perfect valide în HTML5. Totuși, cred că întrebarea ta este perfect validă, indiferent de direcția pe care o va lua HTML5 în viitor, dacă ar fi reformulată; WordPress ar trebui să fie capabil să producă HTML4 valid, până la urmă.

Bobby Jack Bobby Jack
6 sept. 2010 12:20:06

Nu contează dacă este permis sau nu. Specificațiile HTML5 nu o cer, așa că este un cod moștenit inutil pe care aș prefera să nu-l am în markup-ul meu.

Gavin Gavin
2 sept. 2018 10:48:35
Arată celelalte 2 comentarii
4

Aceasta poate fi dezactivată, de exemplu, în fișierul function.php al temei, folosind funcția remove_filter() (http://codex.wordpress.org/Function_Reference/remove_filter)

remove_filter("the_content", "wptexturize");
11 aug. 2010 19:40:08
Comentarii

Pot obține un control mai granular asupra acestui lucru? Nu voi pierde semnele tipografice dacă fac asta în acest fel?

artlung artlung
11 aug. 2010 19:44:29

Nu sunt conștient de nicio abordare simplă pe moment, dar lasă-mă să văd ce pot găsi pentru tine.

thomasjo thomasjo
11 aug. 2010 19:46:25

În afară de reproducerea funcționalității dorite găsite în wptexturize(), nu am reușit să găsesc alte soluții viabile.

thomasjo thomasjo
11 aug. 2010 20:13:08

Mă întreb dacă ar exista o modalitate de a inversa pur și simplu <br /> - să le înlocuim cu <br> poate?

artlung artlung
11 aug. 2010 20:30:29
0

Am un temă de pornire pentru HTML5 și WordPress și, de asemenea, o funcție nu pentru wptexturize, ci pentru wpautop(). Include și alte elemente HTML, cum ar fi thead, tfoot, aside și folosește sintaxa HTML5 cum ar fi <br> și <script>

/**
 * wpautop pentru HTML5, permise: 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"; // pentru a face lucrurile mai ușoare, adaugă un newline la sfârșit
    $pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
    // Spațiază elementele
    // *adaugare* 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); // newlines cross-platform
    if ( strpos($pee, '<object') !== false ) {
            $pee = preg_replace('|\s*<param([^>]*)>\s*|', "<param$1>", $pee); // fără conținut în interiorul object/embed
            $pee = preg_replace('|\s*</embed>\s*|', '</embed>', $pee);
    }
    $pee = preg_replace("/\n\n+/", "\n\n", $pee); // rezolvă duplicatele
    // creează paragrafe, inclusiv unul la sfârșit
    $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); // în anumite condiții ciudate poate crea un P doar cu spații
    // *adaugare* 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); // nu adăuga paragrafe în jurul unui tag
    $pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problemă cu liste imbricate
    $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); // opțional, creează linii noi
            $pee = str_replace('<WPPreserveNewline />', "\n", $pee);
    }
    $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*<br />!', "$1", $pee);
    // *adaugare* 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;
}

// elimină funcția originală wpautop
remove_filter('the_excerpt', 'wpautop');
remove_filter('the_content', 'wpautop');

// adaugă noua noastră funcție html5autop
add_filter('the_excerpt', 'html5wpautop');
add_filter('the_content', 'html5wpautop');

Vezi mai multe pe SVN al temei de pornire HTML5, nu un framework!

13 aug. 2010 18:21:48
0

Plugin-ul Disable WPtexturize a funcționat pentru mine: Dezactivează WPtexturize

Este destul de simplu totuși:

remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
11 aug. 2010 19:41:47