Как добавить код Json-ld схемы SportsEvent в код PHP WordPress

Я новичок, пытаюсь собрать код схемы SportsEvent для своего сайта. Мне удалось добраться до этого момента. Я создал настраиваемые поля и сопоставил их со свойствами схемы. Кажется, я не могу пройти мимо этого момента. У меня возникает ошибка при активации плагина - Parse error: syntax error, unexpected ';', expecting ')' in /home/uhkcj8xz70dl/public_html/wp-content/plugins/football-schema/football_schema.php on line 21

<?php
/**
* Plugin Name: Schema.org for Football
* Description: Add SportsEvent Schema.org in JSONld to site
* Plugin URI: 
* Author: Danstan
* Author URI: 
* Version: 1.0.0
* License: GPL2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/

function addschema() //Function for Schema.org
{
global $post;
if (is_singular('matches')) { //only for post type matches
    $schema_sportsevent = array(
        '@context'  => "http://schema.org",
        '@type'     => "SportsEvent",
        'name' => get_the_title($post->ID);
        'description' => get_the_content($post->ID);
        'url' => get_permalink();
        'startDate' => get_post_meta( get_the_ID(), 'start_date' );
        'endDate'=> get_post_meta( get_the_ID(), 'end_date' );
        'image'   => get_the_post_thumbnail_url($post->ID);

        'competitor' => array(
            '@type' => "SportsTeam",
            'name'   => "Team A",
            'image'   => get_post_meta( get_the_ID(), 'logo_left' );
        ),

        'competitor' => array(
            '@type' => "SportsTeam",
            'name'   => "Team B",
            'image'   => get_post_meta( get_the_ID(), 'logo_right' );
        ),

        'location' => array(
            '@type' => "Place",
            'name'   => get_post_meta( get_the_ID(), 'venue_name' );
            'address' => array(
            '@type' => "PostalAddress",
            'postalCode'   => get_post_meta( get_the_ID(), 'zip_postal_code' );
            'streetAddress'   => get_post_meta( get_the_ID(), 'street_address' );
            'addressLocality'   => get_post_meta( get_the_ID(), 'locality_city' );
            'addressRegion'   => get_post_meta( get_the_ID(), 'address_region' );
            'addressCountry'   => get_post_meta( get_the_ID(), 'country' );
        )
        )
    );
    echo '<script type="application/ld+json">' . json_encode($schema_sportsevent) . '</script>'; 
//encode schema for matches
}
endif;
}
add_action('wp_head', 'addschema'); //Add Schema to header
?>`

person Community    schedule 28.02.2020    source источник


Ответы (1)


Вы смешиваете некоторые ; там, где вам нужно ,, потому что это массив значений, и вы добавили endif, когда он вам не нужен. Попробуй это.

function addschema() //Function for Schema.org
{
    global $post;
    if (is_singular('post')) { //only for post type matches
        $schema_sportsevent = array(
            '@context'  => "http://schema.org",
            '@type'     => "SportsEvent",
            'name' => get_the_title($post->ID),
            'description' => get_the_content($post->ID),
            'url' => get_permalink(),
            'startDate' => get_post_meta( get_the_ID(), 'start_date' ),
            'endDate'=> get_post_meta( get_the_ID(), 'end_date' ),
            'image'   => get_the_post_thumbnail_url($post->ID),

            'competitor' => array(array(
                '@type' => "SportsTeam",
                'name'   => "Team A",
                'image'   => get_post_meta( get_the_ID(), 'logo_left' )),
                array('@type' => "SportsTeam",
                'name'   => "Team B",
                'image'   => get_post_meta( get_the_ID(), 'logo_left' ))
            ),


            'location' => array(
                '@type' => "Place",
                'name'   => get_post_meta( get_the_ID(), 'venue_name' ),
                'address' => array(
                '@type' => "PostalAddress",
                'postalCode'   => get_post_meta( get_the_ID(), 'zip_postal_code' ),
                'streetAddress'   => get_post_meta( get_the_ID(), 'street_address' ),
                'addressLocality'   => get_post_meta( get_the_ID(), 'locality_city' ),
                'addressRegion'   => get_post_meta( get_the_ID(), 'address_region' ),
                'addressCountry'   => get_post_meta( get_the_ID(), 'country' ),
            )
            )
        );
        echo '<script type="application/ld+json">' . json_encode($schema_sportsevent) . '</script>'; 
    //encode schema for matches
    }
}

Это должно генерировать JSON следующим образом. Хотя в моем посте не было части post_meta для заполнения некоторых частей.

{
  "@context": "http://schema.org",
  "@type": "SportsEvent",
  "name": "some stuff",
  "description": "",
  "url": "http://192.168.33.10/wordpress/blog/2019/11/28/some-stuff/",
  "startDate": [],
  "endDate": [],
  "image": false,
  "competitor": [
    {
      "@type": "SportsTeam",
      "name": "Team A",
      "image": []
    },
    {
      "@type": "SportsTeam",
      "name": "Team B",
      "image": []
    }
  ],
  "location": {
    "@type": "Place",
    "name": [],
    "address": {
      "@type": "PostalAddress",
      "postalCode": [],
      "streetAddress": [],
      "addressLocality": [],
      "addressRegion": [],
      "addressCountry": []
    }
  }
}
person Tom Woodward    schedule 28.02.2020
comment
Это сработало, но все еще есть небольшая проблема: свойство конкурента показывает одну команду, Team B выше, чтобы быть конкретным. Невозможно указать, почему отсутствует другая запись - person ; 28.02.2020
comment
Это одно и то же, поэтому используется последнее значение. Вы можете изменить его на competitor_1 и competitor_2 или изменить конкурента, чтобы он содержал несколько значений. - person Tom Woodward; 28.02.2020
comment
изменение на competitor_1 и competitor_2 вызывает ошибку. Это не сработало, даже когда я также пытался изменить конкурента, чтобы он содержал несколько значений, подобных этому 'competitor' => array( '@type' => "SportsTeam", 'name' => get_post_meta( get_the_ID(), 'home_team' ), 'image' => get_post_meta( get_the_ID(), 'logo_left' ), '@type' => "SportsTeam", 'name' => get_post_meta( get_the_ID(), 'away_team' ), 'image' => get_post_meta( get_the_ID(), 'logo_right' ), ), - person ; 28.02.2020
comment
Какая ошибка вылетает где? На моем конце PHP работает. JSON проверяет. - person Tom Woodward; 28.02.2020
comment
Показанная ошибка: property competitor_1 is not recognized by Google for an object of type SportsEvent. Поиск чего-то вроде этого shorturl.at/acnPS, где показаны два участника SportsEvent. Это единственная проблема, в противном случае остальная часть JSON в порядке. Кроме того, есть записи homeTeam и awayTeam, но мне было интересно, повлияет ли их использование на матчи, сыгранные на нейтральной территории, поэтому я хотел придерживаться конкуренции. - person ; 28.02.2020
comment
Я вижу использование этого [] для обертывания свойства соревнования. Это то, чего нам может не хватать, я не могу пройти мимо этого. - person ; 28.02.2020
comment
Я считаю, что обновленный ответ будет подтвержден, а если нет, вам, вероятно, нужно задать другой вопрос о построении схемы. - person Tom Woodward; 28.02.2020
comment
Это не подтверждает. Я разместил вопрос по этой конкретной области. Спасибо за отзыв. - person ; 28.02.2020
comment
Когда я запускаю его через валидатор на странице search.google.com/structured-data/testing- tool части команды чистые. Есть и другие проблемы. Вы видите что-то другое? - person Tom Woodward; 28.02.2020
comment
Нет. Если можно, посмотрите, как конкурент здесь, на сайте shorturl.at/acnPS, показывает два из них. В нашем случае это просто показывает вторую команду, оставляя в этом случае домашнюю команду. Остальная часть JSONld проходит проверку правильно. - person ; 28.02.2020
comment
Давайте продолжим обсуждение в чате. - person Tom Woodward; 28.02.2020