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 breadcrumbList, который это не то, что я хочу, я хочу иметь массив формат, чтобы я мог построить 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"}
}
]
}

1

Решение

Вы можете отфильтровать вывод и собрать свой JSON. Тем не менее, в приведенном ниже примере, «собирать» может быть поздно, если вы хотите выводить в разделе заголовка документа. Затем вы можете вызвать функцию breadcrumb ранее, не отображая ее и не собирая данные, не удаляя фильтр и не обрабатывая 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.

Happy JSON

1

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

Других решений пока нет …

По вопросам рекламы [email protected]