schema.org — JSONLD для Google AMP с php-json-ld

У меня проблемы с печатью правильного JSONLD для ускоренных страниц Google (AMP, www.ampproject.org) с помощью «php-json-ld» (github.com/digitalbazaar/php-json-ld), как описано в этом примере: github.com /ampproject/amphtml/blob/master/examples/metadata-examples/article-json-ld.amp.html

Более конкретно: мне интересно, как добавить «@type»: «NewsArticle» используя функции php-json-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>

Кто-нибудь может помочь?

0

Решение

Если вам не нужно преобразовывать JSON-LD, вам не нужен php-json-ld (или любая другая библиотека). Достаточно простого ассоциативного массива, который вы сериализуете как JSON:

$data = array(
"@context" => "http://schema.org",
"@type" => "NewsArticle",
...
);

...

echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
8

Другие решения

Большое спасибо за ответ Маркус Ланталер что мне очень помогло. У меня есть только небольшое дополнение к его ответу:

Если вы используете переменные, такие как post_title, символы автоматически кодируются, что приводит к плохо отформатированному JSON-LD.
Способ противостоять этому — сначала расшифровать переменную, например, заголовок:

html_entity_decode(get_the_title($post->ID),ENT_QUOTES,'UTF-8');

И, повторяя json_encode, вы также должны добавить JSON_UNESCAPED_UNICODE для правильной кодировки.

Так что ваше эхо должно выглядеть так:

echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
0