1
0
Fork 0
mirror of https://github.com/archtechx/laravel-seo.git synced 2025-12-12 18:04:03 +00:00

Merge branch 'archtechx:master' into with-url-origin

This commit is contained in:
Ben Bjurstrom 2024-11-22 20:56:26 -08:00 committed by GitHub
commit 85e5acb064
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 56 additions and 56 deletions

View file

@ -140,8 +140,8 @@ To add more tags to the document head, you can use the `tag()` and `rawTag()` me
```php ```php
seo()->tag('fb:image', asset('foo')); seo()->tag('fb:image', asset('foo'));
seo()->rawTag('<meta property="fb:url" content="bar" />'); seo()->rawTag('<meta property="fb:url" content="bar">');
seo()->rawTag('fb_url', '<meta property="fb:url" content="bar" />'); // Keyed, allows overrides later on seo()->rawTag('fb_url', '<meta property="fb:url" content="bar">'); // Keyed, allows overrides later on
``` ```
### Canonical URL ### Canonical URL

View file

@ -1,6 +1,6 @@
<meta name="twitter:card" content="summary_large_image"> <meta name="twitter:card" content="summary_large_image">
@if(seo('twitter.creator')) <meta name="twitter:creator" content="@seo('twitter.creator')" /> @endif @if(seo('twitter.creator')) <meta name="twitter:creator" content="@seo('twitter.creator')"> @endif
@if(seo('twitter.site')) <meta name="twitter:site" content="@seo('twitter.site')" /> @endif @if(seo('twitter.site')) <meta name="twitter:site" content="@seo('twitter.site')"> @endif
@if(seo('twitter.title')) <meta name="twitter:title" content="@seo('twitter.title')" /> @endif @if(seo('twitter.title')) <meta name="twitter:title" content="@seo('twitter.title')"> @endif
@if(seo('twitter.description')) <meta name="twitter:description" content="@seo('twitter.description')" /> @endif @if(seo('twitter.description')) <meta name="twitter:description" content="@seo('twitter.description')"> @endif
@if(seo('twitter.image')) <meta name="twitter:image" content="@seo('twitter.image')" /> @endif @if(seo('twitter.image')) <meta name="twitter:image" content="@seo('twitter.image')"> @endif

View file

@ -3,34 +3,34 @@
@unless(seo()->hasTag('og:title')) @unless(seo()->hasTag('og:title'))
{{-- If an og:title tag is provided directly, it's included in the @foreach below --}} {{-- If an og:title tag is provided directly, it's included in the @foreach below --}}
<meta property="og:title" content="@seo('title')" /> <meta property="og:title" content="@seo('title')">
@endunless @endunless
@endif @endif
@if(seo('description')) @if(seo('description'))
<meta property="og:description" content="@seo('description')" /> <meta property="og:description" content="@seo('description')">
<meta name="description" content="@seo('description')" /> <meta name="description" content="@seo('description')">
@endif @endif
@if(seo('keywords')) @if(seo('keywords'))
<meta name="keywords" content="@seo('keywords')" /> <meta name="keywords" content="@seo('keywords')">
@endif @endif
@if(seo('type')) @if(seo('type'))
<meta property="og:type" content="@seo('type')" /> <meta property="og:type" content="@seo('type')">
@else @else
<meta property="og:type" content="website" /> <meta property="og:type" content="website">
@endif @endif
@if(seo('site')) <meta property="og:site_name" content="@seo('site')" /> @endif @if(seo('site')) <meta property="og:site_name" content="@seo('site')"> @endif
@if(seo('locale')) <meta property="og:locale" content="@seo('locale')" /> @endif @if(seo('locale')) <meta property="og:locale" content="@seo('locale')"> @endif
@if(seo('image')) <meta property="og:image" content="@seo('image')" /> @endif @if(seo('image')) <meta property="og:image" content="@seo('image')"> @endif
@if(seo('url')) @if(seo('url'))
<meta property="og:url" content="@seo('url')" /> <meta property="og:url" content="@seo('url')">
<link rel="canonical" href="@seo('url')" /> <link rel="canonical" href="@seo('url')">
@endif @endif
@foreach(seo()->tags() as $tag) @foreach(seo()->tags() as $tag)

View file

