Google AMP 的 JSONLD,具有 php-json-ld
JSONLD for Google AMP with php-json-ld
我在使用 "php-json-ld" (github.com/digitalbazaar/php-json-ld) 为 Google Accelerated Pages (AMP, www.ampproject.org) 打印正确的 JSONLD 时遇到问题,如文档所述在这个例子中:github.com/ampproject/amphtml/blob/master/examples/metadata-examples/article-json-ld.amp.html
更具体地说:我想知道如何使用 php-[=32= 的函数添加 "@type": "NewsArticle" ]-ld:
$doc = (object)array(
"https://schema.org/article" => 'Article',
"http://schema.org/name" => "Manu Sporny",
"http://schema.org/url" => (object)array("@id" => "http://manu.sporny.org/"),
"http://schema.org/image" => (object)array("@id" => "http://manu.sporny.org/images/manu.png")
);
$context = (object)array(
"article" => (object)array("https://schema.org/Article"),
"name" => "http://schema.org/name",
"homepage" => (object)array("@id" => "http://schema.org/url", "@type" => "@id"),
"image" => (object)array("@id" => "http://schema.org/image", "@type" => "@id")
);
//Print Json-LP
echo '<script type="application/ld+json">';
echo json_encode($jsonld_compacted,
JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
echo '</script>';
//Result:
<script type="application/ld+json">{
"@context": "http://schema.org",
"image": "http://manu.sporny.org/images/manu.png",
"name": "Manu Sporny",
"url": "http://manu.sporny.org/"
}</script>
有人能帮忙吗?
如果不需要转换 JSON-LD,则不需要 php-json-ld(或任何其他库)。序列化为 JSON 的简单关联数组就足够了:
$data = array(
"@context" => "http://schema.org",
"@type" => "NewsArticle",
...
);
...
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
非常感谢Markus Lanthaler的回答,对我帮助很大。我对他的回答只有一点补充:
如果您使用像 post_title 这样的变量,字符会自动编码,这将导致格式错误 JSON-LD。
解决这个问题的方法是首先解码像标题这样的变量:
html_entity_decode(get_the_title($post->ID),ENT_QUOTES,'UTF-8');
并且在回显 json_encode 时,您还应该添加 JSON_UNESCAPED_UNICODE,以获得正确的编码。
所以你的 echo 应该是这样的:
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
我在使用 "php-json-ld" (github.com/digitalbazaar/php-json-ld) 为 Google Accelerated Pages (AMP, www.ampproject.org) 打印正确的 JSONLD 时遇到问题,如文档所述在这个例子中:github.com/ampproject/amphtml/blob/master/examples/metadata-examples/article-json-ld.amp.html
更具体地说:我想知道如何使用 php-[=32= 的函数添加 "@type": "NewsArticle" ]-ld:
$doc = (object)array(
"https://schema.org/article" => 'Article',
"http://schema.org/name" => "Manu Sporny",
"http://schema.org/url" => (object)array("@id" => "http://manu.sporny.org/"),
"http://schema.org/image" => (object)array("@id" => "http://manu.sporny.org/images/manu.png")
);
$context = (object)array(
"article" => (object)array("https://schema.org/Article"),
"name" => "http://schema.org/name",
"homepage" => (object)array("@id" => "http://schema.org/url", "@type" => "@id"),
"image" => (object)array("@id" => "http://schema.org/image", "@type" => "@id")
);
//Print Json-LP
echo '<script type="application/ld+json">';
echo json_encode($jsonld_compacted,
JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
echo '</script>';
//Result:
<script type="application/ld+json">{
"@context": "http://schema.org",
"image": "http://manu.sporny.org/images/manu.png",
"name": "Manu Sporny",
"url": "http://manu.sporny.org/"
}</script>
有人能帮忙吗?
如果不需要转换 JSON-LD,则不需要 php-json-ld(或任何其他库)。序列化为 JSON 的简单关联数组就足够了:
$data = array(
"@context" => "http://schema.org",
"@type" => "NewsArticle",
...
);
...
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
非常感谢Markus Lanthaler的回答,对我帮助很大。我对他的回答只有一点补充:
如果您使用像 post_title 这样的变量,字符会自动编码,这将导致格式错误 JSON-LD。 解决这个问题的方法是首先解码像标题这样的变量:
html_entity_decode(get_the_title($post->ID),ENT_QUOTES,'UTF-8');
并且在回显 json_encode 时,您还应该添加 JSON_UNESCAPED_UNICODE,以获得正确的编码。
所以你的 echo 应该是这样的:
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);