Skip to content

Commit 3aff760

Browse files
Fix error when generating JSON-LD breadcrumbs (#602)
1 parent f31a54f commit 3aff760

4 files changed

Lines changed: 112 additions & 2 deletions

File tree

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
}
2929
},
3030
"require": {
31-
"statamic/cms": "^6.10",
31+
"statamic/cms": "^6.19",
3232
"pixelfear/composer-dist-plugin": "^0.1.6",
3333
"spatie/simple-excel": "^3.9"
3434
},

src/Cascade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,7 @@ protected function jsonLd()
654654
return [
655655
'@type' => 'ListItem',
656656
'position' => $index + 1,
657-
'name' => $crumb->value('title'),
657+
'name' => $crumb->title,
658658
'item' => $crumb->absoluteUrl(),
659659
];
660660
})->all(),

tests/CascadeTest.php

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,4 +522,91 @@ public function it_generates_json_ld_breadcrumbs()
522522
'{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"http://cool-runnings.com"},{"@type":"ListItem","position":2,"name":"\'Dance Like No One is Watching\' Is Bad Advice","item":"http://cool-runnings.com/dance"}]}',
523523
], $data['json_ld']->all());
524524
}
525+
526+
#[Test]
527+
public function it_generates_json_ld_breadcrumbs_for_entry()
528+
{
529+
Collection::findByHandle('articles')->routes('articles/{slug}')->save();
530+
531+
$siteDefaults = SiteDefaults::in('default')->set([
532+
'json_ld_breadcrumbs' => true,
533+
]);
534+
535+
$this->get('/articles/dance');
536+
537+
$data = (new Cascade)
538+
->with($siteDefaults->all())
539+
->get();
540+
541+
$breadcrumbs = collect($data['json_ld'])->first(fn ($snippet) => str_contains($snippet, 'BreadcrumbList'));
542+
$breadcrumbs = json_decode($breadcrumbs, true);
543+
544+
$this->assertEquals('BreadcrumbList', $breadcrumbs['@type']);
545+
$this->assertCount(3, $breadcrumbs['itemListElement']);
546+
547+
$this->assertEquals([
548+
'@type' => 'ListItem',
549+
'position' => 1,
550+
'name' => 'Home',
551+
'item' => 'http://cool-runnings.com',
552+
], $breadcrumbs['itemListElement'][0]);
553+
554+
$this->assertEquals([
555+
'@type' => 'ListItem',
556+
'position' => 2,
557+
'name' => 'Articles',
558+
'item' => 'http://cool-runnings.com/articles',
559+
], $breadcrumbs['itemListElement'][1]);
560+
561+
$this->assertEquals([
562+
'@type' => 'ListItem',
563+
'position' => 3,
564+
'name' => "'Dance Like No One is Watching' Is Bad Advice",
565+
'item' => 'http://cool-runnings.com/articles/dance',
566+
], $breadcrumbs['itemListElement'][2]);
567+
}
568+
569+
#[Test]
570+
public function it_generates_json_ld_breadcrumbs_for_taxonomy_term()
571+
{
572+
$siteDefaults = SiteDefaults::in('default')->set([
573+
'json_ld_breadcrumbs' => true,
574+
]);
575+
576+
$this->files->makeDirectory(resource_path('views/topics'), force: true);
577+
$this->files->put(resource_path('views/topics/index.antlers.html'), '');
578+
579+
$this->get('/topics/sneakers');
580+
581+
$data = (new Cascade)
582+
->with($siteDefaults->all())
583+
->get();
584+
585+
$breadcrumbs = collect($data['json_ld'])->first(fn ($snippet) => str_contains($snippet, 'BreadcrumbList'));
586+
$breadcrumbs = json_decode($breadcrumbs, true);
587+
588+
$this->assertEquals('BreadcrumbList', $breadcrumbs['@type']);
589+
$this->assertCount(3, $breadcrumbs['itemListElement']);
590+
591+
$this->assertEquals([
592+
'@type' => 'ListItem',
593+
'position' => 1,
594+
'name' => 'Home',
595+
'item' => 'http://cool-runnings.com',
596+
], $breadcrumbs['itemListElement'][0]);
597+
598+
$this->assertEquals([
599+
'@type' => 'ListItem',
600+
'position' => 2,
601+
'name' => 'Topics',
602+
'item' => 'http://cool-runnings.com/topics',
603+
], $breadcrumbs['itemListElement'][1]);
604+
605+
$this->assertEquals([
606+
'@type' => 'ListItem',
607+
'position' => 3,
608+
'name' => 'Sneakers',
609+
'item' => 'http://cool-runnings.com/topics/sneakers',
610+
], $breadcrumbs['itemListElement'][2]);
611+
}
525612
}

tests/Localized/CascadeTest.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,27 @@ public function it_generates_seo_cascade_for_canonical_url_and_handles_duplicate
6767
'it' => 'http://corse-fantastiche.it',
6868
], collect($data['alternate_locales'])->pluck('url', 'hreflang')->all());
6969
}
70+
71+
#[Test]
72+
public function it_generates_json_ld_breadcrumbs_for_entry_using_title_from_origin()
73+
{
74+
$siteDefaults = SiteDefaults::in('french')->set([
75+
'json_ld_breadcrumbs' => true,
76+
]);
77+
78+
$this->get('http://cool-runnings.com/fr/about');
79+
80+
$data = (new Cascade)
81+
->with($siteDefaults->all())
82+
->get();
83+
84+
$breadcrumbs = collect($data['json_ld'])->first(fn ($snippet) => str_contains($snippet, 'BreadcrumbList'));
85+
$breadcrumbs = json_decode($breadcrumbs, true);
86+
87+
$this->assertEquals('BreadcrumbList', $breadcrumbs['@type']);
88+
89+
$lastItem = end($breadcrumbs['itemListElement']);
90+
$this->assertEquals('About', $lastItem['name']);
91+
$this->assertEquals('http://cool-runnings.com/fr/about', $lastItem['item']);
92+
}
7093
}

0 commit comments

Comments
 (0)