@ -9,20 +9,20 @@ use Illuminate\Support\Arr;
use Illuminate\Support\Str; use Illuminate\Support\Str;
/** /**
* @method $this title(string $title = null, ...$args) Set the title. * @method $this title(?string $title = null, ...$args) Set the title.
* @method $this description(string $description = null, ...$args) Set the description. * @method $this description(?string $description = null, ...$args) Set the description.
* @method $this keywords(string $keywords = null, ...$args) Set the keywords. * @method $this keywords(?string $keywords = null, ...$args) Set the keywords.
* @method $this url(string $url = null, ...$args) Set the canonical URL. * @method $this url(?string $url = null, ...$args) Set the canonical URL.
* @method $this site(string $site = null, ...$args) Set the site name. * @method $this site(?string $site = null, ...$args) Set the site name.
* @method $this image(string $url = null, ...$args) Set the cover image. * @method $this image(?string $url = null, ...$args) Set the cover image.
* @method $this type(string $type = null, ...$args) Set the page type. * @method $this type(?string $type = null, ...$args) Set the page type.
* @method $this locale(string $locale = null, ...$args) Set the page locale. * @method $this locale(?string $locale = null, ...$args) Set the page locale.
* @method $this twitter(bool $enabled = true, ...$args) Enable the Twitter extension. * @method $this twitter(bool $enabled = true, ...$args) Enable the Twitter extension.
* @method $this twitterCreator(string $username = null, ...$args) Set the Twitter author. * @method $this twitterCreator(?string $username = null, ...$args) Set the Twitter author.
* @method $this twitterSite(string $username = null, ...$args) Set the Twitter author. * @method $this twitterSite(?string $username = null, ...$args) Set the Twitter author.
* @method $this twitterTitle(string $title = null, ...$args) Set the Twitter title. * @method $this twitterTitle(?string $title = null, ...$args) Set the Twitter title.
* @method $this twitterDescription(string $description = null, ...$args) Set the Twitter description. * @method $this twitterDescription(?string $description = null, ...$args) Set the Twitter description.
* @method $this twitterImage(string $url = null, ...$args) Set the Twitter cover image. * @method $this twitterImage(?string $url = null, ...$args) Set the Twitter cover image.
*/ */
class SEOManager class SEOManager
{ {
@ -135,7 +135,7 @@ class SEOManager
} }
/** Configure an extension. */ /** Configure an extension. */
public function extension(string $name, bool $enabled = true, string $view = null): static public function extension(string $name, bool $enabled = true, ?string $view = null): static
{ {
$this->extensions[$name] = $enabled; $this->extensions[$name] = $enabled;
@ -159,7 +159,7 @@ class SEOManager
} }
/** Configure or use Flipp. */ /** Configure or use Flipp. */
public function flipp(string $alias, string|array $data = null): string|static public function flipp(string $alias, string|array|null $data = null): string|static
{ {
if (is_string($data)) { if (is_string($data)) {
$this->meta("flipp.templates.$alias", $data); $this->meta("flipp.templates.$alias", $data);
@ -185,7 +185,7 @@ class SEOManager
} }
/** Configure or use Previewify. */ /** Configure or use Previewify. */
public function previewify(string $alias, int|string|array $data = null): string|static public function previewify(string $alias, int|string|array|null $data = null): string|static
{ {
if (is_string($data) || is_int($data)) { if (is_string($data) || is_int($data)) {
$this->meta("previewify.templates.$alias", (string) $data); $this->meta("previewify.templates.$alias", (string) $data);
@ -254,7 +254,7 @@ class SEOManager
} }
/** Add a head tag. */ /** Add a head tag. */
public function rawTag(string $key, string $tag = null): static public function rawTag(string $key, ?string $tag = null): static
{ {
$tag ??= $key; $tag ??= $key;
@ -268,7 +268,7 @@ class SEOManager
{ {
$content = e($content); $content = e($content);
$this->rawTag("meta.{$property}", "<meta property=\"{$property}\" content=\"{$content}\" />"); $this->rawTag("meta.{$property}", "<meta property=\"{$property}\" content=\"{$content}\">");
return $this; return $this;
} }
@ -279,7 +279,7 @@ class SEOManager
* @param string|array|null $value The value (if a single key is provided). * @param string|array|null $value The value (if a single key is provided).
* @return $this|string|null * @return $this|string|null
*/ */
public function meta(string|array $key, string|array $value = null): mixed public function meta(string|array $key, string|array|null $value = null): mixed
{ {
if (is_array($key)) { if (is_array($key)) {
/** @var array<string, string> $key */ /** @var array<string, string> $key */

View file

@ -5,7 +5,7 @@ declare(strict_types=1);
use ArchTech\SEO\SEOManager; use ArchTech\SEO\SEOManager;
if (! function_exists('seo')) { if (! function_exists('seo')) {
function seo(string|array $key = null): SEOManager|string|array|null function seo(string|array|null $key = null): SEOManager|string|array|null
{ {
if ($key === null) { if ($key === null) {
return app('seo'); return app('seo');

View file

@ -40,7 +40,7 @@ test('extensions can use custom blade paths', function () {
seo()->facebookTitle('abc'); seo()->facebookTitle('abc');
expect(meta())->toContain('<meta name="facebook:title" content="ABC" />'); expect(meta())->toContain('<meta name="facebook:title" content="ABC">');
}); });
test('twitter falls back to the default values', function () { test('twitter falls back to the default values', function () {
@ -56,7 +56,7 @@ test('twitter falls back to the default values', function () {
expect(seo('twitter.description'))->toBe('bar'); expect(seo('twitter.description'))->toBe('bar');
expect(seo('description'))->toBe('baz'); expect(seo('description'))->toBe('baz');
expect(meta())->toContain('<meta name="twitter:title" content="foo" />'); expect(meta())->toContain('<meta name="twitter:title" content="foo">');
}); });
test('extensions are automatically enabled when values for them are set', function () { test('extensions are automatically enabled when values for them are set', function () {

View file

@ -86,7 +86,7 @@ test('setting the defaults returns the manager instance', function () {
test('meta tags can be added to the template', function () { test('meta tags can be added to the template', function () {
seo()->tag('fb:image', 'foo'); seo()->tag('fb:image', 'foo');
expect(meta())->toContain('<meta property="fb:image" content="foo" />'); expect(meta())->toContain('<meta property="fb:image" content="foo">');
}); });
test('raw tags can be added to the template', function () { test('raw tags can be added to the template', function () {
@ -114,8 +114,8 @@ test('canonical url can be read from request', function () {
seo()->withUrl(); seo()->withUrl();
expect(meta()) expect(meta())
->toContain('<meta property="og:url" content="http://localhost" />') ->toContain('<meta property="og:url" content="http://localhost">')
->toContain('<link rel="canonical" href="http://localhost" />'); ->toContain('<link rel="canonical" href="http://localhost">');
}); });
test('canonical url accepts origin', function () { test('canonical url accepts origin', function () {
@ -134,8 +134,8 @@ test('canonical url can be changed', function () {
seo()->url('http://foo.com/bar'); seo()->url('http://foo.com/bar');
expect(meta()) expect(meta())
->toContain('<meta property="og:url" content="http://foo.com/bar" />') ->toContain('<meta property="og:url" content="http://foo.com/bar">')
->toContain('<link rel="canonical" href="http://foo.com/bar" />'); ->toContain('<link rel="canonical" href="http://foo.com/bar">');
}); });
test('og:title can be overridden using a tag', function () { test('og:title can be overridden using a tag', function () {
@ -144,16 +144,16 @@ test('og:title can be overridden using a tag', function () {
expect(meta()) expect(meta())
->toContain('<title>foo</title>') ->toContain('<title>foo</title>')
->toContain('<meta property="og:title" content="bar" />'); ->toContain('<meta property="og:title" content="bar">');
}); });
test('type can be overridden using the type method', function () { test('type can be overridden using the type method', function () {
expect(meta())->toContain('<meta property="og:type" content="website" />'); // default expect(meta())->toContain('<meta property="og:type" content="website">'); // default
seo()->type('foo'); seo()->type('foo');
expect(meta()) expect(meta())
->toContain('<meta property="og:type" content="foo" />') // overridden ->toContain('<meta property="og:type" content="foo">') // overridden
->not()->toContain('website'); ->not()->toContain('website');
}); });
@ -165,5 +165,5 @@ test('og:locale is not included by default', function () {
test('og:locale can be added to the template', function () { test('og:locale can be added to the template', function () {
seo()->locale('de_DE'); seo()->locale('de_DE');
expect(meta())->toContain('<meta property="og:locale" content="de_DE" />'); expect(meta())->toContain('<meta property="og:locale" content="de_DE">');
}); });

View file

@ -13,8 +13,8 @@ test('opengraph methods properly sanitize input', function (string $method, stri
expect($meta)->not()->toContain('content="Testing string " with several \' XSS characters </title> " . \' ."'); expect($meta)->not()->toContain('content="Testing string " with several \' XSS characters </title> " . \' ."');
expect($meta)->not()->toContain("content=\"{$unsanitizedContent}\""); expect($meta)->not()->toContain("content=\"{$unsanitizedContent}\"");
expect($meta)->toContain("<meta property=\"$property\" content=\"{$sanitizedContent}\" />"); expect($meta)->toContain("<meta property=\"$property\" content=\"{$sanitizedContent}\">");
expect($meta)->toContain("<meta property=\"$property\" content=\"Testing string &quot; with several &#039; XSS characters &lt;/title&gt; &quot; . &#039; .\" />"); expect($meta)->toContain("<meta property=\"$property\" content=\"Testing string &quot; with several &#039; XSS characters &lt;/title&gt; &quot; . &#039; .\">");
})->with([ })->with([
['site', 'og:site_name'], ['site', 'og:site_name'],
['url', 'og:url'], ['url', 'og:url'],
@ -37,8 +37,8 @@ test('the twitter extension properly sanitizes input', function (string $method,
expect($meta)->not()->toContain('content="Testing string " with several \' XSS characters </title> " . \' ."'); expect($meta)->not()->toContain('content="Testing string " with several \' XSS characters </title> " . \' ."');
expect($meta)->not()->toContain("content=\"{$unsanitizedContent}\""); expect($meta)->not()->toContain("content=\"{$unsanitizedContent}\"");
expect($meta)->toContain("<meta name=\"$property\" content=\"{$sanitizedContent}\" />"); expect($meta)->toContain("<meta name=\"$property\" content=\"{$sanitizedContent}\">");
expect($meta)->toContain("<meta name=\"$property\" content=\"Testing string &quot; with several &#039; XSS characters &lt;/title&gt; &quot; . &#039; .\" />"); expect($meta)->toContain("<meta name=\"$property\" content=\"Testing string &quot; with several &#039; XSS characters &lt;/title&gt; &quot; . &#039; .\">");
})->with([ })->with([
['twitterCreator', 'twitter:creator'], ['twitterCreator', 'twitter:creator'],
['twitterSite', 'twitter:site'], ['twitterSite', 'twitter:site'],
@ -65,8 +65,8 @@ test('the title method properly sanitizes both tags', function () {
expect($meta)->toContain("<title>{$sanitizedContent}</title>"); expect($meta)->toContain("<title>{$sanitizedContent}</title>");
expect($meta)->toContain("<title>Testing string &quot; with several &#039; XSS characters &lt;/title&gt; &quot; . &#039; .</title>"); expect($meta)->toContain("<title>Testing string &quot; with several &#039; XSS characters &lt;/title&gt; &quot; . &#039; .</title>");
expect($meta)->toContain("<meta property=\"og:title\" content=\"{$sanitizedContent}\" />"); expect($meta)->toContain("<meta property=\"og:title\" content=\"{$sanitizedContent}\">");
expect($meta)->toContain("<meta property=\"og:title\" content=\"Testing string &quot; with several &#039; XSS characters &lt;/title&gt; &quot; . &#039; .\" />"); expect($meta)->toContain("<meta property=\"og:title\" content=\"Testing string &quot; with several &#039; XSS characters &lt;/title&gt; &quot; . &#039; .\">");
}); });
test('seo blade directive calls are sanitized', function () { test('seo blade directive calls are sanitized', function () {

View file

@ -1 +1 @@
<meta name="facebook:title" content="{{ strtoupper(seo()->facebookTitle) }}" /> <meta name="facebook:title" content="{{ strtoupper(seo()->facebookTitle) }}">