Cómo desactivar las etiquetas de autocierre en WordPress (para HTML5 o HTML4, por ejemplo)
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>
.
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.

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: 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.

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.

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

"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.

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?

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.

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

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: 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.

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

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

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

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!

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