防止HTML Tidy弄乱元标记(架构标记)

时间:2018-08-21 08:40:43

标签: php html wordpress html5 htmltidy

我在使用HTML Tidy(最新版本-https://html-tidy.org)时遇到了严重的问题。

简而言之:HTML整洁地转换这些行的HTML代码

<div class="breadcrumbs" typeof="BreadcrumbList" vocab="http://schema.org/">
<div class="wrap">
    <span property="itemListElement" typeof="ListItem">
        <a property="item" typeof="WebPage" title="Codes Category" href="https://mysite.works/codes/" class="taxonomy category">
            <span property="name">Codes</span>
        </a>
        <meta property="position" content="1">
    </span>
</div>

进入这些代码行-请仔细查看元标记的放置

<div class="breadcrumbs" typeof="BreadcrumbList" vocab="http://schema.org/">
<div class="wrap">
    <span property="itemListElement" typeof="ListItem">
        <a property="item" typeof="WebPage" title="Codes Category" href="https://mysite.works/codes/" class="taxonomy category">
            <span property="name">Codes</span>
        </a>
    </span>
    <meta property="position" content="1">
</div>

这会导致一些严重的架构验证问题。您可以在此处查看代码:https://search.google.com/structured-data/testing-tool/u/0/

由于这个问题,客户端的(URL:https://techswami.in)面包屑导航在搜索结果中不可见。

我在美化什么?

我的客户希望我使他/她的网站的源代码看起来“干净,可读且整洁”。

所以我正在使用这些代码行使其适用于他/她。

注意:此代码可在以下WordPress设置上完美地运行100%。

  • 具有FastCGI缓存/ MariaDB的Nginx
  • PHP7
  • Ubuntu 18.04.1
  • 最新的WordPress,并且与每个缓存插件兼容。

代码:

if( !is_user_logged_in() || !is_admin() ) {
function callback($buffer) {
    $tidy = new Tidy();
    $options = array('indent' => true, 'markup' => true, 'indent-spaces' => 2, 'tab-size' => 8, 'wrap' => 180, 'wrap-sections' => true, 'output-html' => true, 'hide-comments' => true, 'tidy-mark' => false);
    $tidy->parseString("$buffer", $options);
    $tidy->cleanRepair();
    $buffer = $tidy;
    return $buffer;
}
function buffer_start() { ob_start("callback"); }
function buffer_end() { if (ob_get_length()) ob_end_flush(); }
add_action('wp_loaded', 'buffer_start');
add_action('shutdown', 'buffer_end');

}

我需要你们的什么帮助?

能否请您告诉我如何防止HTML Tidy弄乱META标记。我需要参数。

谢谢。

3 个答案:

答案 0 :(得分:3)

<meta>标签只能在父元素中使用:<head><meta charset><meta http-equiv> 此外,<meta>元素中没有property属性。

最可能的原因是HTML-Tidy正在清除标记。

来源

答案 1 :(得分:2)

首先,我衷心感谢所有试图帮助我的人。

我找到了解决方案,我的解决方案唯一的问题是它不能解决HTML-Tidy问题。

所以,现在我不是在使用HTML-Tody,而是在使用:https://github.com/ivanweiler/beautify-html/blob/master/beautify-html.php

我的新代码是:

if( !is_user_logged_in() || !is_admin() ) {
    function callback($buffer) {
        $html = $buffer;
        $beautify = new Beautify_Html(array(
          'indent_inner_html' => false,
          'indent_char' => " ",
          'indent_size' => 2,
          'wrap_line_length' => 32786,
          'unformatted' => ['code', 'pre'],
          'preserve_newlines' => false,
          'max_preserve_newlines' => 32786,
          'indent_scripts'  => 'normal' // keep|separate|normal
        ));

        $buffer = $beautify->beautify($html);
        return $buffer;
    }
    function buffer_start() { ob_start("callback"); }
    function buffer_end() { if (ob_get_length()) ob_end_flush(); }
    add_action('wp_loaded', 'buffer_start');
    add_action('shutdown', 'buffer_end');
}

现在与模式标记有关的每个问题都已修复,并且客户的站点已美化了源代码。

答案 2 :(得分:0)

仅出于角度考虑,我尝试基于以下示例实现一个最小的自包含示例:

我最终得到了以下代码:

<?php
ob_start();
?>

<div class="breadcrumbs" typeof="BreadcrumbList" vocab="http://schema.org/">
    <div class="wrap">
        <span property="itemListElement" typeof="ListItem">
            <a property="item" typeof="WebPage" title="Codes Category" href="https://mysite.works/codes/" class="taxonomy category">
                <span property="name">Codes</span>
            </a>
            <meta property="position" content="1">
        </span>
    </div>
</div>

<?php

$buffer = ob_get_clean();
$tidy = new Tidy();
$options = array(
    'indent' => true,
    'markup' => true,
    'indent-spaces' => 2,
    'tab-size' => 8,
    'wrap' => 180,
    'wrap-sections' => true,
    'output-html' => true,
    'hide-comments' => true,
    'tidy-mark' => false
);
$tidy->parseString("$buffer", $options);
$tidy->cleanRepair();

echo $tidy;
?>

有关Tidy如何重组HTML的输出非常有用。在这里:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
  <head>
    <meta property="position" content="1">
    <title></title>
  </head>
  <body>
    <div class="breadcrumbs" typeof="BreadcrumbList" vocab="http://schema.org/">
      <div class="wrap">
        <span property="itemListElement" typeof="ListItem"><a property="item" typeof="WebPage" title="Codes Category" href="https://mysite.works/codes/" class=
        "taxonomy category"><span property="name">Codes</span></a> </span>
      </div>
    </div>
  </body>
</html>

meta标签并没有消失,相反,正如其他评论者所指出的那样,它已经被推到了它应该属于的位置。

如果您希望Tidy仅处理HTML结构,请添加选项'input-xml'并将其设置为true,如下所示:

$options = array(
    'indent' => true,
    'markup' => true,
    'indent-spaces' => 2,
    'tab-size' => 8,
    'wrap' => 180,
    'wrap-sections' => true,
    'output-html' => true,
    'hide-comments' => true,
    'tidy-mark' => false,
    'input-xml' => true
);

这将输出以下内容:

<div class="breadcrumbs" typeof="BreadcrumbList" vocab="http://schema.org/">
  <div class="wrap">
    <span property="itemListElement" typeof="ListItem">
      <a property="item" typeof="WebPage" title="Codes Category" href="https://mysite.works/codes/" class="taxonomy category">
        <span property="name">Codes</span>
      </a>
      <meta property="position" content="1"></meta>
    </span>
  </div>
</div>