2016-12-09 8 views
1

yoast_breadcrumb API를 JSON-LD와 통합하려고합니다. 나는 다음과 JSON-LD 코드 예제와 Yoast 이동 경로 API를 사용하여 JSON-LD 스키마를 통합하는 것을 시도하고있다, 그러나WP SEO Yoast 플러그인 브레드 크럼과 JSON-LD (BreadcrumbList) 통합

<?php 
yoast_breadcrumb(); 
?> 

:

는 SEO Yoast 플러그인 문서에 따르면, 나는 다음과 같이이 경로 탐색 코드를 아래, 그리고 어디서나이 문서를 찾을 수 없습니다, API는 breadcrumbList의 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" 
    } 
    } 
] 
} 

답변

1

출력을 필터링하고 JSON을 수집 할 수 있습니다. 그러나 아래 제공된 예제에서 문서의 머리 부분에 출력하려면 "수집"이 지연 될 수 있습니다. 그런 다음 에코를 적용하지 않고 breadcrumb 함수를 먼저 호출하고 데이터를 수집하고 필터를 제거한 다음 JSON을 렌더링 할 수 있습니다.

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을 채울 나던 : 여기

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

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

그리고

는 필터 기능입니다. 함수에 작성자 보관 파일의 예제가있는 파일을 추가해야합니다. 이것은 스키마에 현재 트레 일을 원하는지 여부에 따라 다르므로 각 사용자의 경우이 값을 수정 한 상태로 두십시오.

(*) TIPS 이것은 원시 예제입니다. javascript 범위 문제를 피하기 위해 채워진 vars에서 일부 sanitazion을 수행하십시오. 또한 마지막 줄 바꿈은 PRETTY 인수를 사용하는 경우에만 필요합니다.

해피 JSON