PHPackages                             ayudat/seolo - 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. ayudat/seolo

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

ayudat/seolo
============

SEO utilities

228PHP

Since Sep 29Pushed 8y agoCompare

[ Source](https://github.com/Ayudat/seolo)[ Packagist](https://packagist.org/packages/ayudat/seolo)[ RSS](/packages/ayudat-seolo/feed)WikiDiscussions master Synced 2d ago

READMEChangelogDependenciesVersions (1)Used By (0)

Seolo
=====

[](#seolo)

Utilidades SEO para proyectos Laravel 5.4 en adelante. Incluye:

- Editor de textos que se pinten usando el helper `t()`.
- Editor de texto alternativo de las imágenes a las que se les ponga la clase CSS `seolo`.
- Editor de etiquetas meta y title.
- Editor de días festivos.

### Añadir Seolo al proyecto

[](#añadir-seolo-al-proyecto)

Insertar la siguente línea en la sección **require** del **composer.json** del proyecto:

```
"ayudat/seolo": "master-dev"

```

Hacer un **composer update** y un **npm install**.

En el **composer.json** añadimos la línea `"Ayudat\\Seolo\\": "vendor/ayudat/seolo/src"`

```
"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/",
        "Ayudat\\Seolo\\": "vendor/ayudat/seolo/src"
    }
},

```

En **config/app.php** añadimos el service provider: `Ayudat\Seolo\SeoloServiceProvider::class`

Ejecutamos:

```
$ composer dump-autoload

```

### Assets y publicación

[](#assets-y-publicación)

En el **webpack.mix.js** añadimos, despúes de let mix = ...:

```
mix.options({
  processCssUrls: false // Do not process/optimize relative stylesheet url()'s, for asset_()
});

```

Si no vamos a usar Vue, comentamos en **resources/assets/js/app.js** todo menos la línea: **require('./bootstrap')**.

Quedaría, aproximadamente:

```
...

require('./bootstrap');

//window.Vue = require('vue');

...

//Vue.component('example', require('./components/Example.vue'));

//const app = new Vue({
//    el: '#app'
//});

```

Hacemos un **npm run dev** para generar los ficheros base CSS del proyecto, por si queremos usarlos en un backend o algo así.

Una vez hecho, en el **webpack.mix.js**, podemos comentar las líneas de mix que haya, **para que no se compilen más y supongan una pérdida de tiempo en cada "npm run dev"**, y añadimos al final:

```
mix.sass('resources/assets/sass/seolo.scss', 'public/css');

```

Seolo ya incluye el fichero \_variables.scss y el bootstrap, después de esta línea del mix, podemos añadir los scss de nuestro proyecto.

Ya podemos publicar y compilar, para obtener los ficheros y el CSS de Seolo *(esto conviene hacerlo cada vez que se haga un composer update, para asegurar los assets y demás)*:

```
$ php artisan vendor:publish --force --provider="Ayudat\Seolo\SeoloServiceProvider" && npm run dev

```

### Rutas

[](#rutas)

En routes/web.php, nombrar la ruta index **ya que el sistema de tags lo necesita**, ojo: **todas las rutas han de tener un "name" al que se asociarán sus datos SEO**.

```
Route::get('/', function () {
    return view('welcome');
})->name('index');

```

### Migraciones

[](#migraciones)

Tras **configurar la base de datos en el .env**, ejecutamos las migraciones, que crearán la tabla "seolo\_texts":

```
$ php artisan migrate:refresh --seed

```

En el caso de que suceda un error que contenga algo parecido a **"specified key was too long error"**, edita tu **AppServiceProvider.php** y añade:

```
use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

```

Y luego intenta ejecutar el *artisan* de nuevo.

### Autenticación

[](#autenticación)

Posibilitar el sistema de autenticación, para que se activen los añadidos de Seolo se necesita un usuario autenticado, en principio cualquiera, para más profundidad en permisos o usuarios que pueden "ver" Seolo, tendrás que modificarlo ;)

```
$ php artisan make:auth

```

Una vez hecho esto, **necesitas tener al menos un usuario en la base de datos**, crea un seed para poblar la tabla de usuarios con al menos uno, de tal manera que se pueda hacer login, en el manual de Laravel viene cómo hacerlo, en **Database &gt; Seeding**.

### Idioma

[](#idioma)

Los mensajes de Seolo vienen en inglés y español. Según el "locale" que se tenga definido en **config/app.php**

### Modificaciones en el layout

[](#modificaciones-en-el--layout)

En el del layout del proyecto, sustituir la etiqueta `title` por lo siguiente *(ojo con el og:image, es para cuando la web se comparte en Facebook, se ha de crear la imagen de 300x300, o quitar esa línea)*:

```

{{ tag($routeName, 'tab', config('app.name')) }}

```

Antes del :

Quizás aquí, tendrás que añadir el javascript del proyecto, que deberá incluir **jQuery**:

```

```

y ya luego:

```
@if (Illuminate\Support\Facades\Auth::user())

    @include('seolo::text')
    @include('seolo::tags')
    @include('seolo::alt')
    @include('seolo::festives')
@endif

```

### Anotaciones

[](#anotaciones)

Cualquier texto llamado con `t()` y que no tenga key en los ficheros de traducciones, Seolo intentará encontrarlo en la tabla `seolo_texts` de base de datos, si lo encuentra y se está logado, se hará editable. Si se usa t() con formato "blade", usa la forma: `{!! t('...') !!}`, para que el html que Seolo necesita se pinte correctamente.

A cualquier imagen con esta estructura se le podrá editar el `alt`:

```

```

Donde `seolo-alt.test` sería la key de esa imagen en la base de datos de Seolo, si la imagen tiene un ancla alrededor, su href se anulará para permitir la edición del alt de la imagen que contiene. Se pueden guardar textos alternativos vacíos, por si no se quiere utilizar el *alt* en alguna imagen.

La forma que adoptan los textos de las tags es, por ejemplo para la ruta "index": `seolo-tag.index.tab`, para la etiqueta 'title' `seolo-tag.index.title`, para el meta 'og:title' `seolo-tag.index.description`, para el meta 'description' y en el 'og:description'

En `seolo-festives` se guardará el texto de días festivos.

### Helpers

[](#helpers)

Seolo incluye unos helpers para operar con él, son:

`asset_($asset)`Devuelve la ruta a un asset (imagen, js, css), añadiéndole `?_=time al final`, donde 'time' es el timestamp de la fecha de modificación del asset, esto hace que cada vez que se modifica una imagen o un css, los navegadores clientes lo cacheen de nuevo. es **importante** saber que, si se mueve la carpeta 'public' del proyecto y no se encuentran bien los assets usando este helper, quizás haya que usar la variable de configuración 'seolo.public-path' para definir el directorio en donde está (el publish de Seolo genera un config/seolo.php).

`t($key, $amount = 1, $replace = [], $editable = true)`Funciona igual que 'trans\_choice', pero si no encuentra la $key en los ficheros de traducción del proyecto, busca en la tabla seolo\_texts, si está ahí, muestra el texto, y si se está logado, además permite editarlo.

`tag($routeName, $key, $default = '')`Devuelve el dato tag de una ruta que tenga 'name' (por ejemplo 'index'), $key puede valer \[tab|title|description\], normalmente es usada por Seolo en el bloque que se incluye en el `head` de un layout (visto en una sección anterior de este mismo documento).

`alt($key, $default = '')`Devuelve el texto alternativo de una imagen (visto su uso en una etiqueta `img` de ejemplo en una sección anterior de este mismo documento).

`inSchedule()`Devuelve verdadero si se está en horario laboral, falso si se está fuera de horario o en un día festivo. **Importante:** recuerda poner el timezone a "Europe/Madrid" en **config/app.php**

###  Health Score

22

—

LowBetter than 22% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity10

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity41

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 95% 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.

### Community

Maintainers

![](https://www.gravatar.com/avatar/2cc82199a9e841fd71eccfc200b5d3ab744a386fe17fb4578f2b64199e4d1989?d=identicon)[Ayudat](/maintainers/Ayudat)

---

Top Contributors

[![Ayudat](https://avatars.githubusercontent.com/u/31854553?v=4)](https://github.com/Ayudat "Ayudat (19 commits)")[![davilebp](https://avatars.githubusercontent.com/u/281518637?v=4)](https://github.com/davilebp "davilebp (1 commits)")

### Embed Badge

![Health badge](/badges/ayudat-seolo/health.svg)

```
[![Health](https://phpackages.com/badges/ayudat-seolo/health.svg)](https://phpackages.com/packages/ayudat-seolo)
```

###  Alternatives

[spatie/laravel-mailcoach-editor

An Editor editor package for Mailcoach

11247.6k1](/packages/spatie-laravel-mailcoach-editor)[temporal-php/support

Helpers that simplify working with the Temporal PHP SDK

1115.3k](/packages/temporal-php-support)

PHPackages © 2026

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