¿Cómo desactivo las etiquetas de cierre automático para el marcado en WordPress (para HTML5 o HTML4, por ejemplo)?

16

Quiero usar HTML5 en mi tema de WordPress, ¿cómo desactivo wptexturize?

No me importa que WP agregue saltos, pero quiero que sean <br> y no <br /> . ¿Cómo puedo controlar cómo aparecen esos saltos en mi código?

EDITAR: solo me importa el problema de la etiqueta <br> , no me importan los cambios tipográficos que realiza.

EDIT2: En realidad, creo que las etiquetas <img> también importan. Cualquier etiqueta independiente de cierre automático será importante aquí. Entonces, <hr> podría ser un problema también. Sin mencionar los elementos wp_head() como <link> y varias etiquetas <meta> .

    
pregunta artlung 11.08.2010 - 21:32

6 respuestas

21

Los saltos de línea se agregan por wpautop() , no por wptexturize() . wpautop() es también la función que agrega automáticamente etiquetas de párrafo.

Es mejor corregir los <br /> 's que reemplazando el filtro. Dado que wpautop() se ejecuta con la prioridad 10, puedes conectarlo después y arreglarlo.

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

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

Editar después de la actualización del OP:

Las funciones de WordPress están diseñadas para generar XHTML. Para deshacerse de esas barras diagonales en todo el sitio, tendrá que usar un búfer de salida. Puede usar un filtro similar al de arriba para reemplazar las barras diagonales en el contenido de la publicación, pero eso no afectará su cabeza, barra lateral, etc.

Es un poco feo y puede tener un pequeño impacto en el rendimiento, pero aquí tienes (coloca esto en un complemento o en el archivo functions.php de tu tema):

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

El código dice que si no estás en el área de administración y no estás haciendo un manejo de solicitudes AJAX, luego comienza a almacenar en búfer la salida a través de un filtro y luego usa el gancho de cierre de WordPress, genera ese búfer.

    
respondido por el Viper007Bond 11.08.2010 - 23:46
8

Aquí tienes:

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

No es la solución más elegante, pero se hace mucho más rápido que reescribir wpautop y wptexturize.

    
respondido por el John P Bloch 14.08.2010 - 13:57
7

Lo acabo de encontrar; Las etiquetas de cierre automático en elementos vacíos son html válidos.

  

In HTML5 we've allowed the / on void elements (like <meta>, <img>, <br>, <input>, etc), to ease migration to and from XML.

enlace

Más información:

enlace

    
respondido por el Ryan Gibbons 13.08.2010 - 22:18
6

Esto se puede desactivar en, por ejemplo, El archivo function.php del tema aprovechando la función remove_filter() (http://codex.wordpress.org/Function_Reference/remove_filter)

remove_filter("the_content", "wptexturize");
    
respondido por el thomasjo 11.08.2010 - 21:40
5

Tengo un tema de inicio para html5 y WordPress y también una función no para wptexturize, sino para wpautop (). Incluya también otros elementos de html, como thead, tfoot, aparte y use la sintaxis de html5 como
y

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

vea más en svn del html5 tema de inicio, no un marco!

    
respondido por el bueltge 13.08.2010 - 20:21
3

Deshabilitar el complemento WPtexturize funcionó para mí: Deshabilitar WPtexturize

Aunque es bastante sencillo:

remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
    
respondido por el Bob Sherron 11.08.2010 - 21:41

Lea otras preguntas en las etiquetas