Cómo desactivar las etiquetas de autocierre en WordPress (para HTML5 o HTML4, por ejemplo)

11 ago 2010, 19:32:47
Vistas: 9.46K
Votos: 19

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

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

EDIT: Solo me importa realmente el tema de la etiqueta <br>, no me molestan los cambios tipográficos que hace.

EDIT2: En realidad, supongo que las etiquetas <img> también importan. Cualquier etiqueta independiente de autocierre será relevante aquí. Así que <hr> podría ser un problema también. Sin mencionar elementos como wp_head() tales como <link> y varias etiquetas <meta>.

12
Comentarios

¿Qué tiene de malo <br />?

Scott M. Scott M.
11 ago 2010 23:36:50

Está bien, pero si quiero ajustarme a la versión no-XML de HTML5, no querré los cierres al estilo XML />.

artlung artlung
12 ago 2010 03:10:12

Pensé que <br /> era HTML y XHTML válido. ¿Cuándo dejó de serlo?

Ryan Gibbons Ryan Gibbons
13 ago 2010 20:14:07

<br/> está pensado para ser válido en xhtml. HTML5 es una nueva especificación (aunque /puede/ usarse en un estilo xml) que no presupone sintaxis xml.

artlung artlung
13 ago 2010 20:19:16

Creo que esta pregunta es extremadamente engañosa. wptexturize no impide, de ninguna manera, que un sitio sea compatible con HTML5.

Ryan Gibbons Ryan Gibbons
13 ago 2010 22:04:47

TODO LO QUE SABES SOBRE XHTML ESTÁ EQUIVOCADO http://diveintohtml5.org/past.html#xhtml

artlung artlung
14 ago 2010 15:01:00

¿Puedes por favor enlazar el validador que te gustaría usar para validar esto?

hakre hakre
17 ago 2010 14:22:47

Ehm, ¿XHTML5 es una opción?

hakre hakre
17 ago 2010 14:24:30

¿Alguien podría por favor cambiar el título a algo como "¿Cómo elimino las barras diagonales finales de elementos auto-cerrados en el marcado generado por WordPress?"?

Bobby Jack Bobby Jack
6 sept 2010 12:16:55

Buena idea Bobby Jack. Sí, parece que la gente no entiende las diferencias entre los diferentes tipos de doctype. He actualizado la pregunta.

artlung artlung
7 sept 2010 14:00:17

Hola artlung, ¿al final usaste alguna de estas sugerencias? Solo me pregunto cuál usaste y si afectó el rendimiento. Esto también me está molestando mucho ya que recién me acostumbré a no usar la barra diagonal final.

Ricky55 Ricky55
27 jul 2012 03:21:49

@Ricky55 Al final, las etiquetas de autocierre no terminaron siendo un problema para mí y opté por dejarlas como estaban.

artlung artlung
31 jul 2012 15:05:43
Mostrar los 7 comentarios restantes
Todas las respuestas a la pregunta 6
3
21

Los saltos de línea son agregados por wpautop(), no por wptexturize(). wpautop() también es la función que automáticamente añade etiquetas de párrafo.

Es mejor corregir los <br /> que reemplazar el filtro. Dado que wpautop() se ejecuta con prioridad 10, puedes simplemente engancharte después de eso y corregirlo.

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

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

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

Las funciones de WordPress están diseñadas para generar XHTML. Para eliminar esas barras diagonales finales en todo el sitio, tendrás que usar un búfer de salida. Podrías usar un filtro similar al anterior para reemplazar las barras en el contenido de las publicaciones, pero eso no capturaría tu encabezado, barra lateral, etc.

Es un poco feo y podría tener un pequeño impacto en el rendimiento, pero aquí lo tienes (coloca esto en un plugin 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();
}

Ese código dice que si no estás en el área de administración y no estás manejando una solicitud AJAX, entonces comienza a almacenar en búfer la salida a través de un filtro y luego, usando el gancho de apagado de WordPress, envía ese búfer.

11 ago 2010 21:46:50
Comentarios

Todavía no he tenido tiempo de abrir el archivo functions.php, pero ¿podrías explicar dónde va ese bloque if? Puede que sea evidente una vez que tenga la oportunidad de abrir ese archivo, pero pensé en hacer la pregunta para salir de la duda.

Thomas Owens Thomas Owens
20 ago 2010 00:31:50

@Thomas: El archivo functions.php de tu tema funciona igual que un archivo de plugin. Cualquier código ahí dentro se ejecutará automáticamente. No importa dónde lo coloques siempre y sea PHP válido.

Viper007Bond Viper007Bond
20 ago 2010 01:00:27

Ah, interesante. Soy bastante nuevo en el desarrollo de WordPress, así que todavía estoy aprendiendo mucho. Gracias por aclararlo.

Thomas Owens Thomas Owens
20 ago 2010 01:24:48
1

Aquí lo tienes:

// Función para corregir etiquetas HTML mal formadas
function my_awesome_tag_fixer( $input ){
  // Reemplaza patrones de etiquetas autocerradas incorrectas (<tag />) por su versión correcta (<tag>)
  return preg_replace( '/(<.+)\s\/>/', '$1>', $input );
}

// Aplicar el filtro a diferentes hooks de WordPress
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 funciona mucho más rápido que reescribir wpautop y wptexturize.

14 ago 2010 11:57:46
Comentarios

+1 Hice algo muy similar para cumplir con HTML 4.01 Estricto.

Trevor Bramble Trevor Bramble
14 ago 2010 21:18:50
7

Acabo de descubrirlo; las etiquetas autocerradas en elementos vacíos son HTML válido.

En HTML5 hemos permitido el / en elementos vacíos (como <meta>, <img>, <br>, <input>, etc), para facilitar la migración hacia y desde XML.

http://lists.whatwg.org/pipermail/help-whatwg.org/2008-August/000137.html

Más información:

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

13 ago 2010 20:18:47
Comentarios

"Sin embargo, debido a los intentos generalizados de usar XHTML1, hay un número significativo de páginas que utilizan la barra diagonal final. Por esta razón, la sintaxis de la barra diagonal final ha sido permitida en elementos vacíos en HTML para facilitar la migración de XHTML1 a HTML5."

Permitido como legado. Creo que el camino a seguir es deshacerse de la "/" adicional, de ahí mi pregunta. Pienso que WordPress debería permitir la opción de crear código para xhtml, o html4.01 o html5.

artlung artlung
13 ago 2010 20:29:40

Ese es el problema que estás leyendo en lo que se está diciendo. Las barras diagonales finales están permitidas, lo que significa que es una sintaxis válida. ¿Estás especulando que será eliminada? ¿Por qué adivinar hacia dónde van los estándares y crear trabajo para resolver un problema que no existe?

Ryan Gibbons Ryan Gibbons
13 ago 2010 21:02:12

No estoy especulando sobre nada. No estoy adivinando nada. La marca / no es requerida por la especificación, y quiero tener la opción de eliminarla en WordPress.

artlung artlung
13 ago 2010 21:09:36

Me gusta XHTML, ¿tenemos que volver al aspecto desordenado del HTML antiguo?

Arlen Beiler Arlen Beiler
14 ago 2010 14:12:38

Arlen, me gusta el HTML ordenado, me gusta XHTML. Soy un gran fan de los validadores. He escrito mi propio doctype para validar mi propio código. He usado HTML 3.2, HTML 4, 4.01, ¡incluso HTML 2.0! http://lab.artlung.com/html-2.0/ -- pero me gustaría tener la opción de eliminar las etiquetas de auto-cierre en WordPress. No parece que deba ser un problema tan grande. Siento que discutir la premisa de mi pregunta no es de mucha ayuda.

artlung artlung
14 ago 2010 14:47:30

@artlung: Creo que el problema es que algunas personas asumen que no estás al tanto de que "<br />", "<br>" e incluso "<br><br />" son todos perfectamente válidos en HTML5. Sin embargo, creo que tu pregunta es totalmente válida, independientemente de hacia dónde vaya HTML5 en el futuro, si se reformula; WordPress debería poder producir HTML4 válido, después de todo.

Bobby Jack Bobby Jack
6 sept 2010 12:20:06

No importa si está permitido o no. Las especificaciones de HTML5 no lo requieren, así que es código heredado inútil que prefiero no tener en mi marcado.

Gavin Gavin
2 sept 2018 10:48:35
Mostrar los 2 comentarios restantes
4

Esto se puede desactivar, por ejemplo, en 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");
11 ago 2010 19:40:08
Comentarios

¿Puedo tener un control más detallado sobre esto? ¿No perderé las marcas tipográficas si lo hago de esta manera?

artlung artlung
11 ago 2010 19:44:29

No conozco ningún enfoque simple que se me ocurra en este momento, pero déjame ver qué puedo encontrar para ti.

thomasjo thomasjo
11 ago 2010 19:46:25

Aparte de reproducir la funcionalidad deseada que se encuentra en wptexturize(), no pude encontrar ninguna otra solución viable.

thomasjo thomasjo
11 ago 2010 20:13:08

Me pregunto si habría alguna manera de simplemente revertir el <br /> - ¿reemplazarlos con <br> tal vez?

artlung artlung
11 ago 2010 20:30:29
0

Tengo un tema inicial para HTML5 y WordPress y también una función no para wptexturize, sino para wpautop(). Incluye también otros elementos de HTML como thead, tfoot, aside y usa la sintaxis de HTML5 como <br> y <script>

/**
 * wpautop para HTML5, permitidos: 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"; // solo para hacer las cosas un poco más fáciles, rellena el final
    $pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
    // Espacia las cosas un poco
    // *inserción* de 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); // saltos de línea multiplataforma
    if ( strpos($pee, '<object') !== false ) {
            $pee = preg_replace('|\s*<param([^>]*)>\s*|', "<param$1>", $pee); // no pee dentro de object/embed
            $pee = preg_replace('|\s*</embed>\s*|', '</embed>', $pee);
    }
    $pee = preg_replace("/\n\n+/", "\n\n", $pee); // encargarse de los duplicados
    // hacer párrafos, incluyendo uno al final
    $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); // bajo ciertas condiciones extrañas podría crear un P de puro espacio en blanco
    // *inserción* de 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); // no pee sobre una etiqueta
    $pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problema con listas anidadas
    $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); // opcionalmente hacer saltos de línea
            $pee = str_replace('<WPPreserveNewline />', "\n", $pee);
    }
    $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*<br />!', "$1", $pee);
    // *inserción* de 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;
}

// eliminar la función wpautop original
remove_filter('the_excerpt', 'wpautop');
remove_filter('the_content', 'wpautop');

// añadir nuestra nueva función html5autop
add_filter('the_excerpt', 'html5wpautop');
add_filter('the_content', 'html5wpautop');

Ver más en el SVN del tema inicial HTML5, ¡no es un framework!

13 ago 2010 18:21:48
0

El complemento Disable WPtexturize funcionó para mí: Deshabilitar WPtexturize

Es bastante sencillo:

remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
11 ago 2010 19:41:47