Wie deaktiviere ich selbstschließende Tags für Markups in WordPress (z. B. für HTML5 oder HTML4)?


18

Ich möchte HTML5 in meinem WordPress-Theme verwenden. Wie deaktiviere ich wptexturize?

Mir macht es nichts aus, wenn WP Pausen hinzufügt, aber ich möchte, dass sie es sind <br>und nicht <br />. Wie kann ich steuern, wie diese Unterbrechungen in meinem Code angezeigt werden?

EDIT: Ich kümmere mich nur wirklich um das <br>Tag-Problem, die typografischen Änderungen sind mir egal .

EDIT2: Eigentlich denke ich, <img>Tags sind auch wichtig. Alle selbstschließenden eigenständigen Tags sind hier von Bedeutung. So <hr>könnte ein Problem als gut. Ganz zu schweigen von wp_head()Artikeln wie <link>und verschiedenen <meta>Tags.


1
was ist los mit <br />?
Scott M.

2
Es ist in Ordnung, aber wenn ich auf die Nicht-XML-Version von HTML5 zurückgreifen möchte, möchte ich nicht die XML-Endungen `/>`.
artlung

Ich dachte, <br /> war gültig HTML und XHTML? Wann war es nicht?
Ryan Gibbons

5
Ich halte diese Frage für äußerst irreführend. wptexturize verhindert in keiner Weise, dass eine Site HTML 5-kompatibel ist.
Ryan Gibbons

2
Kann jemand dies bitte in Anlehnung an "Wie entferne ich abschließende Schrägstriche von selbstschließenden Elementen in WordPress-generierten Markups" umbenennen?
Bobby Jack

Antworten:


21

Zeilenumbrüche werden von wpautop(), nicht hinzugefügt wptexturize(). wpautop()ist auch die Funktion, die automatisch Absatz-Tags hinzufügt.

Sie sind besser dran <br />, als den Filter auszutauschen. Da wpautop()mit Priorität 10 ausgeführt wird, können Sie sich danach einfach einhängen und das Problem beheben.

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

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

Nach OP-Update bearbeiten:

WordPress-Funktionen dienen zur Ausgabe von XHTML. Um diese abschließenden Schrägstriche auf der gesamten Site zu beseitigen, müssen Sie einen Ausgabepuffer verwenden. Sie könnten einen Filter ähnlich dem oben genannten verwenden, um Schrägstriche im Inhalt des Posts zu ersetzen, aber das würde Ihren Kopf, Ihre Seitenleiste usw. nicht einklemmen.

Es ist ein bisschen hässlich und hat möglicherweise einen kleinen Einfluss auf die Leistung, aber hier ist es (ziehen Sie dies in ein Plugin oder in die functions.phpDatei Ihres Themas ):

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

Dieser Code besagt, dass Sie, wenn Sie nicht im Administrationsbereich sind und keine AJAX-Anforderungsbearbeitung durchführen, die Ausgabe durch einen Filter puffern und dann mit dem WordPress-Shutdown-Hook diesen Puffer ausgeben.


Ich hatte noch keine Zeit, die Datei functions.php zu öffnen, aber können Sie herausfinden, wo das liegt, wenn der Block geht? Es mag offensichtlich sein, wenn ich die Gelegenheit habe, diese Datei zu öffnen, aber ich schätze, ich würde die Frage aus dem Weg räumen.
Thomas Owens

@Thomas: Die functions.phpDatei Ihres Themas ist wie eine Plugin-Datei. Jeder darin enthaltene Code wird automatisch ausgeführt. Es ist egal, wohin es geht, solange es gültiges PHP ist.
Viper007Bond

Ah. Interessant. Ich bin ziemlich neu in der WordPress-Entwicklung und lerne immer noch viel. Danke, dass Sie das geklärt haben.
Thomas Owens

8

Bitte schön:

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

Es ist nicht die eleganteste Lösung, aber es geht viel schneller, als wpautop und wptexturize neu zu schreiben.


1
+1 Ich habe etwas sehr Ähnliches für HTML 4.01 Strikte Konformität gemacht.
Trevor Bramble

7

Habe es gerade gefunden; Selbstschließende Tags für leere Elemente sind gültiges HTML.

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

Mehr Informationen:

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


1
"Aufgrund der weit verbreiteten Versuche, XHTML1 zu verwenden, gibt es jedoch eine erhebliche Anzahl von Seiten, die den abschließenden Schrägstrich verwenden. Aus diesem Grund wurde die Syntax des abschließenden Schrägstrichs für leere Elemente in HTML zugelassen, um die Migration von XHTML1 nach HTML5 zu vereinfachen. " Erlaubt als Vermächtnis. Ich denke, der Weg nach vorne führt über das zusätzliche "/" hinaus, daher meine Frage. Ich denke, WordPress muss die Option zum Erstellen von Code für xhtml, html4.01 oder html5 zulassen.
Artlung

Das ist das Problem, in das Sie lesen, was gesagt wird. Nachgestellte Schrägstriche sind zulässig, was bedeutet, dass es sich um eine gültige Syntax handelt. Sie spekulieren, dass es entfernt wird? Warum raten Sie, wohin die Standards führen, und schaffen Sie Arbeit, um ein nicht vorhandenes Problem zu lösen?
Ryan Gibbons

Ich spekuliere über nichts. Ich vermute nichts. Das / -Zeichen wird von der Spezifikation nicht benötigt, und ich möchte die Option haben, es in WordPress zu entfernen.
Artlung

Ich mag XHTML, müssen wir zum ungeordneten Aussehen von altem HTML zurückkehren?
Arlen Beiler

Arlen, ich mag ordentliches html, ich mag xhtml. Ich bin ein großer Fan von Validatoren. Ich habe meinen eigenen Doctype geschrieben, um die Validierung meines eigenen Codes durchzuführen. Ich habe HTML 3.2, HTML 4, 4.01, sogar HTML 2.0 verwendet! lab.artlung.com/html-2.0 - aber ich möchte die Option, selbstschließende Tags in WordPress zu entfernen. Es scheint nicht so, als ob es eine große Sache sein sollte. Ich habe das Gefühl, mit der Prämisse meiner Frage zu streiten, ist sehr wenig hilfreich.
Artlung

6

Dies kann zB in der function.php- Datei des Themas deaktiviert werden, indem die remove_filter()Funktion genutzt wird (http://codex.wordpress.org/Function_Reference/remove_filter).

remove_filter("the_content", "wptexturize");

1
Kann ich eine genauere Kontrolle darüber bekommen? Verliere ich nicht die typografischen Zeichen, wenn ich das so mache?
artlung

Ich bin mir keiner einfachen Herangehensweise bewusst, aber lassen Sie mich sehen, was ich für Sie herausfinden kann.
Thomasjo

wptexturize()Ich habe die gewünschte Funktionalität von nicht reproduziert und konnte keine andere praktikable Lösung finden.
Thomasjo

Ich frage mich, ob es eine Möglichkeit geben würde, das einfach umzukehren <br />- diese durch <br>vielleicht zu ersetzen .
artlung

5

Ich habe ein Starter-Theme für HTML5 und WordPress und auch eine Funktion nicht für wptexturize, sondern für wpautop (). Schließen Sie auch andere Elemente von HTML, wie Thead, TFoot, beiseite und verwenden Sie die Syntax von HTML5 wie
und

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

sehen Sie mehr auf dem SVN des HTML5-Starter-Themas, kein Framework!


3

WPtexturize-Plugin deaktivieren hat bei mir funktioniert: WPtexturize deaktivieren

Es ist jedoch ziemlich einfach:

remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.