Это моя текущая реализация тегов Open Graph с использованием Laravel 5:
app.blade.php
<title>@yield('title')</title>
<meta property="og:title" content="@yield('og-title', 'DEFAULT PAGE TITLE')">
<meta property="og:image" content="@yield('og-image', 'default.png')">
<meta property="og:url" content="@yield('og-url', '{{ Request::url() }}')">
<meta property="og:site_name" content="SITE NAME">
page.blade.php
@extends('app')
@section('title', $article->title . ' | SITE NAME')
@section('og-title', $article->title)
@section('og-image', secure_url('img/news/' . $article->image .'.png'))
Это работает по большей части, но у меня есть пара запросов:
Есть ли способ использовать @yield()
в @yield
?
Я старался <meta property="og:title" content="@yield('og-title', @yield('title'))">
но это не сработало.
Как я могу получить текущий безопасный URL-адрес страницы?
{{ Request::url() }}
возвращается http://example.com/page
, но я хочу https://example.com/page
В качестве мета, пожалуйста, дайте мне знать, если у вас есть какие-либо предложения по улучшению моего текущего метода OG.
Существует простой способ достичь того, что вы хотите. Что вы можете сделать, это переместить метатеги OG html в частичное представление, в которое вы можете передавать параметры на каждой странице по своему усмотрению. Например, в вашем основном макете просто создайте раздел для тегов og:
app.blade.php
<title>@yield('title')</title>
@section('ogtags')
@show
Теперь создайте ваш частичный вид, давайте назовем его:
og_tags.blade.php
<meta property="og:title" content="{{ $title or 'DEFAULT PAGE TITLE' }}">
<meta property="og:image" content="{{ $image or 'default.png' }}">
<meta property="og:url" content="{{ isset($url) ? $url : str_replace('http://', 'https://', Request::url()) }}">
Так что теперь в ваших представлениях вы можете легко добавить теги og, например так:
home.blade.php
@extends('app')
@section('ogtags')
@include('og_tags', ['title' => 'my title', 'image' => 'my-image.png'])
@stop
@section('content')
your content here
@stop
Для безопасного вопроса URL, Request::url()
возвращает текущий URL страницы, если он через HTTPS, он начнется с https://
в противном случае это начнется с http://
, Вот почему я просто заменил его, чтобы всегда быть https
str_replace('http://', 'https://', Request::url())
Если вы хотите всегда иметь og_tags (если ваше представление не определяет этот раздел и вы хотите показывать по умолчанию), вы можете просто изменить свой app.blade.php как это:
<title>@yield('title')</title>
@section('ogtags')
@include('og_tags')
@show
Это классная часть лопасть что вы можете разбить все на более мелкие части, затем включить их в динамические параметры или просто создать составные представления для обработки данных.
Я всегда использую meta.blade.php
и держи мой meta
отдельно от основного макета и не только meta
но также, styles
а также scripts
когда это возможно и включите затем с помощью @include(...)
В любом случае, но как сделать его динамичным? В этом случае я использую такой же подход, как вы, но немного по-другому, что дает мне полную гибкость, чтобы сделать его по-настоящему динамичным. Вот как я это делаю, вероятно, это ответит на то, что вы ищете здесь. Итак, давайте создадим файл meta.blade.php, а мой приведен ниже:
<!-- Title-->
<title>@yield('title', smart('site.title'))</title>
<!-- Meta-->
<meta name="keywords" content="@yield('keywords', getSiteMeta('keywords'))" />
<meta name="description" content="@yield('description', getSiteMeta('description'))" />
<meta name="author" content="@yield('author', getSiteMeta('author'))" />
<!-- CSRF for AJAX-->
<meta name="csrf-token" content="{{ csrf_token() }}" />
уведомление @yield('keywords', getSiteMeta('keywords'))
так вот; getSiteMeta
это вспомогательная функция, которая объявлена в моем app\Helpers\Common.php
файл и функция выглядит так:
/**
* Prapare meta Tags by $name
*
* @param String $metaname Meta Name
* @return Meta Content
*/
function getSiteMeta($name)
{
return smart("site.meta.$name");
}
Также здесь задействована еще одна функция:
/**
* Short cut to config call for smart.php file items
* @param String $str Config Key
* @return String Config Value
*/
function smart($str)
{
return config("smart.$str");
}
На самом деле, у меня есть собственный файл конфигурации на config\smart.php
а также smart
это название моего сайта, поэтому я сохранил все связанные с ним конфиги в config\smart.php
который выглядит так:
// config/smart.php
return [
'site' => [
'name' => 'Smart',
'title' => 'Smart Title',
'tagline' => 'Smart Tag Line',
'meta' => [
'keywords' => 'Smart Keywords',
'language' => 'english',
'description' => '...',
'author' => 'Sheikh Heera'
],
],
'role' => [
'default' => 'genaral', # By default, a user gets this role when registers.
'reserved' => 'superuser' # Application's Admin must have this role assigned.
],
// More...
];
Возможно, у вас есть идея, я могу позвонить smart('key_name')
чтобы получить конфиги моего сайта, чтобы мне не нужно было использовать config('smart.key')
и по умолчанию все meta
значения хранятся в моем config/smart.php
файл, так что если я не использую раздел, как это:
@section('keywords')
Some, Keywords, Here
@stop
Тогда я всегда мои настройки по умолчанию и с помощью вспомогательной функции getSiteMeta
У меня достаточно гибкости, чтобы изменить логику своей функции, например, я могу изменить источник моего по умолчанию meta
теги и можете построить его на лету.
относительно https
это зависит от вашего сайта, если вы использовали защищенный URL (ssl/https
) а также Request::url()
просто возвращает ваш текущий URL, так что если это https
тогда он вернет, что в противном случае вы получите http
,