内联JSON-LD脚本块中的动态值

时间:2015-10-07 13:07:51

标签: dynamic json-ld

我将数据存储在我选择的数据库中并在我的html页面上回显,如下所示:

 <article id="content_left_article_1">
      <h1 class="main-heading">Get in Touch</h1>
      <P><?php echo $rs_contactRows['ContactJobTitle']; ?>: <?php echo $rs_contactRows['ContactName']; ?></P>
      <P>Email: <?php echo $rs_contactRows['ContactEmail']; ?></P>
      <P>Mobile: <?php echo $rs_contactRows['ContactTelephone']; ?></P>
 </article>

我知道我可以在页面上的单独脚本块中使用JSON-LD轻松地为此人标记数据,如下所示:

<script type='application/ld+json'> 
    {
      "@context": "http://www.schema.org",
      "@type": "person",
      "name": "Brian Keet",
      "jobTitle": "Director",
      "url": "http://tekiahfoundation.blogspot.co.za/",
      "email": "briankeet@yahoo.com",
      "telephone": "+27766261024"
    }
    </script>

但是,如果客户端要更新数据库中的任何细节(他们肯定会通过站点CMS),上面的静态JSON-LD脚本块将保持......好吧,静态。我一直在谷歌搜索和堆栈溢出像疯了一样试图找到如何在JSON-LD脚本块中获得动态值的答案,

<script type='application/ld+json'> 
    {
      "@context": "http://www.schema.org",
      "@type": "person",
      "name": "$user.name + $user.surname",
    }
    </script>

或其他一些方法,通过Googles结构化数据测试工具检查。

我一直试图弄清楚如何使用json_encoded($ dataObject),我在php中使用下面的mysqli_query()等(参见下面的代码),并且可能创建一个JSON-LD脚本块使用javascript,但我不太确定这是如何工作的。我也知道,显然&#34;谷歌可以读取JSON-LD数据,即使它被动态地注入到页面内容中,例如通过Javascript代码或嵌入式小部件&#34;&#34; 。另外,如果我回显json_encoded mysqli_fetch_assoc的结果:

<?php
   require('inc-conncvnl.php');
   require('inc-function-escapestring.php');
   $sql_contact = sprintf("SELECT * FROM tblcontact");
   $rs_contact = mysqli_query($vconncvnl, $sql_contact);
   $rs_contactRows = mysqli_fetch_assoc($rs_contact);
   $contactData = json_encode($rs_contactRows);
  echo $contactData;
?>

我在页面上回显数据:json-encode echo on webpage

我很确定我错过了这个难题的一些重要部分。如果有人能帮助我找到解决这个问题的成功方法,我真的很感激。

2 个答案:

答案 0 :(得分:2)

您可以按如下方式在PHP中输出JSON-LD:

<script type="application/ld+json"> 
{
  "@context": "http://schema.org/",
  "@type": "Person",
  "name": "<?php echo htmlentities($rs_contactRows['ContactName'], ENT_QUOTES); ?>",
  "jobTitle": "<?php echo htmlentities($rs_contactRows['ContactJobTitle'], ENT_QUOTES); ?>",
  "url": "<?php echo htmlentities($rs_contactRows['ContactUrl'], ENT_QUOTES); ?>",
  "email": "<?php echo htmlentities($rs_contactRows['ContactEmail'], ENT_QUOTES); ?>",
  "telephone": "<?php echo htmlentities($rs_contactRows['ContactTelephone'], ENT_QUOTES); ?>"
}
</script>

或者您在PHP中创建JSON-LD并输出:

$data = array(
  '@context' => 'http://schema.org/',
  '@type' => 'Person',
  'name' => $rs_contactRows['ContactName'],
  'jobTitle' => $rs_contactRows['ContactJobTitle'],
  'url' => $rs_contactRows['ContactUrl'],
  'email' => $rs_contactRows['ContactEmail'],
  'telephone' => $rs_contactRows['ContactTelephone']
);
echo json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

附注:输出HTML时应始终使用htmlentities,否则会有XSS security vulnerabilities的风险。

答案 1 :(得分:0)

马库斯答案是理解基础的正确方法。 下一步可能是找到并使用一个为您生成LD-JSON的php库。

例如,让我们看一下Torann json-ld库。

您可以通过更新composer.json使用Composer安装它:添加以下依赖项:

  

“需要”:{       “ torann / json-ld”:“ ^ 0.0”}

然后在您的页面中,您可以通过这种方式生成ld-json(参见自述文件或单元测试):

$context = \JsonLd\Context::create('news_article', [
    'headline' => 'Article headline',
    'description' => 'A most wonderful article',
    'mainEntityOfPage' => [
        'url' => 'https://google.com/article',
    ],
    'image' => [
        'url' => 'https://google.com/thumbnail1.jpg',
        'height' => 800,
        'width' => 800,
    ],
    'datePublished' => '2015-02-05T08:00:00+08:00',
    'dateModified' => '2015-02-05T09:20:00+08:00',
    'author' => [
        'name' => 'John Doe',
    ],
    'publisher' => [
        'name' => 'Google',
        'logo' => [
          'url' => 'https://google.com/logo.jpg',
          'width' => 600,
          'height' => 60,
        ]
    ],
]);

echo $context; // Will output the script tag

NB /如果需要改进Person的上下文,请根据您的需求打开一个issue(我可以解决),或者自己提交请求请求。