PHPackages                             willis1776/seo-nova-field - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. willis1776/seo-nova-field

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

willis1776/seo-nova-field
=========================

A Laravel Nova field which adds all SEO related meta fields to an Resource.

v4.0.1(1y ago)232MITPHPPHP &gt;=7.3.0

Since Oct 1Pushed 1y agoCompare

[ Source](https://github.com/Willis1776/seo-field-nova)[ Packagist](https://packagist.org/packages/willis1776/seo-nova-field)[ Docs](https://github.com/willis1776/seo-field-nova)[ RSS](/packages/willis1776-seo-nova-field/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (8)Dependencies (1)Versions (48)Used By (0)

SEO meta field nova
===================

[](#seo-meta-field-nova)

This custom nova field, can add SEO related fields to any Model through a morph relationship within one single trait.

if you are upgrading from v1 please read the [upgrade guide](UPGRADING.md)
--------------------------------------------------------------------------

[](#if-you-are-upgrading-from-v1-please-read-the-upgrade-guide)

How to install
--------------

[](#how-to-install)

To install the package run the install below:

```
composer require willis1776/seo-meta-nova-field

```

And then publish the configs and migrations :

```
php artisan vendor:publish --provider="Willis1776\SeoMeta\FieldServiceProvider"

```

And then run the migrations:

```
php artisan migrate

```

How to use the field
--------------------

[](#how-to-use-the-field)

Find the model you want to have the SEO fields on, example could be `App\Models\Page`, then add the `SeoMetaTrait`trait:

```
...
use Willis1776\SeoMeta\Traits\SeoMetaTrait;

class Page extends Model
{
    use SeoMetaTrait;
    ...
}

```

Then use the field in the nova resource `App\Nova\Page`:

```
...
use Willis1776\SeoMeta\SeoMeta;

class Page extends Resource
{
  ...
  public function fields(Request $request)
  {
    return [
      ...,
      SeoMeta::make('SEO', 'seo_meta')
        ->disk('s3-public') //disk to store seo image, default is public
    ];
  }
}

```

Then go to the top of your layout blade as default it's `resources/views/welcome.blade.php`:

```
...

    @include('seo-meta::seo')
    ...

```

Where the `@include('seo-meta::seo', ['page' => $page])`, should have the model instance with the relation to the `SeoMetaTrait` trait.

If you dont have any selected model/resource on the current page, then get the given SEO data for the page like this:

```
use Willis1776\SeoMeta\Helper\Seo;
...
Route::get('/tester', function(){
    return view('page', [
        'seo' => Seo::renderAttributes('SEO title', 'SEO description', 'SEO keywords', 'SEO image', 'index, follow'), // Builds the seo array
    ]);
});

```

Here is how the `Seo::renderAttributes` static method looks like:

Localization
------------

[](#localization)

- **for localization just update the config file with the available locales and the fallback locale**

Setup default values for a model
--------------------------------

[](#setup-default-values-for-a-model)

If the SEO values should have the same structure every time, then you are able to set the up with the following methods in the trait:

```
    /**
     * REGISTERING THE DEFAULT VALUES IF EXISTS
     */
    public function registerDefaultValues(): void
    {

        // add default SEO title for the model
        $this->addTitleDefault(string $value = null, string $locale = null): void

        // add default SEO description for the model
        $this->addDescriptionDefault(string $value = null, string $locale = null): void

        // add default SEO keywords for the model
        $this->addKeywordsDefault(string $value = null, string $locale = null): void

        // add default SEO image for the model
        $this->addImageDefault(string $value = null): void

         // add default SEO follow for the model
        $this->addFollowDefault(string $value): void
    }

```

Setup Sitemap functionality
---------------------------

[](#setup-sitemap-functionality)

If you want the sitemap functionality then activate the sitemap by changing the `seo.sitemap_status` config to `true`. Then add the models which has the `SeoSitemapTrait` trait to the `seo.sitemap_models` array, like this:

```
    ...
    'sitemap_status' => env('SITEMAP_STATUS', true),

    ...
    'sitemap_models' => [
        App\Models\Page::class
    ],

```

### Add Sitemap trait to models

[](#add-sitemap-trait-to-models)

When you want the eloquent model to be shown in the sitemap then you need to add the `SeoSitemapTrait` trait to it:

```
...
use Willis1776\SeoMeta\Traits\SeoSitemapTrait;

class Page extends Model
{
    use SeoMetaTrait, SeoSitemapTrait;
    ...

    /**
     * Get the Page url by item
     *
     * @return string
     */
    public function getSitemapItemUrl()
    {
        return url($this->slug);
    }

    /**
     * Query all the Page items which should be
     * part of the sitemap (crawlable for google).
     *
     * @return Builder
     */
    public static function getSitemapItems()
    {
        return static::all();
    }
}

```

Know you should be able to go to the `seo.sitemap_path` which is `/sitemap` as default. Then you should get an xml in the correct sitemap structure for [Google Search Console](https://search.google.com/search-console/about).

How does it look in Laravel Nova
--------------------------------

[](#how-does-it-look-in-laravel-nova)

If the field is shown **in the index view** of the Resource, then you should see a column with a dot: [![alt text](/assets/images/seo-field-index.jpg)](/assets/images/seo-field-index.jpg)

**In detail view** you will see a text saying `You need some SEO data` if no SEO is setup yet. But if you have any then, you will get the toggle button, which will show you an example how it will look like on Google and on Facebook: [![alt text](/assets/images/seo-field-detail-hidden.jpg)](/assets/images/seo-field-detail-hidden.jpg)[![alt text](/assets/images/seo-field-detail-show.jpg)](/assets/images/seo-field-detail-show.jpg)

**In form view** you should see all the SEO input fields: [![alt text](/assets/images/seo-field-form.jpg)](/assets/images/seo-field-form.jpg)

###  Health Score

32

—

LowBetter than 72% of packages

Maintenance31

Infrequent updates — may be unmaintained

Popularity10

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity66

Established project with proven stability

 Bus Factor1

Top contributor holds 69.9% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~54 days

Recently: every ~198 days

Total

32

Last Release

723d ago

Major Versions

v1.2.0 → v2.0.02021-07-29

v2.1.7 → v3.0.02022-02-11

v3.0.5 → v4.0.02024-05-17

PHP version history (2 changes)1.0.0PHP &gt;=7.1.0

v4.0.0PHP &gt;=7.3.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/29473b8c720eb22cd2e144196df978c161250002e0bfe8135db793d983ce80ff?d=identicon)[Willis1776](/maintainers/Willis1776)

---

Top Contributors

[![AndreasGJ](https://avatars.githubusercontent.com/u/4068425?v=4)](https://github.com/AndreasGJ "AndreasGJ (51 commits)")[![Willis1776](https://avatars.githubusercontent.com/u/17579082?v=4)](https://github.com/Willis1776 "Willis1776 (10 commits)")[![ibrahem-kamal](https://avatars.githubusercontent.com/u/38753243?v=4)](https://github.com/ibrahem-kamal "ibrahem-kamal (9 commits)")[![semsphy](https://avatars.githubusercontent.com/u/423396?v=4)](https://github.com/semsphy "semsphy (2 commits)")[![marcorivm](https://avatars.githubusercontent.com/u/1222598?v=4)](https://github.com/marcorivm "marcorivm (1 commits)")

---

Tags

laravelnova

### Embed Badge

![Health badge](/badges/willis1776-seo-nova-field/health.svg)

```
[![Health](https://phpackages.com/badges/willis1776-seo-nova-field/health.svg)](https://phpackages.com/packages/willis1776-seo-nova-field)
```

###  Alternatives

[optimistdigital/nova-sortable

This Laravel Nova package allows you to reorder models in a Nova resource's index view using drag &amp; drop.

2872.1M6](/packages/optimistdigital-nova-sortable)[outl1ne/nova-sortable

This Laravel Nova package allows you to reorder models in a Nova resource's index view using drag &amp; drop.

2861.8M9](/packages/outl1ne-nova-sortable)[optimistdigital/nova-multiselect-field

A multiple select field for Laravel Nova.

3403.5M7](/packages/optimistdigital-nova-multiselect-field)[digital-creative/conditional-container

Provides an easy way to conditionally show and hide fields in your Nova resources.

116593.8k4](/packages/digital-creative-conditional-container)[sbine/route-viewer

A Laravel Nova tool to view your registered routes.

57215.9k](/packages/sbine-route-viewer)[markwalet/nova-modal-response

A Laravel Nova asset for Modal responses on an action.

14720.0k](/packages/markwalet-nova-modal-response)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
