Bagaimana cara mematikan tag penutup diri untuk markup di WordPress (untuk HTML5, atau HTML4, misalnya)?

18

Saya ingin menggunakan HTML5 di tema WordPress saya, bagaimana cara mematikan wptexturize?

Saya tidak keberatan menambahkan WP istirahat, tapi saya ingin mereka menjadi <br>dan tidak <br />. Bagaimana saya mendapatkan kontrol atas bagaimana jeda itu muncul dalam kode saya?

EDIT: Saya hanya benar-benar peduli tentang <br>masalah tag, saya tidak keberatan dengan perubahan tipografi yang dibuatnya.

EDIT2: Sebenarnya, saya kira <img>tag juga penting. Tag mandiri yang menutup sendiri akan penting di sini. Jadi, <hr>bisa jadi masalah juga. Belum lagi wp_head()barang - barang seperti <link>dan berbagai <meta>tag.

artlung
sumber
1
apa yang salah dengan <br />?
Scott M.
2
Tidak apa-apa, tetapi jika saya ingin beralih ke HTML5 versi non-XML, saya tidak akan menginginkan akhiran XML-style `/>`.
artlung
Saya pikir <br /> apakah html dan xhtml valid? Kapan bukan?
Ryan Gibbons
5
Saya percaya pertanyaan ini sangat menyesatkan. wptexturize tidak, dengan cara apa pun, mencegah situs agar tidak sesuai dengan HTML 5.
Ryan Gibbons
2
Dapatkah seseorang tolong beri judul ulang ini di sepanjang baris "Bagaimana cara menghapus garis miring dari elemen penutup diri di markup yang dihasilkan wordpress"?
Bobby Jack

Jawaban:

21

Jeda baris ditambahkan oleh wpautop(), bukan wptexturize(). wpautop()juga merupakan fungsi yang secara otomatis menambahkan tag paragraf.

Anda lebih baik memperbaiki <br />daripada Anda mengganti filter. Karena wpautop()berjalan pada prioritas 10, Anda dapat menghubungkan setelah itu dan memperbaikinya.

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

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

Edit setelah pembaruan OP:

Fungsi WordPress dirancang untuk menghasilkan XHTML. Untuk menyingkirkan garis miring trailing di seluruh situs, Anda harus menggunakan buffer output. Anda dapat menggunakan filter yang mirip dengan yang di atas untuk mengganti garis miring pada konten posting, tetapi itu tidak akan menarik kepala, bilah sisi, dll.

Agak jelek dan mungkin memiliki dampak kecil pada kinerja, tapi ini dia (masukkan ini dalam plugin atau functions.phpfile tema Anda ):

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

Kode itu mengatakan jika Anda tidak berada di area administrasi dan tidak melakukan penanganan permintaan AJAX, kemudian mulai buffering output melalui filter dan kemudian menggunakan kait shutdown WordPress, output buffer itu.

Viper007Bond
sumber
Saya belum punya waktu untuk memecahkan functions.php terbuka, tetapi bisakah Anda menguraikan di mana jika blok berjalan? Mungkin terbukti begitu saya mendapat kesempatan untuk membuka file itu, tapi saya kira saya akan mendapatkan pertanyaan itu.
Thomas Owens
@ Thomas: functions.phpFile tema Anda seperti file plugin. Kode apa pun di sana akan secara otomatis dieksekusi. Tidak masalah ke mana ia pergi selama itu PHP yang valid.
Viper007Bond
Ah. Menarik. Saya cukup baru dalam pengembangan WordPress, jadi saya masih belajar banyak. Terima kasih sudah membereskannya.
Thomas Owens
8

Ini dia:

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

Ini bukan solusi yang paling elegan, tetapi dapat menyelesaikannya jauh lebih cepat daripada menulis ulang wpautop dan wptexturize.

John P Bloch
sumber
1
+1 Saya melakukan sesuatu yang sangat mirip untuk HTML 4.01 Kepatuhan yang ketat.
Trevor Bramble
7

Baru saja menemukannya; tag penutup sendiri pada elemen batal adalah html yang valid.

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

Lebih banyak informasi:

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

Ryan Gibbons
sumber
1
"Namun, karena upaya luas untuk menggunakan XHTML1, ada sejumlah halaman yang signifikan menggunakan trailing slash. Karena itu, sintaks slash trailing telah diizinkan pada elemen void dalam HTML untuk memudahkan migrasi dari XHTML1 ke HTML5. " Diijinkan sebagai warisan. Saya pikir jalan ke depan adalah membuang ekstra "/", demikian pertanyaan saya. Saya pikir WordPress perlu memperbolehkan opsi untuk membuat kode ke xhtml, atau html4.01 atau html5.
artlung
Itulah masalah yang Anda baca dalam apa yang dikatakan. Garis miring trailing diizinkan, yang berarti sintaks yang valid. Anda berspekulasi bahwa itu akan dihapus? Mengapa menebak kemana standar akan pergi dan menciptakan pekerjaan untuk memecahkan masalah yang tidak ada?
Ryan Gibbons
Saya tidak berspekulasi tentang apa pun. Saya tidak menebak apa pun. Tanda / tidak diperlukan oleh spec, dan saya ingin memiliki opsi untuk menghapusnya di WordPress.
artlung
Saya suka XHTML, apakah kita harus kembali ke tampilan HTML lama yang tidak teratur.
Arlen Beiler
Arlen, saya suka html yang teratur, saya suka xhtml. Saya penggemar validator. Saya telah menulis dokumen saya sendiri untuk melakukan validasi pada kode saya sendiri. Saya telah menggunakan html 3.2, html 4, 4.01, bahkan html 2.0! lab.artlung.com/html-2.0 - tapi saya ingin opsi untuk menghapus tag yang menutup sendiri di WordPress. Sepertinya itu bukan masalah besar. Saya merasa berdebat dengan premis pertanyaan saya sangat tidak membantu.
artlung
6

Ini dapat dinonaktifkan misalnya file function.php tema dengan mengambil keuntungan dari remove_filter()fungsi (http://codex.wordpress.org/Function_Reference/remove_filter)

remove_filter("the_content", "wptexturize");
thomasjo
sumber
1
Bisakah saya mendapatkan lebih banyak kontrol granular atas ini? Apakah saya tidak akan kehilangan tanda tipografi jika saya melakukannya dengan cara ini?
artlung
Saya tidak mengetahui adanya pendekatan sederhana dari atas kepala saya, tetapi biarkan saya melihat apa yang bisa saya pikirkan untuk Anda.
thomasjo
Pendek mereproduksi fungsi yang diinginkan ditemukan di wptexturize(), saya tidak dapat menemukan solusi yang layak lainnya.
thomasjo
Saya bertanya-tanya apakah akan ada cara untuk membalikkan <br />- ganti dengan yang <br>mungkin?
artlung
5

Saya memiliki tema pemula untuk html5 dan WordPress dan juga fungsi bukan untuk wptexturize, tetapi untuk wpautop (). Sertakan juga elemen lain dari html, seperti thead, tfoot, samping dan gunakan sintaks html5 seperti
dan

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

lihat lebih lanjut tentang svn dari tema html5 starter, bukan framework!

bueltge
sumber
3

Nonaktifkan plugin WPtexturize bekerja untuk saya: Nonaktifkan WPtexturize

Ini cukup sulit meskipun:

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