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


18

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

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

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

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


1
lo que está mal con el <br />?
Scott M.

2
Está bien, pero si quiero conocer la versión no XML de HTML5, no querré las terminaciones `/>` de estilo XML.
artlung

Pensé que <br /> era válido html y xhtml? ¿Cuándo no fue?
Ryan Gibbons

55
Creo que esta pregunta es extremadamente engañosa. wptexturize no impide de ninguna manera que un sitio sea compatible con HTML 5.
Ryan Gibbons

2
¿Alguien puede volver a titular esto siguiendo las líneas de "¿Cómo elimino las barras diagonales finales de los elementos de cierre automático en el marcado generado por WordPress"?
Bobby Jack

Respuestas:


21

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

Es mejor arreglar los <br />'s que reemplazar el filtro. Dado que se wpautop()ejecuta en la prioridad 10, puede conectarse después de eso y solucionarlo.

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 de 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. Podrías usar un filtro similar al anterior para reemplazar las barras en el contenido de la publicación, pero eso no atraparía tu cabeza, barra lateral, etc.

Es un poco feo y puede tener un pequeño impacto en el rendimiento, pero aquí lo tiene (colóquelo en un complemento o en el functions.phparchivo de su 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á en el área de administración y no está haciendo un manejo de solicitud AJAX, luego comience a almacenar en búfer la salida a través de un filtro y luego use el gancho de cierre de WordPress, envíe ese búfer.


Todavía no he tenido tiempo de descifrar funciones.php abiertas, pero ¿podrías explicar dónde queda ese bloqueo? Puede ser evidente una vez que tenga la oportunidad de abrir ese archivo, pero me imagino que sacaré la pregunta del camino.
Thomas Owens

@Thomas: el functions.phparchivo de su tema es como un archivo de complemento. Cualquier código allí se ejecutará automáticamente. No importa a dónde vaya siempre que sea PHP válido.
Viper007Bond

Ah Interesante. Soy bastante nuevo en el desarrollo de WordPress, así que todavía estoy aprendiendo mucho. Gracias por aclarar eso.
Thomas Owens

8

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


1
+1 Hice algo muy similar para el cumplimiento estricto de HTML 4.01.
Trevor Bramble

7

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

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

Más información:

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


1
"Sin embargo, debido a los intentos generalizados de usar XHTML1, hay un número significativo de páginas que utilizan la barra diagonal final. Debido a esto, la sintaxis de la barra diagonal final se ha permitido en elementos vacíos en HTML para facilitar la migración de XHTML1 a HTML5. " Permitido como un legado. Creo que el camino a seguir es deshacerse del "/" extra, de ahí mi pregunta. Creo que WordPress necesita permitir la opción de crear código para xhtml, o html4.01 o html5.
artlung

Ese es el problema que estás leyendo en lo que se dice. Se permiten barras diagonales finales, lo que significa que es una sintaxis válida. ¿Estás especulando que va a ser eliminado? ¿Por qué adivinar hacia dónde van los estándares y crear trabajo para resolver un problema que no existe?
Ryan Gibbons

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

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

Arlen, me gusta html ordenado, me gusta xhtml. Soy un gran fanático 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! lab.artlung.com/html-2.0 , pero me gustaría la opción de eliminar las etiquetas de cierre automático en WordPress. No parece que deba ser tan importante. Siento que discutir con la premisa de mi pregunta es muy inútil.
artlung

6

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

remove_filter("the_content", "wptexturize");

1
¿Puedo obtener un control más granular sobre esto? ¿No perderé las marcas tipográficas si lo hago de esta manera?
artlung

No estoy al tanto de ningún enfoque simple en la parte superior de mi cabeza, pero déjame ver qué puedo averiguar por ti.
thomasjo

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

Me pregunto si habría una manera de simplemente revertir el <br />- ¿reemplazar esos con <br>tal vez?
artlung

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 like
and

/**
 * 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 el svn del tema de inicio html5, no un marco!


3

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

Sin embargo, es bastante sencillo:

remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.