{"id":577,"date":"2025-09-01T11:26:33","date_gmt":"2025-09-01T11:26:33","guid":{"rendered":"https:\/\/1v0.net\/blog\/?p=577"},"modified":"2025-09-05T11:34:57","modified_gmt":"2025-09-05T11:34:57","slug":"creating-json-ld-structured-data-in-laravel-for-seo","status":"publish","type":"post","link":"https:\/\/1v0.net\/blog\/creating-json-ld-structured-data-in-laravel-for-seo\/","title":{"rendered":"Creating JSON-LD Structured Data in Laravel for SEO"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"><strong>Creating JSON-LD Structured Data in Laravel for SEO<\/strong><\/h1>\n\n\n\n<p>JSON-LD (JavaScript Object Notation for Linked Data) is the recommended way to add structured data to web pages. By embedding JSON-LD in your Laravel app, you can help search engines understand your content and enable rich results like star ratings, breadcrumbs, and knowledge panels. This guide shows how to generate JSON-LD dynamically in Laravel using controllers, Blade templates, and admin fields.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Pass JSON-LD Data from Controller<\/strong><\/h2>\n\n\n\n<p>Each resource (posts, pages, products) can generate its own JSON-LD schema. In your controller, prepare an array and pass it to the view.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ app\/Http\/Controllers\/PostController.php<\/span>\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Models<\/span>\\<span class=\"hljs-title\">Post<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">PostController<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Controller<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">show<\/span><span class=\"hljs-params\">(Post $post)<\/span>\n    <\/span>{\n        $jsonLd = &#91;\n            <span class=\"hljs-string\">'@context'<\/span> =&gt; <span class=\"hljs-string\">'https:\/\/schema.org'<\/span>,\n            <span class=\"hljs-string\">'@type'<\/span> =&gt; <span class=\"hljs-string\">'BlogPosting'<\/span>,\n            <span class=\"hljs-string\">'headline'<\/span> =&gt; $post-&gt;title,\n            <span class=\"hljs-string\">'author'<\/span> =&gt; &#91;\n                <span class=\"hljs-string\">'@type'<\/span> =&gt; <span class=\"hljs-string\">'Person'<\/span>,\n                <span class=\"hljs-string\">'name'<\/span> =&gt; $post-&gt;author-&gt;name,\n            ],\n            <span class=\"hljs-string\">'datePublished'<\/span> =&gt; $post-&gt;created_at-&gt;toIso8601String(),\n            <span class=\"hljs-string\">'dateModified'<\/span> =&gt; $post-&gt;updated_at-&gt;toIso8601String(),\n            <span class=\"hljs-string\">'image'<\/span> =&gt; asset(<span class=\"hljs-string\">'storage\/'<\/span>.$post-&gt;cover_image),\n            <span class=\"hljs-string\">'mainEntityOfPage'<\/span> =&gt; &#91;\n                <span class=\"hljs-string\">'@type'<\/span> =&gt; <span class=\"hljs-string\">'WebPage'<\/span>,\n                <span class=\"hljs-string\">'@id'<\/span> =&gt; url(<span class=\"hljs-string\">'\/posts\/'<\/span>.$post-&gt;slug),\n            ],\n        ];\n\n        <span class=\"hljs-keyword\">return<\/span> view(<span class=\"hljs-string\">'posts.show'<\/span>, compact(<span class=\"hljs-string\">'post'<\/span>, <span class=\"hljs-string\">'jsonLd'<\/span>));\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The array follows the <code>BlogPosting<\/code> schema. You can customize types like <code>Product<\/code>, <code>Event<\/code>, or <code>FAQPage<\/code> depending on your content.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Render JSON-LD in Blade<\/strong><\/h2>\n\n\n\n<p>In your Blade template, encode the JSON-LD array and output it inside a <code>&lt;script type=&quot;application\/ld+json&quot;&gt;<\/code> tag in the head.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&lt;!-- resources\/views\/posts\/show.blade.php --&gt;\n@extends(<span class=\"hljs-string\">'layouts.app'<\/span>)\n\n@section(<span class=\"hljs-string\">'meta'<\/span>)\n  &lt;script type=<span class=\"hljs-string\">\"application\/ld+json\"<\/span>&gt;\n    {!! json_encode($jsonLd, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT) !!}\n  &lt;\/script&gt;\n@endsection\n\n@section(<span class=\"hljs-string\">'content'<\/span>)\n  &lt;h1&gt;{{ $post-&gt;title }}&lt;\/h1&gt;\n  &lt;p&gt;{{ $post-&gt;content }}&lt;\/p&gt;\n@endsection<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This ensures that each post page includes structured data that Google and other search engines can parse directly.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>UI Example: Admin Schema Fields<\/strong><\/h2>\n\n\n\n<p>Give editors the option to override or extend schema fields from the admin panel. Add inputs for schema type and additional properties:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&lt;form method=<span class=\"hljs-string\">\"POST\"<\/span> action=<span class=\"hljs-string\">\"{{ route('posts.store') }}\"<\/span>&gt;\n  @csrf\n\n  &lt;label&gt;Title&lt;\/label&gt;\n  &lt;input type=<span class=\"hljs-string\">\"text\"<\/span> name=<span class=\"hljs-string\">\"title\"<\/span>&gt;\n\n  &lt;label&gt;Meta Description&lt;\/label&gt;\n  &lt;textarea name=<span class=\"hljs-string\">\"meta_description\"<\/span>&gt;&lt;\/textarea&gt;\n\n  &lt;label&gt;Schema Type&lt;\/label&gt;\n  &lt;select name=<span class=\"hljs-string\">\"schema_type\"<\/span>&gt;\n    &lt;option value=<span class=\"hljs-string\">\"BlogPosting\"<\/span>&gt;BlogPosting&lt;\/option&gt;\n    &lt;option value=<span class=\"hljs-string\">\"Product\"<\/span>&gt;Product&lt;\/option&gt;\n    &lt;option value=<span class=\"hljs-string\">\"Event\"<\/span>&gt;Event&lt;\/option&gt;\n  &lt;\/select&gt;\n\n  &lt;label&gt;Schema Extra JSON&lt;\/label&gt;\n  &lt;textarea name=<span class=\"hljs-string\">\"schema_json\"<\/span> placeholder=<span class=\"hljs-string\">'{\"ratingValue\": \"5\"}'<\/span>&gt;&lt;\/textarea&gt;\n\n  &lt;button type=<span class=\"hljs-string\">\"submit\"<\/span>&gt;Save&lt;\/button&gt;\n&lt;\/form&gt;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>These values can be merged into the JSON-LD array when rendering. For example, if <code>schema_type<\/code> is <code>Product<\/code>, switch the <code>@type<\/code> accordingly.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Common JSON-LD Examples<\/strong><\/h2>\n\n\n\n<p>Here are a few useful schema patterns to include in your Laravel app:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"@context\"<\/span>: <span class=\"hljs-string\">\"https:\/\/schema.org\"<\/span>,\n  <span class=\"hljs-attr\">\"@type\"<\/span>: <span class=\"hljs-string\">\"Organization\"<\/span>,\n  <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"My Laravel Blog\"<\/span>,\n  <span class=\"hljs-attr\">\"url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/example.com\"<\/span>,\n  <span class=\"hljs-attr\">\"logo\"<\/span>: <span class=\"hljs-string\">\"https:\/\/example.com\/logo.png\"<\/span>,\n  <span class=\"hljs-attr\">\"sameAs\"<\/span>: &#91;\n    <span class=\"hljs-string\">\"https:\/\/twitter.com\/myblog\"<\/span>,\n    <span class=\"hljs-string\">\"https:\/\/www.linkedin.com\/company\/myblog\"<\/span>\n  ]\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Organization<\/strong> schema builds brand presence in search results.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"@context\"<\/span>: <span class=\"hljs-string\">\"https:\/\/schema.org\"<\/span>,\n  <span class=\"hljs-attr\">\"@type\"<\/span>: <span class=\"hljs-string\">\"BreadcrumbList\"<\/span>,\n  <span class=\"hljs-attr\">\"itemListElement\"<\/span>: &#91;\n    {\n      <span class=\"hljs-attr\">\"@type\"<\/span>: <span class=\"hljs-string\">\"ListItem\"<\/span>,\n      <span class=\"hljs-attr\">\"position\"<\/span>: <span class=\"hljs-number\">1<\/span>,\n      <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"Home\"<\/span>,\n      <span class=\"hljs-attr\">\"item\"<\/span>: <span class=\"hljs-string\">\"https:\/\/example.com\"<\/span>\n    },\n    {\n      <span class=\"hljs-attr\">\"@type\"<\/span>: <span class=\"hljs-string\">\"ListItem\"<\/span>,\n      <span class=\"hljs-attr\">\"position\"<\/span>: <span class=\"hljs-number\">2<\/span>,\n      <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"Blog\"<\/span>,\n      <span class=\"hljs-attr\">\"item\"<\/span>: <span class=\"hljs-string\">\"https:\/\/example.com\/blog\"<\/span>\n    },\n    {\n      <span class=\"hljs-attr\">\"@type\"<\/span>: <span class=\"hljs-string\">\"ListItem\"<\/span>,\n      <span class=\"hljs-attr\">\"position\"<\/span>: <span class=\"hljs-number\">3<\/span>,\n      <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"Laravel JSON-LD\"<\/span>,\n      <span class=\"hljs-attr\">\"item\"<\/span>: <span class=\"hljs-string\">\"https:\/\/example.com\/blog\/laravel-json-ld\"<\/span>\n    }\n  ]\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>BreadcrumbList<\/strong> schema enhances search results with breadcrumbs instead of long URLs.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Validate Your JSON-LD<\/strong><\/h2>\n\n\n\n<p>After adding JSON-LD, always test with <a href=\"https:\/\/search.google.com\/test\/rich-results\" target=\"_blank\" rel=\"noopener\">Google\u2019s Rich Results Test<\/a> or the <a href=\"https:\/\/validator.schema.org\/\" target=\"_blank\" rel=\"noopener\">Schema Markup Validator<\/a>. This ensures your structured data is valid and eligible for enhancements in search results.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wrapping Up<\/strong><\/h2>\n\n\n\n<p>Adding JSON-LD in Laravel improves SEO and unlocks rich search features. By passing schema arrays from controllers, rendering them in Blade, and giving editors admin UI controls, you make your structured data flexible and scalable. Combine common schemas like BlogPosting, Organization, and BreadcrumbList for maximum impact.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What\u2019s Next<\/strong><\/h2>\n\n\n\n<p>Keep enhancing your SEO stack with these guides:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"\/blog\/laravel-seo-guide-optimizing-meta-slugs-and-sitemaps\">Laravel SEO Guide: Optimizing Meta, Slugs, and Sitemaps<\/a><\/li>\n<li><a href=\"\/blog\/adding-meta-tags-and-open-graph-data-dynamically-in-laravel\">Adding Meta Tags and Open Graph Data Dynamically in Laravel<\/a><\/li>\n<li><a href=\"\/blog\/how-to-build-an-xml-sitemap-generator-in-laravel\">How to Build an XML Sitemap Generator in Laravel<\/a><\/li>\n<\/ul>\n\n","protected":false},"excerpt":{"rendered":"<p>Creating JSON-LD Structured Data in Laravel for SEO JSON-LD (JavaScript Object Notation for Linked Data) is the recommended way to add structured data to web pages. By embedding JSON-LD in your Laravel app, you can help search engines understand your content and enable rich results like star ratings, breadcrumbs, and knowledge panels. This guide shows [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":582,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[96,120,122,109,123],"class_list":["post-577","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","tag-blade","tag-json-ld","tag-schema","tag-seo","tag-structured-data"],"_links":{"self":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/577","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/comments?post=577"}],"version-history":[{"count":1,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/577\/revisions"}],"predecessor-version":[{"id":581,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/577\/revisions\/581"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/media\/582"}],"wp:attachment":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/media?parent=577"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/categories?post=577"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/tags?post=577"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}