1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace MeestorHok\Blue; |
4
|
|
|
|
5
|
|
|
use Artesaos\SEOTools\Facades\SEOTools as SEO; |
6
|
|
|
use Request; |
7
|
|
|
|
8
|
|
|
class SEOGenerator |
9
|
|
|
{ |
10
|
|
|
// DIR for icons |
11
|
|
|
const FAVICONS = '/img/icons'; |
12
|
|
|
|
13
|
|
|
public static function generateSEO (array $page) |
14
|
|
|
{ |
15
|
|
|
SEO::metatags() |
16
|
|
|
->setTitleDefault($page['title-description']) |
17
|
|
|
->setTitleSeparator($page['title-spacer']) |
18
|
|
|
->setTitle($page['title']) |
19
|
|
|
->setDescription($page['description']) |
20
|
|
|
->setCanonical(Request::url()) |
21
|
|
|
->addMeta('copyright', $page['copyright']) |
22
|
|
|
->addMeta('robots', $page['robots']) |
23
|
|
|
->addMeta('HandheldFriendly', 'True') |
24
|
|
|
->addMeta('MobileOptimized', '320') |
25
|
|
|
->addMeta('X-UA-Compatible', 'IE=edge', 'http-equiv') |
26
|
|
|
->addMeta('viewport', 'width=device-width, initial-scale=1, shrink-to-fit=no'); |
27
|
|
|
SEO::opengraph() |
28
|
|
|
->setTitle($page['title'] . $page['title-spacer'] . $page['title-description']) |
29
|
|
|
->setDescription($page['description']) |
30
|
|
|
->setUrl(Request::url()) |
31
|
|
|
->addProperty('locale', 'en_US') |
32
|
|
|
->addProperty('type', 'website'); |
33
|
|
|
SEO::twitter() |
34
|
|
|
->setSite($page['twitter']) |
35
|
|
|
->setTitle($page['title'] . $page['title-spacer'] . $page['title-description']) |
36
|
|
|
->setDescription($page['description']) |
37
|
|
|
->setType('summary') |
38
|
|
|
->setUrl(Request::url()); |
39
|
|
|
foreach ($page['images'] as $image) { |
40
|
|
|
SEO::opengraph()->addImage(asset($image['uri'])); |
41
|
|
|
SEO::twitter()->addImage(asset($image['uri'])); |
42
|
|
|
} |
43
|
|
|
foreach ($page['keywords'] as $keyword) { |
44
|
|
|
SEO::metatags()->addKeyword($keyword); |
45
|
|
|
} |
46
|
|
|
} |
47
|
|
|
|
48
|
|
|
public static function favicon () { |
49
|
|
|
$colors = [ |
50
|
|
|
'safari-pinned' => '#5bbad5', |
51
|
|
|
'ms-tile' => '#da532c', |
52
|
|
|
'theme' => '#ec500e' |
53
|
|
|
]; |
54
|
|
|
|
55
|
|
|
return |
56
|
|
|
'<link rel="apple-touch-icon" sizes="57x57" href="' . asset(self::FAVICONS . '/apple-touch-icon-57x57.png') . '">' . |
57
|
|
|
'<link rel="apple-touch-icon" sizes="60x60" href="' . asset(self::FAVICONS . '/apple-touch-icon-60x60.png') . '">' . |
58
|
|
|
'<link rel="apple-touch-icon" sizes="72x72" href="' . asset(self::FAVICONS . '/apple-touch-icon-72x72.png') . '">' . |
59
|
|
|
'<link rel="apple-touch-icon" sizes="76x76" href="' . asset(self::FAVICONS . '/apple-touch-icon-76x76.png') . '">' . |
60
|
|
|
'<link rel="apple-touch-icon" sizes="114x114" href="' . asset(self::FAVICONS . '/apple-touch-icon-114x114.png') . '">' . |
61
|
|
|
'<link rel="apple-touch-icon" sizes="120x120" href="' . asset(self::FAVICONS . '/apple-touch-icon-120x120.png') . '">' . |
62
|
|
|
'<link rel="apple-touch-icon" sizes="144x144" href="' . asset(self::FAVICONS . '/apple-touch-icon-144x144.png') . '">' . |
63
|
|
|
'<link rel="apple-touch-icon" sizes="152x152" href="' . asset(self::FAVICONS . '/apple-touch-icon-152x152.png') . '">' . |
64
|
|
|
'<link rel="apple-touch-icon" sizes="180x180" href="' . asset(self::FAVICONS . '/apple-touch-icon-180x180.png') . '">' . |
65
|
|
|
'<link rel="icon" type="image/png" href="' . asset(self::FAVICONS . '/favicon-16x16.png') . '" sizes="16x16">' . |
66
|
|
|
'<link rel="icon" type="image/png" href="' . asset(self::FAVICONS . '/favicon-32x32.png') . '" sizes="32x32">' . |
67
|
|
|
'<link rel="icon" type="image/png" href="' . asset(self::FAVICONS . '/favicon-96x96.png') . '" sizes="96x96">' . |
68
|
|
|
'<link rel="icon" type="image/png" href="' . asset(self::FAVICONS . '/favicon-194x194.png') . '" sizes="194x194">' . |
69
|
|
|
'<link rel="icon" type="image/png" href="' . asset(self::FAVICONS . '/android-chrome-192x192.png') . '" sizes="192x192">' . |
70
|
|
|
'<link rel="manifest" href="' . asset(self::FAVICONS . '/manifest.json') . '">' . |
71
|
|
|
'<link rel="mask-icon" href="' . asset(self::FAVICONS . '/safari-pinned-tab.svg') . '" color="' . $colors['safari-pinned'] . '">' . |
72
|
|
|
'<link rel="shortcut icon" href="' . asset(self::FAVICONS . '/favicon.ico') . '">' . |
73
|
|
|
'<meta name="msapplication-TileColor" content="' . $colors['ms-tile'] . '">' . |
74
|
|
|
'<meta name="msapplication-TileImage" content="' . asset(self::FAVICONS . '/mstile-144x144.png') . '">' . |
75
|
|
|
'<meta name="msapplication-config" content="' . asset(self::FAVICONS . '/browserconfig.xml') . '">' . |
76
|
|
|
'<meta name="theme-color" content="' . $colors['theme'] . '">'; |
77
|
|
|
} |
78
|
|
|
|
79
|
|
|
public static function make (array $details, $view = null) |
80
|
|
|
{ |
81
|
|
|
$defaults = [ |
82
|
|
|
'title' => 'Home', |
83
|
|
|
'title-spacer' => ' – ', |
84
|
|
|
'title-description' => 'Laravel Blue', |
85
|
|
|
'keywords' => array_collapse([['home'], ['laravel', 'blue', 'cms', 'meestorhok']]), |
86
|
|
|
'description' => 'This amazing site was created by Laravel Blue!', |
87
|
|
|
'images' => [], |
88
|
|
|
'twitter' => '@BlueCMS', |
89
|
|
|
'copyright' => '© 2016 Laravel Blue', |
90
|
|
|
'favicons' => '/img/icons', |
91
|
|
|
'robots' => 'index,follow' |
92
|
|
|
]; |
93
|
|
|
|
94
|
|
|
$data = array_replace($defaults, $details); |
95
|
|
|
|
96
|
|
|
self::generateSEO($data); |
97
|
|
|
|
98
|
|
|
if (!is_null($view)) { |
99
|
|
|
return view($view)->with('seo', self::get()); |
|
|
|
|
100
|
|
|
} |
101
|
|
|
} |
102
|
|
|
|
103
|
|
|
public static function get () |
104
|
|
|
{ |
105
|
|
|
return str_replace(PHP_EOL, '', SEO::generate()) . self::favicon(); |
106
|
|
|
} |
107
|
|
|
} |
It seems like the method you are trying to call exists only in some of the possible types.
Let’s take a look at an example:
Available Fixes
Add an additional type-check:
Only allow a single type to be passed if the variable comes from a parameter: