1. Go to this page and download the library: Download ralphjsmit/laravel-seo library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
ralphjsmit / laravel-seo example snippets
$post = Post::find(1);
$post->seo->update([
'title' => 'My great post',
'description' => 'This great post will enhance your live.',
]);
class Post extends Model
{
use HasSEO;
public function getDynamicSEOData(): SEOData
{
$pathToFeaturedImageRelativeToPublicPath = // ..;
// Override only the properties you want:
return new SEOData(
title: $this->title,
description: $this->excerpt,
image: $pathToFeaturedImageRelativeToPublicPath,
);
}
}
return [
/**
* Use this setting to specify the site name that will be used in OpenGraph tags.
*/
'site_name' => null,
/**
* Use this setting to specify the path to the sitemap of your website. This exact path will outputted, so
* you can use both a hardcoded url and a relative path. We recommend the latter.
*
* Example: '/storage/sitemap.xml'
* Do not forget the slash at the start. This will tell the search engine that the path is relative
* to the root domain and not relative to the current URL. The `spatie/laravel-sitemap` package
* is a great package to generate sitemaps for your application.
*/
'sitemap' => null,
/**
* Use this setting to specify whether you want self-referencing `<link rel="canonical" href="$url">` tags to
* be added to the head of every page. There has been some debate whether this is a good practice, but experts
* from Google and Yoast say that this is the best strategy.
* See https://yoast.com/rel-canonical/.
*/
'canonical_link' => true,
'robots' => [
/**
* Use this setting to specify the default value of the robots meta tag. `<meta name="robots" content="noindex">`
* Overwrite it with the robots attribute of the SEOData object. `SEOData->robots = 'noindex, nofollow'`
* "max-snippet:-1" Use n chars (-1: Search engine chooses) as a search result snippet.
* "max-image-preview:large" Max size of a preview in search results.
* "max-video-preview:-1" Use max seconds (-1: There is no limit) as a video snippet in search results.
* See https://developers.google.com/search/docs/advanced/robots/robots_meta_tag
* Default: 'max-snippet:-1, max-image-preview:large, max-video-preview:-1'
*/
'default' => 'max-snippet:-1,max-image-preview:large,max-video-preview:-1',
/**
* Force set the robots `default` value and make it impossible to overwrite it. (e.g. via SEOData->robots)
* Use case: You need to set `noindex, nofollow` for the entire website without exception.
* Default: false
*/
'force_default' => false,
],
/**
* Use this setting to specify the path to the favicon for your website. The url to it will be generated using the `secure_url()` function,
* so make sure to make the favicon accessible from the `public` folder.
*
* You can use the following filetypes: ico, png, gif, jpeg, svg.
*/
'favicon' => null,
'title' => [
/**
* Use this setting to let the package automatically infer a title from the url, if no other title
* was given. This will be very useful on pages where you don't have an Eloquent model for, or where you
* don't want to hardcode the title.
*
* For example, if you have an url with the path '/foo/about-me', we'll automatically set the title to 'About me' and append the site suffix.
*/
'infer_title_from_url' => true,
/**
* Use this setting to provide a suffix that will be added after the title on each page.
* If you don't want a suffix, you should specify an empty string.
*/
'suffix' => '',
/**
* Use this setting to provide a custom title for the homepage. We will not use the suffix on the homepage,
* so you'll need to add the suffix manually if you want that. If set to null, we'll determine the title
* just like the other pages.
*/
'homepage_title' => null,
],
'description' => [
/**
* Use this setting to specify a fallback description, which will be used on places
* where we don't have a description set via an associated ->seo model or via
* the ->getDynamicSEOData() method.
*/
'fallback' => null,
],
'image' => [
/**
* Use this setting to specify a fallback image, which will be used on places where you
* don't have an image set via an associated ->seo model or via the ->getDynamicSEOData() method.
* This should be a path to an image. The url to the path is generated using the `secure_url()` function (`secure_url($yourProvidedPath)`).
*/
'fallback' => null,
],
'author' => [
/**
* Use this setting to specify a fallback author, which will be used on places where you
* don't have an author set via an associated ->seo model or via the ->getDynamicSEOData() method.
*/
'fallback' => null,
],
'twitter' => [
/**
* Use this setting to enter your username and
use RalphJSmit\Laravel\SEO\Support\HasSEO;
class Post extends Model
{
use HasSEO;
// ...
$post = Post::find(1);
$seo = $post->seo;
$post = Post::find(1);
$post->seo->update([
'title' => 'My title for the SEO tag',
'image' => 'images/posts/1.jpg', // Will point to `public_path('images/posts/1.jpg')`
]);
public function getDynamicSEOData(): SEOData
{
return new SEOData(
title: $this->title,
description: $this->excerpt,
author: $this->author->fullName,
alternates: [
new AlternateTag(
hreflang: 'en',
href: "https://example.com/en",
),
new AlternateTag(
hreflang: 'fr',
href: "https://example.com/fr",
),
],
);
}
use Illuminate\Contracts\View\View;
use RalphJSmit\Laravel\SEO\Support\SEOData;
class Homepage extends Controller
{
public function index(): View
{
return view('project.frontend.page.homepage.index', [
'SEOData' => new SEOData(
title: 'Awesome News - My Project',
description: 'Lorem Ipsum',
),
]);
}
}
use RalphJSmit\Laravel\SEO\SchemaCollection;
public function getDynamicSEOData(): SEOData
{
return new SEOData(
// ...
schema: SchemaCollection::make()
->add(fn (SEOData $SEOData) => [
// You could use the `$SEOData` to dynamically
// fetch any data about the current page.
'@context' => 'https://schema.org',
'@type' => 'FAQPage',
'mainEntity' => [
'@type' => 'Question',
'name' => 'Your question goes here',
'acceptedAnswer' => [
'@type' => 'Answer',
'text' => 'Your answer goes here',
],
],
]),
);
}
use RalphJSmit\Laravel\SEO\SchemaCollection;
public function getDynamicSEOData(): SEOData
{
return new SEOData(
// ...
schema: SchemaCollection::make()->addArticle(),
);
}
use RalphJSmit\Laravel\SEO\Schema\ArticleSchema;
use RalphJSmit\Laravel\SEO\SchemaCollection;
use RalphJSmit\Laravel\SEO\Support\SEOData;
use Illuminate\Support\Collection;
public function getDynamicSEOData(): SEOData
{
return new SEOData(
// ...
title: "A boring title"
schema: SchemaCollection::make()
->addArticle(function (ArticleSchema $article, SEOData $SEOData): ArticleSchema {
return $article->addAuthor($this->moderator);
}),
);
}
SchemaCollection::initialize()->addArticle(function (ArticleSchema $article, SEOData $SEOData): ArticleSchema {
return $article->markup(function (Collection $markup) use ($SEOData): Collection {
return $markup->put('alternativeHeadline', "Not {$SEOData->title}"); // Set/overwrite alternative headline property to `Will be "Not A boring title"` :)
});
});
SchemaCollection::initialize()
->addFaqPage(function (FaqPageSchema $faqPage, SEOData $SEOData): FaqPageSchema {
return $faqPage
->addQuestion(name: "Can this package add FaqPage to the schema?", acceptedAnswer: "Yes!")
->addQuestion(name: "Does it support multiple questions?", acceptedAnswer: "Of course.");
});
// In the `boot()` method of a service provider somewhere
use RalphJSmit\Laravel\SEO\Facades\SEOManager;
SEOManager::SEODataTransformer(function (SEOData $SEOData): SEOData {
// This will change the title on *EVERY* page. Do any logic you want here, e.g. based on the current request.
$SEOData->title = 'Transformed Title';
return $SEOData;
});