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>

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


person Niklas    schedule 21.12.2015    source источник


Ответы (2)


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

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

...

echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
person Markus Lanthaler    schedule 28.12.2015

Большое спасибо за ответ Markus Lanthaler, который мне очень помог. У меня есть только небольшое дополнение к его ответу:

Если вы используете такие переменные, как 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);
person Vasco    schedule 01.11.2018