# SEO

Todo bom site web tenta se destacar e o Search Engine Optimization (otimização de mecanismos de busca) ou **SEO** para os íntimos é uma ferramenta muito útil nessa missão!

Com o Luna, fica fácil definir as tags de SEO e melhorar a indexação do site para os buscadores e também realizar personalização de informações nas redes sociais **Twitter** ou todas da empresa **Meta** (Facebook, Instagram e outras que utilizam o mesmo padrão):

```php
namespace App\Controllers\Product;

use \App\Utils\Seo;

class Product {
    public static function getProduct($request, $response) {
        // ...
        $seo = new Seo();
        $seo->setTitle("Produto nome");
        $seo->setDescription("Produto descrição");
        $seo->setKeywords(["produto-chave-1", "produto-chave-2"]);
        $seo->setImage("produto.png");
        $seo->setAuthor("Autor nome");
        $seoRender = $seo->render();
    }
}
```

{% hint style="info" %}
A função `$seo->setKeywords()` pode receber as chaves em array ou em string, como por exemplo: `$seo->setKeywords("chave-1, chave-2")`;
{% endhint %}

{% hint style="info" %}
Caso não utilize um título definido separadamente na renderização da view em `parent::getPage` utilize `$seo->render(true)` para que a tag `<title>` seja renderizada pelo SEO.
{% endhint %}

### Seo para Twitter e Meta OpenGraph

O exemplo acima define o SEO para as *meta tags* de título, descrição, chaves, imagem e autor, contudo é possível também definir SEOs para as redes sociais, como dito anteriormente:

```php
$seo = new Seo();
$seo->setTitle("Produto nome");
$seo->twitter()->setTitle("Produto nome (Twitter)");
$seo->meta()->setTitle("Produto nome (Meta)");
```

As funções `twitter()` e `meta()` permitem definir *meta tags* específicas, como:

```php
// Twitter
twitter()->setTitle($title);
twitter()->setDescription($description);
twitter()->setCard($card);
twitter()->setSite($site);
twitter()->setImage($image);
twitter()->setUrl($url);

// Meta
meta()->setTitle($title);
meta()->setDescription($description);
meta()->setUrl($url);
meta()->setImage($image);
meta()->setType($type);
```

Para que o SEO seja renderizado para o **Twitter** e **Meta** é necessário ao menos executar a função de inicialização:

```php
$seo->twitter();
$seo->meta();
$seo->setTitle("Produto nome")
// ...
```

Com o exemplo assim, o título será automáticamente definido também para o **Twitter** e **Meta**, não exigindo que seja necessário utilizar `$seo->meta()->setTitle()` ou `$seo->twitter()->setTitle()`.

{% hint style="info" %}
Caso utilize `$seo->twitter()` ou `$seo->meta()` após o uso de `$seo->setTitle()` e outros, as definições de título, descrição e imagem serão compartilhadas, para desativar essa função utilize `$seo->twitter(false)` ou `$seo->meta(false)` no primeiro uso de cada.
{% endhint %}

Também é possível inicializar a configuração do **Twitter** e **Meta** na inicialização da classe `Seo`:

```php
$seo = new Seo(['twitter', 'meta']);
```

{% hint style="info" %}
O exemplo acima é a melhor opção para ativar o SEO para o **Twitte** e **Meta**, diminuindo código e mantendo a funcionalidade.
{% endhint %}

Além de definir as redes sociais que serão utilizadas no SEO, é possível configura-las no arquivo `.env` em `DEFAULT_SEO` e carrega-las automaticamente com um simples `$seo = new Seo()`.

### Configurando Robots

Caso deseje que uma página não seja indexada ou que seus links não sejam seguidos utilize a função `$seo->setRobots()` definindo `true` ou `false` para cada um dos itens:

```php
$seo->setRobots($index, $follow); // TRUE é o valor padrão para ambos

// Página indexada e com links seguidos:
$seo->setRobots();

// Página não indexada:
$seo->setRobots(false);

// Página com links não seguidos:
$seo->setRobots(true, false);

// Página não indexada e links não seguidos:
$seo->setRobots(false, false);
```

{% hint style="info" %}
Por padrão a indexação utiliza links seguidos, então se for utilizar a função `$seo->setRobots()` sem passar nenhum parâmetro, ela se torna dispensável.
{% endhint %}

### Inserindo na renderização

O SEO deve ser adicionado na renderização da página (preferencialmente) ou da view:

```php
// Página
$content = parent::getPage("Produto Título", $content, [
    'seo' => $seoRender
]);

// View
$content = View::render('pages/product', ['seo' => $seoRender]);

// Página/View: <header>{{seo}}</header>
```
