[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-8524":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":21,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":38,"readmeContent":39,"aiSummary":40,"trendingCount":16,"starSnapshotCount":16,"syncStatus":41,"lastSyncTime":42,"discoverSource":43},8524,"seotools","artesaos\u002Fseotools","artesaos","SEO Tools for Laravel","",null,"PHP",3351,516,113,25,0,3,8,30.14,"MIT License",false,"master",[24,25,26,27,28,29,30,31,32,33,34,5,35,36,37],"facade","json-ld","laravel","lumen","meta-tags","opengraph","opengraph-tags","php","seo","seo-meta","seometa","twitter","webmaster","webmasters","2026-06-12 02:01:54","\u003Cp align=\"center\">\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fartesaos\" target=\"_blank\">\n        \u003Cimg src=\"https:\u002F\u002Favatars3.githubusercontent.com\u002Fu\u002F11164074\" height=\"100px\">\n    \u003C\u002Fa>\n    \u003Ch1 align=\"center\">SEOTools - SEO Tools for Laravel and Lumen\u003C\u002Fh1>\n    \u003Cbr>\n\u003C\u002Fp>\n\nSEOTools is a package for [Laravel 5.8+](https:\u002F\u002Flaravel.com\u002F) and [Lumen](https:\u002F\u002Flumen.laravel.com\u002F) that provides helpers for some common SEO techniques.\n\n> Current Build Status\n\n[![Build Status](https:\u002F\u002Ftravis-ci.org\u002Fartesaos\u002Fseotools.svg)](https:\u002F\u002Ftravis-ci.org\u002Fartesaos\u002Fseotools)\n[![Code Climate](https:\u002F\u002Fcodeclimate.com\u002Fgithub\u002Fartesaos\u002Fseotools\u002Fbadges\u002Fgpa.svg)](https:\u002F\u002Fcodeclimate.com\u002Fgithub\u002Fartesaos\u002Fseotools)\n\n> Statistics\n\n[![Latest Stable Version](https:\u002F\u002Fposer.pugx.org\u002Fartesaos\u002Fseotools\u002Fv\u002Fstable)](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fartesaos\u002Fseotools) [![Total Downloads](https:\u002F\u002Fposer.pugx.org\u002Fartesaos\u002Fseotools\u002Fdownloads)](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fartesaos\u002Fseotools) [![Latest Unstable Version](https:\u002F\u002Fposer.pugx.org\u002Fartesaos\u002Fseotools\u002Fv\u002Funstable)](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fartesaos\u002Fseotools) [![License](https:\u002F\u002Fposer.pugx.org\u002Fartesaos\u002Fseotools\u002Flicense)](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fartesaos\u002Fseotools)\n\nFor license information check the [LICENSE](LICENSE.md)-file.\n\nFeatures\n--------\n\n- Friendly simple interface\n- Easy of set titles and meta tags\n- Easy of set metas for [Twitter Cards](https:\u002F\u002Fdeveloper.twitter.com\u002Fen\u002Fdocs\u002Ftweets\u002Foptimize-with-cards\u002Foverview\u002Fabouts-cards) and [Open Graph](https:\u002F\u002Fogp.me\u002F)\n- Easy of set for [JSON Linked Data](https:\u002F\u002Fjson-ld.org\u002F)\n\nInstallation\n------------\n\n### 1 - Dependency\n\nThe first step is using composer to install the package and automatically update your `composer.json` file, you can do this by running:\n\n```shell\ncomposer require artesaos\u002Fseotools\n```\n\n> **Note**: If you are using Laravel 5.5, the steps 2 and 3, for providers and aliases, are unnecessaries. SEOTools supports Laravel new [Package Discovery](https:\u002F\u002Flaravel.com\u002Fdocs\u002F5.5\u002Fpackages#package-discovery).\n\n### 2 - Provider\n\nYou need to update your application configuration in order to register the package so it can be loaded by Laravel, just update your `config\u002Fapp.php` file adding the following code at the end of your `'providers'` section:\n\n> **Note**: If you are using Laravel 11+, you will have to update `bootstrap\u002Fproviders.php` instead. [Package Discovery](https:\u002F\u002Flaravel.com\u002Fdocs\u002F12.x\u002Fpackages#package-discovery).\n\n> `config\u002Fapp.php`\n\n```php\n\u003C?php\n\nreturn [\n    \u002F\u002F ...\n    'providers' => [\n        Artesaos\\SEOTools\\Providers\\SEOToolsServiceProvider::class,\n        \u002F\u002F ...\n    ],\n    \u002F\u002F ...\n];\n```\n\n#### Lumen\n\nGo to `\u002Fbootstrap\u002Fapp.php` file and add this line:\n\n```php\n\u003C?php\n\u002F\u002F ...\n\n$app = new Laravel\\Lumen\\Application(\n    dirname(__DIR__)\n);\n\n\u002F\u002F ...\n\n$app->register(Artesaos\\SEOTools\\Providers\\SEOToolsServiceProvider::class);\n\n\u002F\u002F ...\n\nreturn $app;\n```\n\n### 3 - Facades\n\n> Note: facades are not supported in Lumen.\n\nYou may get access to the SEO tool services using following facades:\n\n - `Artesaos\\SEOTools\\Facades\\SEOMeta`\n - `Artesaos\\SEOTools\\Facades\\OpenGraph`\n - `Artesaos\\SEOTools\\Facades\\TwitterCard`\n - `Artesaos\\SEOTools\\Facades\\JsonLd`\n - `Artesaos\\SEOTools\\Facades\\JsonLdMulti`\n - `Artesaos\\SEOTools\\Facades\\SEOTools`\n\nYou can setup a short-version aliases for these facades in your `config\u002Fapp.php` file. For example:\n\n```php\n\u003C?php\n\nreturn [\n    \u002F\u002F ...\n    'aliases' => [\n        'SEOMeta'       => Artesaos\\SEOTools\\Facades\\SEOMeta::class,\n        'OpenGraph'     => Artesaos\\SEOTools\\Facades\\OpenGraph::class,\n        'Twitter'       => Artesaos\\SEOTools\\Facades\\TwitterCard::class,\n        'JsonLd'        => Artesaos\\SEOTools\\Facades\\JsonLd::class,\n        'JsonLdMulti'   => Artesaos\\SEOTools\\Facades\\JsonLdMulti::class,\n        \u002F\u002F or\n        'SEO' => Artesaos\\SEOTools\\Facades\\SEOTools::class,\n        \u002F\u002F ...\n    ],\n    \u002F\u002F ...\n];\n```\n\n### 4 Configuration\n\n#### Publish config\n\nIn your terminal type\n\n```shell\nphp artisan vendor:publish\n```\n\nor\n\n```shell\nphp artisan vendor:publish --provider=\"Artesaos\\SEOTools\\Providers\\SEOToolsServiceProvider\"\n```\n\n> Lumen does not support this command, for it you should copy the file `src\u002Fresources\u002Fconfig\u002Fseotools.php` to `config\u002Fseotools.php` of your project\n\nIn `seotools.php` configuration file you can determine the properties of the default values and some behaviors.\n\n#### seotools.php\n\n- **meta**\n   - `defaults` - What values are displayed if not specified any value for the page display. If the value is `false`, nothing is displayed.\n   - `webmaster` - Are the settings of tags values for major webmaster tools. If you are `null` nothing is displayed.\n- **opengraph**\n   - `defaults` - Are the properties that will always be displayed and when no other value is set instead. **You can add additional tags** that are not included in the original configuration file.\n- **twitter**\n   - `defaults` - Are the properties that will always be displayed and when no other value is set instead. **You can add additional tags** that are not included in the original configuration file.\n- **json-ld**\n   - `defaults` - Are the properties that will always be displayed and when no other value is set instead. **You can add additional tags** that are not included in the original configuration file.\n\nUsage\n-----\n\n### Lumen Usage\n\n> Note: facades are not supported in Lumen.\n\n```php\n\u003C?php\n\n$seotools = app('seotools');\n$metatags = app('seotools.metatags');\n$twitter = app('seotools.twitter');\n$opengraph = app('seotools.opengraph');\n$jsonld = app('seotools.json-ld');\n$jsonldMulti = app('seotools.json-ld-multi');\n\n\u002F\u002F The behavior is the same as the facade\n\necho app('seotools')->generate();\n```\n\n### Meta tags Generator\n\nWith **SEOMeta** you can create meta tags to the `head`\n\n### Opengraph tags Generator\n\nWith **OpenGraph** you can create OpenGraph tags to the `head`\n\n### Twitter for Twitter Cards tags Generator\n\nWith **Twitter** you can create OpenGraph tags to the `head`\n\n#### In your controller\n\n```php\n\u003C?php\n\nnamespace App\\Http\\Controllers;\n\nuse Artesaos\\SEOTools\\Facades\\SEOMeta;\nuse Artesaos\\SEOTools\\Facades\\OpenGraph;\nuse Artesaos\\SEOTools\\Facades\\TwitterCard;\nuse Artesaos\\SEOTools\\Facades\\JsonLd;\n\u002F\u002F OR with multi\nuse Artesaos\\SEOTools\\Facades\\JsonLdMulti;\n\n\u002F\u002F OR\nuse Artesaos\\SEOTools\\Facades\\SEOTools;\n\nclass CommonController extends Controller\n{\n    public function index()\n    {\n        SEOMeta::setTitle('Home');\n        SEOMeta::setDescription('This is my page description');\n        SEOMeta::setCanonical('https:\u002F\u002Fcodecasts.com.br\u002Flesson');\n\n        OpenGraph::setDescription('This is my page description');\n        OpenGraph::setTitle('Home');\n        OpenGraph::setUrl('http:\u002F\u002Fcurrent.url.com');\n        OpenGraph::addProperty('type', 'articles');\n\n        TwitterCard::setTitle('Homepage');\n        TwitterCard::setSite('@LuizVinicius73');\n\n        JsonLd::setTitle('Homepage');\n        JsonLd::setDescription('This is my page description');\n        JsonLd::addImage('https:\u002F\u002Fcodecasts.com.br\u002Fimg\u002Flogo.jpg');\n\n        \u002F\u002F OR\n\n        SEOTools::setTitle('Home');\n        SEOTools::setDescription('This is my page description');\n        SEOTools::opengraph()->setUrl('http:\u002F\u002Fcurrent.url.com');\n        SEOTools::setCanonical('https:\u002F\u002Fcodecasts.com.br\u002Flesson');\n        SEOTools::opengraph()->addProperty('type', 'articles');\n        SEOTools::twitter()->setSite('@LuizVinicius73');\n        SEOTools::jsonLd()->addImage('https:\u002F\u002Fcodecasts.com.br\u002Fimg\u002Flogo.jpg');\n\n        $posts = Post::all();\n\n        return view('myindex', compact('posts'));\n    }\n\n    public function show($id)\n    {\n        $post = Post::find($id);\n\n        SEOMeta::setTitle($post->title);\n        SEOMeta::setDescription($post->resume);\n        SEOMeta::addMeta('article:published_time', $post->published_date->toW3CString(), 'property');\n        SEOMeta::addMeta('article:section', $post->category, 'property');\n        SEOMeta::addKeyword(['key1', 'key2', 'key3']);\n\n        OpenGraph::setDescription($post->resume);\n        OpenGraph::setTitle($post->title);\n        OpenGraph::setUrl('http:\u002F\u002Fcurrent.url.com');\n        OpenGraph::addProperty('type', 'article');\n        OpenGraph::addProperty('locale', 'pt-br');\n        OpenGraph::addProperty('locale:alternate', ['pt-pt', 'en-us']);\n\n        OpenGraph::addImage($post->cover->url);\n        OpenGraph::addImage($post->images->list('url'));\n        OpenGraph::addImage(['url' => 'http:\u002F\u002Fimage.url.com\u002Fcover.jpg', 'size' => 300]);\n        OpenGraph::addImage('http:\u002F\u002Fimage.url.com\u002Fcover.jpg', ['height' => 300, 'width' => 300]);\n\n        JsonLd::setTitle($post->title);\n        JsonLd::setDescription($post->resume);\n        JsonLd::setType('Article');\n        JsonLd::addImage($post->images->list('url'));\n\n        \u002F\u002F OR with multi\n\n        JsonLdMulti::setTitle($post->title);\n        JsonLdMulti::setDescription($post->resume);\n        JsonLdMulti::setType('Article');\n        JsonLdMulti::addImage($post->images->list('url'));\n        if(! JsonLdMulti::isEmpty()) {\n            JsonLdMulti::newJsonLd();\n            JsonLdMulti::setType('WebPage');\n            JsonLdMulti::setTitle('Page Article - '.$post->title);\n        }\n\n        \u002F\u002F Namespace URI: http:\u002F\u002Fogp.me\u002Fns\u002Farticle#\n        \u002F\u002F article\n        OpenGraph::setTitle('Article')\n            ->setDescription('Some Article')\n            ->setType('article')\n            ->setArticle([\n                'published_time' => 'datetime',\n                'modified_time' => 'datetime',\n                'expiration_time' => 'datetime',\n                'author' => 'profile \u002F array',\n                'section' => 'string',\n                'tag' => 'string \u002F array'\n            ]);\n\n        \u002F\u002F Namespace URI: http:\u002F\u002Fogp.me\u002Fns\u002Fbook#\n        \u002F\u002F book\n        OpenGraph::setTitle('Book')\n            ->setDescription('Some Book')\n            ->setType('book')\n            ->setBook([\n                'author' => 'profile \u002F array',\n                'isbn' => 'string',\n                'release_date' => 'datetime',\n                'tag' => 'string \u002F array'\n            ]);\n\n        \u002F\u002F Namespace URI: http:\u002F\u002Fogp.me\u002Fns\u002Fprofile#\n        \u002F\u002F profile\n        OpenGraph::setTitle('Profile')\n             ->setDescription('Some Person')\n            ->setType('profile')\n            ->setProfile([\n                'first_name' => 'string',\n                'last_name' => 'string',\n                'username' => 'string',\n                'gender' => 'enum(male, female)'\n            ]);\n\n        \u002F\u002F Namespace URI: http:\u002F\u002Fogp.me\u002Fns\u002Fmusic#\n        \u002F\u002F music.song\n        OpenGraph::setType('music.song')\n            ->setMusicSong([\n                'duration' => 'integer',\n                'album' => 'array',\n                'album:disc' => 'integer',\n                'album:track' => 'integer',\n                'musician' => 'array'\n            ]);\n\n        \u002F\u002F music.album\n        OpenGraph::setType('music.album')\n            ->setMusicAlbum([\n                'song' => 'music.song',\n                'song:disc' => 'integer',\n                'song:track' => 'integer',\n                'musician' => 'profile',\n                'release_date' => 'datetime'\n            ]);\n\n         \u002F\u002Fmusic.playlist\n        OpenGraph::setType('music.playlist')\n            ->setMusicPlaylist([\n                'song' => 'music.song',\n                'song:disc' => 'integer',\n                'song:track' => 'integer',\n                'creator' => 'profile'\n            ]);\n\n        \u002F\u002F music.radio_station\n        OpenGraph::setType('music.radio_station')\n            ->setMusicRadioStation([\n                'creator' => 'profile'\n            ]);\n\n        \u002F\u002F Namespace URI: http:\u002F\u002Fogp.me\u002Fns\u002Fvideo#\n        \u002F\u002F video.movie\n        OpenGraph::setType('video.movie')\n            ->setVideoMovie([\n                'actor' => 'profile \u002F array',\n                'actor:role' => 'string',\n                'director' => 'profile \u002Farray',\n                'writer' => 'profile \u002F array',\n                'duration' => 'integer',\n                'release_date' => 'datetime',\n                'tag' => 'string \u002F array'\n            ]);\n\n        \u002F\u002F video.episode\n        OpenGraph::setType('video.episode')\n            ->setVideoEpisode([\n                'actor' => 'profile \u002F array',\n                'actor:role' => 'string',\n                'director' => 'profile \u002Farray',\n                'writer' => 'profile \u002F array',\n                'duration' => 'integer',\n                'release_date' => 'datetime',\n                'tag' => 'string \u002F array',\n                'series' => 'video.tv_show'\n            ]);\n\n        \u002F\u002F video.tv_show\n        OpenGraph::setType('video.tv_show')\n            ->setVideoTVShow([\n                'actor' => 'profile \u002F array',\n                'actor:role' => 'string',\n                'director' => 'profile \u002Farray',\n                'writer' => 'profile \u002F array',\n                'duration' => 'integer',\n                'release_date' => 'datetime',\n                'tag' => 'string \u002F array'\n            ]);\n\n        \u002F\u002F video.other\n        OpenGraph::setType('video.other')\n            ->setVideoOther([\n                'actor' => 'profile \u002F array',\n                'actor:role' => 'string',\n                'director' => 'profile \u002Farray',\n                'writer' => 'profile \u002F array',\n                'duration' => 'integer',\n                'release_date' => 'datetime',\n                'tag' => 'string \u002F array'\n            ]);\n\n        \u002F\u002F og:video\n        OpenGraph::addVideo('http:\u002F\u002Fexample.com\u002Fmovie.swf', [\n                'secure_url' => 'https:\u002F\u002Fexample.com\u002Fmovie.swf',\n                'type' => 'application\u002Fx-shockwave-flash',\n                'width' => 400,\n                'height' => 300\n            ]);\n\n        \u002F\u002F og:audio\n        OpenGraph::addAudio('http:\u002F\u002Fexample.com\u002Fsound.mp3', [\n                'secure_url' => 'https:\u002F\u002Fsecure.example.com\u002Fsound.mp3',\n                'type' => 'audio\u002Fmpeg'\n            ]);\n\n        \u002F\u002F og:place\n        OpenGraph::setTitle('Place')\n             ->setDescription('Some Place')\n            ->setType('place')\n            ->setPlace([\n                'location:latitude' => 'float',\n                'location:longitude' => 'float',\n            ]);\n\n        return view('myshow', compact('post'));\n    }\n}\n```\n\n#### SEOTrait\n\n```php\n\u003C?php\n\nnamespace App\\Http\\Controllers;\n\nuse Artesaos\\SEOTools\\Traits\\SEOTools as SEOToolsTrait;\n\nclass CommonController extends Controller\n{\n    use SEOToolsTrait;\n\n    public function index()\n    {\n        $this->seo()->setTitle('Home');\n        $this->seo()->setDescription('This is my page description');\n        $this->seo()->opengraph()->setUrl('http:\u002F\u002Fcurrent.url.com');\n        $this->seo()->opengraph()->addProperty('type', 'articles');\n        $this->seo()->twitter()->setSite('@LuizVinicius73');\n        $this->seo()->jsonLd()->setType('Article');\n\n        $posts = Post::all();\n\n        return view('myindex', compact('posts'));\n    }\n}\n```\n\n### In Your View\n\n> **Pro Tip**: Pass the parameter `true` to get minified code and reduce filesize.\n\n```html\n\u003Chtml>\n\u003Chead>\n    {!! SEOMeta::generate() !!}\n    {!! OpenGraph::generate() !!}\n    {!! Twitter::generate() !!}\n    {!! JsonLd::generate() !!}\n    \u002F\u002F OR with multi\n    {!! JsonLdMulti::generate() !!}\n\n    \u003C!-- OR -->\n    {!! SEO::generate() !!}\n\n    \u003C!-- MINIFIED -->\n    {!! SEO::generate(true) !!}\n\n    \u003C!-- LUMEN -->\n    {!! app('seotools')->generate() !!}\n\u003C\u002Fhead>\n\u003Cbody>\n\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\n```html\n\u003Chtml>\n\u003Chead>\n    \u003Ctitle>Title - Over 9000 Thousand!\u003C\u002Ftitle>\n    \u003Cmeta name='description' itemprop='description' content='description...'>\n    \u003Cmeta name='keywords' content='key1, key2, key3'>\n    \u003Cmeta property='article:published_time' content='2015-01-31T20:30:11-02:00'>\n    \u003Cmeta property='article:section' content='news'>\n\n    \u003Cmeta property=\"og:description\" content=\"description...\">\n    \u003Cmeta property=\"og:title\" content=\"Title\">\n    \u003Cmeta property=\"og:url\" content=\"http:\u002F\u002Fcurrent.url.com\">\n    \u003Cmeta property=\"og:type\" content=\"article\">\n    \u003Cmeta property=\"og:locale\" content=\"pt-br\">\n    \u003Cmeta property=\"og:locale:alternate\" content=\"pt-pt\">\n    \u003Cmeta property=\"og:locale:alternate\" content=\"en-us\">\n    \u003Cmeta property=\"og:site_name\" content=\"name\">\n    \u003Cmeta property=\"og:image\" content=\"http:\u002F\u002Fimage.url.com\u002Fcover.jpg\">\n    \u003Cmeta property=\"og:image\" content=\"http:\u002F\u002Fimage.url.com\u002Fimg1.jpg\">\n    \u003Cmeta property=\"og:image\" content=\"http:\u002F\u002Fimage.url.com\u002Fimg2.jpg\">\n    \u003Cmeta property=\"og:image\" content=\"http:\u002F\u002Fimage.url.com\u002Fimg3.jpg\">\n    \u003Cmeta property=\"og:image:url\" content=\"http:\u002F\u002Fimage.url.com\u002Fcover.jpg\">\n    \u003Cmeta property=\"og:image:size\" content=\"300\">\n\n    \u003Cmeta name=\"twitter:card\"content=\"summary\">\n    \u003Cmeta name=\"twitter:title\"content=\"Title\">\n    \u003Cmeta name=\"twitter:site\"content=\"@LuizVinicius73\">\n\n    \u003Cscript type=\"application\u002Fld+json\">{\"@context\":\"https:\u002F\u002Fschema.org\",\"@type\":\"Article\",\"name\":\"Title - Over 9000 Thousand!\"}\u003C\u002Fscript>\n    \u003C!-- OR with multi -->\n    \u003Cscript type=\"application\u002Fld+json\">{\"@context\":\"https:\u002F\u002Fschema.org\",\"@type\":\"Article\",\"name\":\"Title - Over 9000 Thousand!\"}\u003C\u002Fscript>\n    \u003Cscript type=\"application\u002Fld+json\">{\"@context\":\"https:\u002F\u002Fschema.org\",\"@type\":\"WebPage\",\"name\":\"Title - Over 9000 Thousand!\"}\u003C\u002Fscript>\n\u003C\u002Fhead>\n\u003Cbody>\n\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\n#### Using Macro\nUsing the same code in multiple places can be tedious, which is why this package includes a Macroable trait. This trait allows additional functionality to be added to a class that was not defined in the class definition, using a simple trait.\n\nFor example, imagine that you need to add meta titles and descriptions for your pages. You can add your Macroable functions in the AppServiceProvider or create a dedicated file for this purpose, and define your function as shown in the code snippet:\n```php\n    SEOTools::macro('webPage', function (string $title, string $description) {\n        SEOMeta::setTitle($title);\n        SEOMeta::setDescription($description);\n        SEOMeta::setCanonical('http:\u002F\u002Fcurrent.url.com');\n        OpenGraph::setDescription($description);\n        OpenGraph::setTitle($title);\n        OpenGraph::setUrl('http:\u002F\u002Fcurrent.url.com');\n        OpenGraph::addProperty('type', 'webpage');\n    });\n```\n\nIn your controller, you can use the following code to utilize the function:\n```php\n    SEOTools::webPage('Page title', 'Page description');\n```\n\n#### API (SEOMeta)\n\n```php\n\u003C?php\n\nuse Artesaos\\SEOTools\\Facades\\SEOMeta;\n\nSEOMeta::addKeyword($keyword);\nSEOMeta::addMeta($meta, $value = null, $name = 'name');\nSEOMeta::addAlternateLanguage($lang, $url);\nSEOMeta::addAlternateLanguages(array $languages);\nSEOMeta::setAlternateLanguage($lang, $url);\nSEOMeta::setAlternateLanguages(array $languages);\nSEOMeta::setTitleSeparator($separator);\nSEOMeta::setTitle($title);\nSEOMeta::setTitleDefault($default);\nSEOMeta::setDescription($description);\nSEOMeta::setKeywords($keywords);\nSEOMeta::setRobots($robots);\nSEOMeta::setCanonical($url);\nSEOMeta::setPrev($url);\nSEOMeta::setNext($url);\nSEOMeta::removeMeta($key);\n\n\u002F\u002F You can chain methods\nSEOMeta::setTitle($title)\n            ->setDescription($description)\n            ->setKeywords($keywords)\n            ->addKeyword($keyword)\n            ->addMeta($meta, $value);\n\n\u002F\u002F Retrieving data\nSEOMeta::getTitle();\nSEOMeta::getTitleSession();\nSEOMeta::getTitleSeparator();\nSEOMeta::getKeywords();\nSEOMeta::getDescription();\nSEOMeta::getCanonical($url);\nSEOMeta::getPrev($url);\nSEOMeta::getNext($url);\nSEOMeta::getRobots();\nSEOMeta::reset();\n\nSEOMeta::generate();\n```\n\n#### API (OpenGraph)\n\n```php\n\u003C?php\n\nuse Artesaos\\SEOTools\\Facades\\OpenGraph;\n\nOpenGraph::addProperty($key, $value); \u002F\u002F value can be string or array\nOpenGraph::addImage($url); \u002F\u002F add image url\nOpenGraph::addImages($url); \u002F\u002F add an array of url images\nOpenGraph::setTitle($title); \u002F\u002F define title\nOpenGraph::setDescription($description);  \u002F\u002F define description\nOpenGraph::setUrl($url); \u002F\u002F define url\nOpenGraph::setSiteName($name); \u002F\u002Fdefine site_name\n\n\u002F\u002F You can chain methods\nOpenGraph::addProperty($key, $value)\n            ->addImage($url)\n            ->addImages($url)\n            ->setTitle($title)\n            ->setDescription($description)\n            ->setUrl($url)\n            ->setSiteName($name);\n\n\u002F\u002F Generate html tags\nOpenGraph::generate();\n```\n\n### API (TwitterCard)\n\n```php\n\u003C?php\n\nuse Artesaos\\SEOTools\\Facades\\TwitterCard;\n\nTwitterCard::addValue($key, $value); \u002F\u002F value can be string or array\nTwitterCard::setType($type); \u002F\u002F type of twitter card tag\nTwitterCard::setTitle($type); \u002F\u002F title of twitter card tag\nTwitterCard::setSite($type); \u002F\u002F site of twitter card tag\nTwitterCard::setDescription($type); \u002F\u002F description of twitter card tag\nTwitterCard::setUrl($type); \u002F\u002F url of twitter card tag\nTwitterCard::setImage($url); \u002F\u002F add image url\n\n\u002F\u002F You can chain methods\nTwitterCard::addValue($key, $value)\n            ->setType($type)\n            ->setImage($url)\n            ->setTitle($title)\n            ->setDescription($description)\n            ->setUrl($url)\n            ->setSite($name);\n\n\u002F\u002F Generate html tags\nTwitterCard::generate();\n```\n\n### API (JsonLd)\n\n```php\n\u003C?php\n\nuse Artesaos\\SEOTools\\Facades\\JsonLd;\n\nJsonLd::addValue($key, $value); \u002F\u002F value can be string or array\nJsonLd::setType($type); \u002F\u002F type of twitter card tag\nJsonLd::setTitle($type); \u002F\u002F title of twitter card tag\nJsonLd::setSite($type); \u002F\u002F site of twitter card tag\nJsonLd::setDescription($type); \u002F\u002F description of twitter card tag\nJsonLd::setUrl($type); \u002F\u002F url of twitter card tag\nJsonLd::setImage($url); \u002F\u002F add image url\n\n\u002F\u002F You can chain methods\nJsonLd::addValue($key, $value)\n    ->setType($type)\n    ->setImage($url)\n    ->setTitle($title)\n    ->setDescription($description)\n    ->setUrl($url)\n    ->setSite($name);\n\n\u002F\u002F Generate html tags\nJsonLd::generate();\n```\n\n### API (JsonLdMulti)\n\n```php\n\u003C?php\n\nuse Artesaos\\SEOTools\\Facades\\JsonLdMulti;\n\nJsonLdMulti::newJsonLd(); \u002F\u002F create a new JsonLd group\nJsonLdMulti::isEmpty(); \u002F\u002F check if the current JsonLd group is empty\nJsonLdMulti::select($index); \u002F\u002F choose the JsonLd group that will be edited by the methods below\nJsonLdMulti::addValue($key, $value); \u002F\u002F value can be string or array\nJsonLdMulti::setType($type); \u002F\u002F type of twitter card tag\nJsonLdMulti::setTitle($type); \u002F\u002F title of twitter card tag\nJsonLdMulti::setSite($type); \u002F\u002F site of twitter card tag\nJsonLdMulti::setDescription($type); \u002F\u002F description of twitter card tag\nJsonLdMulti::setUrl($type); \u002F\u002F url of twitter card tag\nJsonLdMulti::setImage($url); \u002F\u002F add image url\n\n\u002F\u002F You can chain methods\nJsonLdMulti::addValue($key, $value)\n    ->setType($type)\n    ->setImage($url)\n    ->setTitle($title)\n    ->setDescription($description)\n    ->setUrl($url)\n    ->setSite($name);\n\u002F\u002F You can add an other group\nif(! JsonLdMulti::isEmpty()) {\n    JsonLdMulti::newJsonLd()\n        ->setType($type)\n        ->setImage($url)\n        ->setTitle($title)\n        ->setDescription($description)\n        ->setUrl($url)\n        ->setSite($name);\n}\n\u002F\u002F Generate html tags\nJsonLdMulti::generate();\n\u002F\u002F You will have retrieve \u003Cscript content=\"application\u002Fld+json\"\u002F>\n```\n\n#### API (SEO)\n\n> Facilitates access to all the SEO Providers\n\n```php\n\u003C?php\n\nuse Artesaos\\SEOTools\\Facades\\SEOTools;\n\nSEOTools::metatags();\nSEOTools::twitter();\nSEOTools::opengraph();\nSEOTools::jsonLd();\n\nSEOTools::setTitle($title);\nSEOTools::getTitle($session = false);\nSEOTools::setDescription($description);\nSEOTools::setCanonical($url);\nSEOTools::addImages($urls);\n```\n\nMissing Features\n----------------\n\nThere are many SEO-related features, which you may need for your project. While this package provides support for the basic ones,\nother are out of its scope. You'll have to use separate packages for their integration.\n\n### SiteMap\n\nThis package does not support sitemap files generation. Please consider usage one of the following packages for it:\n\n- [laravelium\u002Fsitemap](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Flaravelium\u002Fsitemap)\n\n- [spatie\u002Flaravel-sitemap](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fspatie\u002Flaravel-sitemap)\n\n### URL Trailing Slash\n\nThis package does not handle URL consistency regardless absence or presence of the slash symbol at its end.\nPlease consider usage one of the following packages if you need it:\n\n- [illuminatech\u002Furl-trailing-slash](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Filluminatech\u002Furl-trailing-slash)\n\n- [fsasvari\u002Flaravel-trailing-slash](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Ffsasvari\u002Flaravel-trailing-slash)\n\n### Microdata Markup\n\nThis package does provide generation of the [microdata HTML markup](https:\u002F\u002Fwww.w3.org\u002FTR\u002Fmicrodata\u002F). If you need to create HTML like the following one:\n\n```html\n\u003Cdiv itemscope>\n \u003Cp>My name is\n  \u003Cspan itemprop=\"name\">Elizabeth\u003C\u002Fspan>.\u003C\u002Fp>\n\u003C\u002Fdiv>\n```\n\nyou will need to handle it yourself.\n\n> Note: nowadays microdata markup is considered to be outdated. It is recommened to use [JSON Linked Data](https:\u002F\u002Fjson-ld.org\u002F) instead,\n  which is supported by this extension.\n\n### RSS\n\nThis package does not support RSS feed generation or related meta data composition. Please consider usage one of the following packages for it:\n\n- [spatie\u002Flaravel-feed](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fspatie\u002Flaravel-feed)\n","SEOTools 是一个专为 Laravel 和 Lumen 设计的 SEO 工具包，旨在简化常见的 SEO 技术实现。它提供了友好的用户界面以及简便的方法来设置网页标题和元标签、Twitter Cards 和 Open Graph 元数据以及 JSON Linked Data。此工具包支持 PHP 语言编写，并且遵循 MIT 许可证开放源代码。适用于需要优化网站搜索引擎表现的各种 Web 开发场景，特别是基于 Laravel 框架构建的应用程序，能够帮助开发者轻松地集成 SEO 最佳实践，提升网站在搜索结果中的排名。",2,"2026-06-11 03:18:26","top_language"]