Làm cách nào để tắt các thẻ tự đóng để đánh dấu trong WordPress (ví dụ: cho HTML5 hoặc HTML4)?


18

Tôi muốn sử dụng HTML5 trong chủ đề WordPress của mình, làm cách nào để tắt wptexturize?

Tôi không ngại WP thêm giờ nghỉ, nhưng tôi muốn họ được <br>và không <br />. Làm cách nào để tôi có quyền kiểm soát cách các dấu ngắt đó hiển thị trong mã của tôi?

EDIT: Tôi chỉ thực sự quan tâm đến <br>vấn đề thẻ, tôi không quan tâm đến những thay đổi chính tả mà nó tạo ra.

EDIT2: Trên thực tế, tôi đoán <img>các thẻ cũng quan trọng. Bất kỳ thẻ độc lập tự đóng sẽ quan trọng ở đây. Vì vậy, <hr>có thể là một vấn đề là tốt. Không đề cập đến các wp_head()mục như <link>và các <meta>thẻ khác nhau .


1
có chuyện gì với bạn <br />vậy
Scott M.

2
Điều đó tốt, nhưng nếu tôi muốn đẽo với phiên bản HTML5 không phải XML, tôi sẽ không muốn các kết thúc `/>` kiểu XML.
artlung

Tôi nghĩ rằng <br /> là html và xhtml hợp lệ? Khi nào thì không?
Ryan Gibbons

5
Tôi tin rằng câu hỏi này là vô cùng sai lệch. Dù sao đi nữa, wptexturize không ngăn trang web tuân thủ HTML 5.
Ryan Gibbons

2
Ai đó có thể vui lòng đặt lại tiêu đề này dọc theo dòng "Làm cách nào để xóa dấu gạch chéo khỏi các thành phần tự đóng trong đánh dấu do wordpress tạo" không?
Bobby Jack

Câu trả lời:


21

Ngắt dòng được thêm bởi wpautop(), không wptexturize(). wpautop()cũng là chức năng tự động thêm các thẻ đoạn.

Bạn nên sửa lỗi <br />hơn là thay thế bộ lọc. Vì wpautop()chạy ở mức ưu tiên 10, bạn chỉ có thể kết nối sau đó và sửa nó.

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

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

Chỉnh sửa sau khi cập nhật OP:

Các chức năng WordPress được thiết kế để xuất XHTML. Để thoát khỏi những dấu gạch chéo trên toàn trang web, bạn sẽ phải sử dụng bộ đệm đầu ra. Bạn có thể sử dụng bộ lọc tương tự như bộ lọc ở trên để thay thế dấu gạch chéo trong nội dung bài đăng, nhưng điều đó sẽ không bắt được đầu, thanh bên, v.v.

Nó hơi xấu và có thể ảnh hưởng nhỏ đến hiệu suất, nhưng ở đây bạn đi (bỏ phần này vào một plugin hoặc functions.phptệp của chủ đề của bạn ):

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

Mã đó cho biết nếu bạn không ở trong khu vực quản trị và không thực hiện xử lý yêu cầu AJAX, thì hãy bắt đầu đệm đầu ra thông qua bộ lọc và sau đó sử dụng móc tắt máy WordPress, xuất bộ đệm đó.


Tôi chưa có thời gian để bẻ khóa mở tệp.php, nhưng bạn có thể giải thích về việc nếu khối đó đi đâu không? Có thể rõ ràng một khi tôi có cơ hội mở tập tin đó lên, nhưng tôi nghĩ rằng tôi sẽ giải quyết được câu hỏi này.
Thomas Owens

@Thomas: Tệp chủ đề của bạn functions.phpgiống như tệp plugin. Bất kỳ mã trong đó sẽ tự động được thực thi. Không quan trọng nó đi đâu miễn là PHP hợp lệ.
Viper007Bond

Ah. Hấp dẫn. Tôi còn khá mới đối với phát triển WordPress, vì vậy tôi vẫn đang học hỏi rất nhiều. Cám ơn giải thích rõ ràng.
Thomas Owens

