web-dev-qa-db-fra.com

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

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

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

EDIT: Je me soucie vraiment uniquement du problème de la balise <br>, les modifications typographiques apportées ne me dérangent pas.

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

17
artlung

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

Il vaut mieux réparer le <br /> que de 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 );
}

Editer après mise à jour OP:

Les fonctions WordPress sont conçues pour générer du XHTML. Pour vous débarrasser de ces dernières barres obliques au niveau 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 ne vous prendrait pas la tête, la barre latérale, etc.

C'est un peu moche et peut avoir un impact mineur sur les performances, mais c'est parti (déposez ceci dans un plugin ou dans le fichier functions.php 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 que vous ne faites pas de traitement de demande AJAX, commencez à mettre en tampon la sortie via un filtre, puis à l'aide du crochet d'arrêt WordPress, affichez ce tampon.

21
Viper007Bond

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.

8
John P Bloch

Je viens de le trouver; Les balises à fermeture automatique sur les éléments void sont des balises HTML valides.

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

7
Ryan Gibbons

Cela peut être désactivé, par exemple. le fichier function.php du fichier en tirant parti de la fonction remove_filter() (http://codex.wordpress.org/Function_Reference/remove_filter)

remove_filter("the_content", "wptexturize");
6
thomasjo

J'ai un thème de démarrage pour html5 et WordPress et une fonction non pas pour wptexturize, mais pour wpautop (). Incluez également d'autres éléments de HTML, tels que thead, tfoot, apart et utilisez 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 cadre!

5
bueltge

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

C'est assez droit cependant:

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