Интеграция хлебных крошек плагина WP SEO Yoast и JSON-LD (BreadcrumbList)

Я пытаюсь интегрировать API yoast_breadcrumb с JSON-LD.

Согласно документации плагина SEO Yoast, у меня есть этот код хлебной крошки, как показано ниже:

<?php 
 yoast_breadcrumb();
?>

Тем не менее, я пытаюсь интегрировать схему JSON-LD с API-интерфейсом Yoast Breadcrumb, следуя приведенному ниже примеру кода JSON-LD, и я не смог найти нигде в документации для этого, API отображает HTML-формат списка хлебных крошек, который это не то, что я хочу, я хочу иметь формат массива, чтобы я мог построить JSON-LD, используя цикл foreach.

{
 "@context": "http://schema.org",
 "@type": "BreadcrumbList",
 "itemListElement":
 [
  {
   "@type": "ListItem",
   "position": 1,
   "item":
   {
    "@id": "https://example.com/news/",
    "name": "News"
    }
  },
  {
   "@type": "ListItem",
  "position": 2,
  "item":
   {
     "@id": "https://example.com/news/finance/",
     "name": "Finance"
   }
  }
 ]
}

person Mike    schedule 09.12.2016    source источник


Ответы (1)


Вы можете отфильтровать вывод и собрать свой JSON. Однако в приведенном ниже примере «собрать» может быть слишком поздно, если вы хотите вывести в разделе заголовка документа. Затем вы можете вызвать функцию хлебных крошек раньше, без эха, и собрать данные, удалить фильтр и отобразить JSON.

/* echo breadcrumbs in template */
yoast_breadcrumb('<p id="breadcrumbs">','</p>');

/* collect breadcrumb whenever */
$breadcrumbs = yoast_breadcrumb('','',false);

А вот функция фильтра:

add_filter('wpseo_breadcrumb_links', 'entex_add_crumb_schema', 10, 1);
function entex_add_crumb_schema($crumbs) {

    if( ! is_array( $crumbs ) || $crumbs === array()){
        return $crumbs;
    }

    $last = count($crumbs);
    $listItems = [];
    $j = 1;

    foreach ( $crumbs as $i => $crumb ) {

        $item = [];
        $nr = ($i + 1);

        if(isset($crumb['id'])){
            $item = [
                '@id' => get_permalink($crumb['id']),
                'name' => strip_tags( get_the_title( $id ) )
            ];
        }

        if(isset($crumb['term'])){
            $term = $crumb['term'];

            $item = [
                '@id' => get_term_link( $term ),
                'name' => $term->name
            ];
        }

        if(isset($crumb['ptarchive'])){
            $postType = get_post_type_object($crumb['ptarchive']);

            $item = [
                '@id' => get_post_type_archive_link($crumb['ptarchive']),
                'name' => $postType->label
            ];
        }

        /* READ NOTE BELOW: */

        if($nr == $last){
            if(is_author() && !isset($crumb['url'])) $crumb['url'] = esc_url(get_author_posts_url(get_queried_object_id()));
        }

        /* The 'text' indicates the current (last) or start-path crumb (home)*/
        if(isset($crumb['url'])) {
            if($crumb['text'] !== '') {
                $title = $crumb['text'];
            } else {
                $title = get_bloginfo('name');
            }

            $item = [
                '@id' => $crumb['url'],
                'name' => $title
            ];
        }

        $listItem = [
            '@type' => 'ListItem',
            'position' => $j,
            'item' => $item
        ];

        $listItems[] = $listItem;
        $j++;
    }

    $schema = [
        '@context' => 'http://schema.org',
        '@type' => 'BreadcrumbList',
        'itemListElement' => $listItems
    ];

    $html = '<script type="application/ld+json">' . stripslashes(json_encode($schema, JSON_PRETTY_PRINT)) . '</script> ';
    echo $html;
    remove_filter('wpseo_breadcrumb_links', 'entex_add_crumb_schema', 10, 1);
    return $crumbs;
}

(*) ПРИМЕЧАНИЕ Yoast не заполняет URL-адреса текущих целевых страниц/архивных целевых страниц. Вы должны добавить их с примером для авторского архива в функцию. Это зависит от того, хотите ли вы текущий след или нет в схеме, поэтому я оставляю это для изменения в каждом пользовательском случае.

(*) СОВЕТЫ Это примеры RAW. Сделайте некоторую санитарную обработку ваших заполненных переменных, чтобы избежать проблем с областью действия javascript. Кроме того, последние полосы косой черты нужны только в том случае, если вы используете аргументы PRETTY.

Счастливый JSON

person cavameta    schedule 13.10.2017