8

Ở đây bạn đi:

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

Đây không phải là giải pháp tao nhã nhất, nhưng nó được thực hiện nhanh hơn rất nhiều so với viết lại wpautop và wptexturize.


1
+1 Tôi đã làm một cái gì đó rất giống với HTML 4.01 Tuân thủ nghiêm ngặt.
Trevor Bramble

7

Chỉ cần tìm thấy nó; các thẻ tự đóng trên các phần tử void là html hợp lệ.

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

Thêm thông tin:

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


1
"Tuy nhiên, do các nỗ lực sử dụng XHTML1 rộng rãi, có một số lượng đáng kể các trang sử dụng dấu gạch chéo. Do đó, cú pháp dấu gạch chéo đã được cho phép trên các phần tử void trong HTML để dễ dàng chuyển từ XHTML1 sang HTML5. " Được phép như một di sản. Tôi nghĩ rằng con đường phía trước là bỏ thêm "/", vì vậy câu hỏi của tôi. Tôi nghĩ rằng WordPress cần phải cho phép tùy chọn tạo mã thành xhtml hoặc html4.01 hoặc html5.
artlung

Đó là vấn đề bạn đang đọc vào những gì đang được nói. Chém dấu gạch chéo được cho phép, có nghĩa là nó là cú pháp hợp lệ. Bạn đang suy đoán rằng nó sẽ được gỡ bỏ? Tại sao đoán nơi các tiêu chuẩn đang đi và tạo ra công việc để giải quyết vấn đề không tồn tại?
Ryan Gibbons

Tôi không suy đoán về bất cứ điều gì. Tôi không đoán được gì cả. Dấu / không được yêu cầu bởi thông số kỹ thuật và tôi muốn có tùy chọn xóa nó trong WordPress.
artlung

Tôi thích XHTML, chúng ta có phải quay lại giao diện lộn xộn của HTML cũ không.
Arlen Beiler

Arlen, tôi thích html có trật tự, tôi thích xhtml. Tôi là một fan hâm mộ lớn của trình xác nhận. Tôi đã viết tài liệu riêng của mình để xác thực mã của riêng tôi. Tôi đã sử dụng html 3.2, html 4, 4.01, thậm chí html 2.0! lab.artlung.com/html-2.0 - nhưng tôi muốn tùy chọn xóa các thẻ tự đóng trong WordPress. Có vẻ như nó không phải là một vấn đề lớn. Tôi cảm thấy như tranh luận với tiền đề của câu hỏi của tôi là rất không có ích.
artlung

6

Điều này có thể bị vô hiệu hóa trong ví dụ: tệp function.php của chủ đề bằng cách tận dụng remove_filter()chức năng (http://codex.wordpress.org/Function_Reference/remove_filter)

remove_filter("the_content", "wptexturize");

1
Tôi có thể kiểm soát chi tiết hơn về vấn đề này không? Tôi sẽ không bị mất dấu đánh máy nếu tôi làm theo cách này?
artlung

Tôi không nhận ra bất kỳ cách tiếp cận đơn giản nào ngoài đỉnh đầu của tôi, nhưng hãy để tôi xem những gì tôi có thể tìm ra cho bạn.
thomasjo

Không thể tái tạo chức năng mong muốn được tìm thấy wptexturize(), tôi không thể tìm thấy bất kỳ giải pháp khả thi nào khác.
thomasjo

Tôi tự hỏi liệu có cách nào để đơn giản đảo ngược <br />- thay thế những cái đó có <br>thể không?
artlung

5

Tôi có một chủ đề khởi đầu cho html5 và WordPress và cũng là một chức năng không dành cho wptexturize, nhưng dành cho wpautop (). Bao gồm cả các yếu tố khác của html, như thead, t feet, sang một bên và sử dụng cú pháp của html5 như

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

xem thêm về svn của chủ đề khởi động html5, không phải là khung!


3

Vô hiệu hóa plugin WPtexturize làm việc cho tôi: Vô hiệu hóa WPtexturize

Mặc dù điều này khá khó khăn:

remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.