Comment désactiver les balises à fermeture automatique pour le balisage dans WordPress (pour HTML5 ou HTML4, par exemple)?

18

Je souhaite utiliser HTML5 dans mon thème WordPress, comment désactiver wptexturize?

Cela ne me dérange pas que WP ajoute des pauses, mais je veux qu'elles le soient <br>et non <br />. Comment puis-je contrôler la façon dont ces ruptures apparaissent dans mon code?

EDIT: Je ne me soucie vraiment que du <br>problème des balises, cela ne me dérange pas les changements typographiques qu'il apporte.

EDIT2: En fait, je suppose que les <img>balises comptent aussi. Toutes les balises autonomes à fermeture automatique importeront ici. Donc, cela <hr>pourrait aussi être un problème. Sans parler des wp_head()éléments tels que <link>et diverses <meta>balises.

artlung
la source
1
qu'est-ce qui ne va pas <br />?
Scott M.
2
C'est très bien, mais si je veux utiliser la version non XML de HTML5, je ne veux pas les terminaisons de style XML `/>`.
artlung
Je pensais que <br /> était valide en html et xhtml? Quand n'était-ce pas?
Ryan Gibbons
5
Je pense que cette question est extrêmement trompeuse. wptexturize n'empêche en aucun cas un site d'être conforme à HTML 5.
Ryan Gibbons
2
Quelqu'un peut-il s'il vous plaît renommer cela comme suit: "Comment supprimer les barres obliques de fin des éléments à fermeture automatique dans le balisage généré par wordpress"?
Bobby Jack

Réponses:

21

Les sauts de ligne sont ajoutés par wpautop(), non wptexturize(). wpautop()est également la fonction qui ajoute automatiquement des balises de paragraphe.

Il vaut mieux réparer le problème <br />que remplacer le filtre. Puisque wpautop()fonctionne à la priorité 10, vous pouvez simplement vous connecter après cela et le réparer.

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

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

Modifier après la mise à jour OP:

Les fonctions WordPress sont conçues pour produire du XHTML. Pour vous débarrasser de ces barres obliques à la fin du site, vous devrez utiliser un tampon de sortie. Vous pouvez utiliser un filtre similaire à celui ci-dessus pour remplacer les barres obliques dans le contenu du message, mais cela n'attraperait pas votre tête, votre barre latérale, etc.

C'est un peu moche et peut avoir un petit impact sur les performances, mais c'est parti (déposez-le dans un plugin ou le functions.phpfichier de votre thème ):

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

Ce code indique que si vous n'êtes pas dans la zone d'administration et ne faites pas de traitement de demande AJAX, commencez à mettre la sortie en mémoire tampon via un filtre, puis à l'aide du hook d'arrêt de WordPress, sortez cette mémoire tampon.

Viper007Bond
la source
Je n'ai pas encore eu le temps de casser les fonctions open.php, mais pourriez-vous expliquer où cela si le bloc va? Cela pourrait être évident une fois que j'aurai la chance d'ouvrir ce fichier, mais je pense que j'aurais la question à l'écart.
Thomas Owens
@Thomas: Le functions.phpfichier de votre thème est comme un fichier de plugin. Tout code qu'il contient sera automatiquement exécuté. Peu importe où il va tant qu'il est valide en PHP.
Viper007Bond
Ah. Intéressant. Je suis assez nouveau dans le développement de WordPress, donc j'apprends encore beaucoup. Merci d'avoir clarifié cela.
Thomas Owens
8

Voici:

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

Ce n'est pas la solution la plus élégante, mais cela se fait beaucoup plus rapidement que de réécrire wpautop et wptexturize.

John P Bloch
la source
1
+1 J'ai fait quelque chose de très similaire pour la conformité HTML 4.01 Strict.
Trevor Bramble
7

Je viens de le trouver; les balises à fermeture automatique sur les éléments void sont du html valide.

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

Plus d'informations:

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

Ryan Gibbons
la source
1
"Cependant, en raison des nombreuses tentatives d'utilisation de XHTML1, un nombre important de pages utilisent la barre oblique de fin. Pour cette raison, la syntaxe de la barre oblique de fin a été autorisée sur les éléments vides en HTML afin de faciliter la migration de XHTML1 vers HTML5. " Autorisé comme héritage. Je pense que la voie à suivre est d'abandonner le "/" supplémentaire, d'où ma question. Je pense que WordPress doit permettre l'option de créer du code en xhtml, ou html4.01 ou html5.
artlung
C'est le problème que vous lisez dans ce qui est dit. Les barres obliques de fin sont autorisées, ce qui signifie qu'il s'agit d'une syntaxe valide. Vous spéculez qu'il va être supprimé? Pourquoi deviner où vont les normes et créer du travail pour résoudre un problème qui n'existe pas?
Ryan Gibbons
Je ne spécule sur rien. Je ne devine rien. La marque / n'est pas requise par la spécification, et je veux avoir la possibilité de la supprimer dans WordPress.
artlung
J'aime XHTML, devons-nous revenir à l'aspect désordonné de l'ancien HTML.
Arlen Beiler
Arlen, j'aime html ordonné, j'aime xhtml. Je suis un grand fan de validateurs. J'ai écrit mon propre doctype pour faire la validation sur mon propre code. J'ai utilisé html 3.2, html 4, 4.01, même html 2.0! lab.artlung.com/html-2.0 - mais je voudrais l'option de supprimer les balises à fermeture automatique dans WordPress. Il ne semble pas que cela devrait être si important. J'ai l'impression que discuter avec la prémisse de ma question est très inutile.
artlung
6

Cela peut être désactivé par exemple dans le fichier function.php du thème en profitant de la remove_filter()fonction (http://codex.wordpress.org/Function_Reference/remove_filter)

remove_filter("the_content", "wptexturize");
thomasjo
la source
1
Puis-je obtenir un contrôle plus granulaire de cela? Ne perdrai-je pas les marques typographiques si je le fais de cette façon?
artlung
Je ne connais aucune approche simple du haut de ma tête, mais laissez-moi voir ce que je peux comprendre pour vous.
thomasjo
À moins de reproduire les fonctionnalités souhaitées wptexturize(), je n'ai pu trouver aucune autre solution viable.
thomasjo
Je me demande s'il y aurait un moyen de simplement inverser le <br />- remplacer ceux par <br>peut-être?
artlung
5

J'ai un thème de démarrage pour html5 et WordPress et également une fonction non pas pour wptexturize, mais pour wpautop (). Inclure également d'autres éléments de html, comme thead, tfoot, apart et utiliser la syntaxe de html5 comme
et

/**
 * 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 [email protected]
 */
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');

voir plus sur le svn du thème de démarrage html5, pas un framework!

bueltge
la source
3

Désactiver le plugin WPtexturize a fonctionné pour moi: Désactiver WPtexturize

C'est assez simple cependant:

remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
Bob Sherron
la source