# 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>
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://jjrdev.gitbook.io/luna/o-basico/seo.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
