Cum dezactivez tagurile auto-închise pentru markup în WordPress (pentru HTML5 sau HTML4, de exemplu)?
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>
.
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.

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

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.

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

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

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ă?

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.

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

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

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

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

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

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!

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